target-ppc: extract register length calculation in gdbstub
This patch extracts the method to determine a register's size into a separate function. Reviewed-by: Andreas Färber <afaerber@suse.de> Signed-off-by: Thomas Falcon <tlfalcon@linux.vnet.ibm.com> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
4e2ca12785
commit
c46e983106
@ -21,6 +21,44 @@
|
|||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
#include "exec/gdbstub.h"
|
#include "exec/gdbstub.h"
|
||||||
|
|
||||||
|
static int ppc_gdb_register_len(int n)
|
||||||
|
{
|
||||||
|
switch (n) {
|
||||||
|
case 0 ... 31:
|
||||||
|
/* gprs */
|
||||||
|
return sizeof(target_ulong);
|
||||||
|
case 32 ... 63:
|
||||||
|
/* fprs */
|
||||||
|
if (gdb_has_xml) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 8;
|
||||||
|
case 66:
|
||||||
|
/* cr */
|
||||||
|
return 4;
|
||||||
|
case 64:
|
||||||
|
/* nip */
|
||||||
|
case 65:
|
||||||
|
/* msr */
|
||||||
|
case 67:
|
||||||
|
/* lr */
|
||||||
|
case 68:
|
||||||
|
/* ctr */
|
||||||
|
case 69:
|
||||||
|
/* xer */
|
||||||
|
return sizeof(target_ulong);
|
||||||
|
case 70:
|
||||||
|
/* fpscr */
|
||||||
|
if (gdb_has_xml) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return sizeof(target_ulong);
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Old gdb always expects FP registers. Newer (xml-aware) gdb only
|
/* Old gdb always expects FP registers. Newer (xml-aware) gdb only
|
||||||
* expects whatever the target description contains. Due to a
|
* expects whatever the target description contains. Due to a
|
||||||
* historical mishap the FP registers appear in between core integer
|
* historical mishap the FP registers appear in between core integer
|
||||||
@ -32,23 +70,26 @@ int ppc_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
|||||||
{
|
{
|
||||||
PowerPCCPU *cpu = POWERPC_CPU(cs);
|
PowerPCCPU *cpu = POWERPC_CPU(cs);
|
||||||
CPUPPCState *env = &cpu->env;
|
CPUPPCState *env = &cpu->env;
|
||||||
|
int r = ppc_gdb_register_len(n);
|
||||||
|
|
||||||
|
if (!r) {
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
if (n < 32) {
|
if (n < 32) {
|
||||||
/* gprs */
|
/* gprs */
|
||||||
return gdb_get_regl(mem_buf, env->gpr[n]);
|
gdb_get_regl(mem_buf, env->gpr[n]);
|
||||||
} else if (n < 64) {
|
} else if (n < 64) {
|
||||||
/* fprs */
|
/* fprs */
|
||||||
if (gdb_has_xml) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
stfq_p(mem_buf, env->fpr[n-32]);
|
stfq_p(mem_buf, env->fpr[n-32]);
|
||||||
return 8;
|
|
||||||
} else {
|
} else {
|
||||||
switch (n) {
|
switch (n) {
|
||||||
case 64:
|
case 64:
|
||||||
return gdb_get_regl(mem_buf, env->nip);
|
gdb_get_regl(mem_buf, env->nip);
|
||||||
|
break;
|
||||||
case 65:
|
case 65:
|
||||||
return gdb_get_regl(mem_buf, env->msr);
|
gdb_get_regl(mem_buf, env->msr);
|
||||||
|
break;
|
||||||
case 66:
|
case 66:
|
||||||
{
|
{
|
||||||
uint32_t cr = 0;
|
uint32_t cr = 0;
|
||||||
@ -56,50 +97,49 @@ int ppc_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
|||||||
for (i = 0; i < 8; i++) {
|
for (i = 0; i < 8; i++) {
|
||||||
cr |= env->crf[i] << (32 - ((i + 1) * 4));
|
cr |= env->crf[i] << (32 - ((i + 1) * 4));
|
||||||
}
|
}
|
||||||
return gdb_get_reg32(mem_buf, cr);
|
gdb_get_reg32(mem_buf, cr);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
case 67:
|
case 67:
|
||||||
return gdb_get_regl(mem_buf, env->lr);
|
gdb_get_regl(mem_buf, env->lr);
|
||||||
|
break;
|
||||||
case 68:
|
case 68:
|
||||||
return gdb_get_regl(mem_buf, env->ctr);
|
gdb_get_regl(mem_buf, env->ctr);
|
||||||
|
break;
|
||||||
case 69:
|
case 69:
|
||||||
return gdb_get_regl(mem_buf, env->xer);
|
gdb_get_regl(mem_buf, env->xer);
|
||||||
|
break;
|
||||||
case 70:
|
case 70:
|
||||||
{
|
gdb_get_reg32(mem_buf, env->fpscr);
|
||||||
if (gdb_has_xml) {
|
break;
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return gdb_get_reg32(mem_buf, env->fpscr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ppc_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
|
int ppc_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||||
{
|
{
|
||||||
PowerPCCPU *cpu = POWERPC_CPU(cs);
|
PowerPCCPU *cpu = POWERPC_CPU(cs);
|
||||||
CPUPPCState *env = &cpu->env;
|
CPUPPCState *env = &cpu->env;
|
||||||
|
int r = ppc_gdb_register_len(n);
|
||||||
|
|
||||||
|
if (!r) {
|
||||||
|
return r;
|
||||||
|
}
|
||||||
if (n < 32) {
|
if (n < 32) {
|
||||||
/* gprs */
|
/* gprs */
|
||||||
env->gpr[n] = ldtul_p(mem_buf);
|
env->gpr[n] = ldtul_p(mem_buf);
|
||||||
return sizeof(target_ulong);
|
|
||||||
} else if (n < 64) {
|
} else if (n < 64) {
|
||||||
/* fprs */
|
/* fprs */
|
||||||
if (gdb_has_xml) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
env->fpr[n-32] = ldfq_p(mem_buf);
|
env->fpr[n-32] = ldfq_p(mem_buf);
|
||||||
return 8;
|
|
||||||
} else {
|
} else {
|
||||||
switch (n) {
|
switch (n) {
|
||||||
case 64:
|
case 64:
|
||||||
env->nip = ldtul_p(mem_buf);
|
env->nip = ldtul_p(mem_buf);
|
||||||
return sizeof(target_ulong);
|
break;
|
||||||
case 65:
|
case 65:
|
||||||
ppc_store_msr(env, ldtul_p(mem_buf));
|
ppc_store_msr(env, ldtul_p(mem_buf));
|
||||||
return sizeof(target_ulong);
|
break;
|
||||||
case 66:
|
case 66:
|
||||||
{
|
{
|
||||||
uint32_t cr = ldl_p(mem_buf);
|
uint32_t cr = ldl_p(mem_buf);
|
||||||
@ -107,25 +147,22 @@ int ppc_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
|
|||||||
for (i = 0; i < 8; i++) {
|
for (i = 0; i < 8; i++) {
|
||||||
env->crf[i] = (cr >> (32 - ((i + 1) * 4))) & 0xF;
|
env->crf[i] = (cr >> (32 - ((i + 1) * 4))) & 0xF;
|
||||||
}
|
}
|
||||||
return 4;
|
break;
|
||||||
}
|
}
|
||||||
case 67:
|
case 67:
|
||||||
env->lr = ldtul_p(mem_buf);
|
env->lr = ldtul_p(mem_buf);
|
||||||
return sizeof(target_ulong);
|
break;
|
||||||
case 68:
|
case 68:
|
||||||
env->ctr = ldtul_p(mem_buf);
|
env->ctr = ldtul_p(mem_buf);
|
||||||
return sizeof(target_ulong);
|
break;
|
||||||
case 69:
|
case 69:
|
||||||
env->xer = ldtul_p(mem_buf);
|
env->xer = ldtul_p(mem_buf);
|
||||||
return sizeof(target_ulong);
|
break;
|
||||||
case 70:
|
case 70:
|
||||||
/* fpscr */
|
/* fpscr */
|
||||||
if (gdb_has_xml) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
store_fpscr(env, ldtul_p(mem_buf), 0xffffffff);
|
store_fpscr(env, ldtul_p(mem_buf), 0xffffffff);
|
||||||
return sizeof(target_ulong);
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return r;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user