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:
Thomas Falcon 2014-04-07 17:40:59 -04:00 committed by Alexander Graf
parent 4e2ca12785
commit c46e983106
1 changed files with 71 additions and 34 deletions

View File

@ -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;
} }