Skip to content

Commit

Permalink
target-ppc: extract register length calculation in gdbstub
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
tlfalcon authored and agraf committed Jun 16, 2014
1 parent 4e2ca12 commit c46e983
Showing 1 changed file with 71 additions and 34 deletions.
105 changes: 71 additions & 34 deletions target-ppc/gdbstub.c
Expand Up @@ -21,6 +21,44 @@
#include "qemu-common.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
* expects whatever the target description contains. Due to a
* historical mishap the FP registers appear in between core integer
Expand All @@ -32,100 +70,99 @@ int ppc_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
{
PowerPCCPU *cpu = POWERPC_CPU(cs);
CPUPPCState *env = &cpu->env;
int r = ppc_gdb_register_len(n);

if (!r) {
return r;
}

if (n < 32) {
/* gprs */
return gdb_get_regl(mem_buf, env->gpr[n]);
gdb_get_regl(mem_buf, env->gpr[n]);
} else if (n < 64) {
/* fprs */
if (gdb_has_xml) {
return 0;
}
stfq_p(mem_buf, env->fpr[n-32]);
return 8;
} else {
switch (n) {
case 64:
return gdb_get_regl(mem_buf, env->nip);
gdb_get_regl(mem_buf, env->nip);
break;
case 65:
return gdb_get_regl(mem_buf, env->msr);
gdb_get_regl(mem_buf, env->msr);
break;
case 66:
{
uint32_t cr = 0;
int i;
for (i = 0; i < 8; i++) {
cr |= env->crf[i] << (32 - ((i + 1) * 4));
}
return gdb_get_reg32(mem_buf, cr);
gdb_get_reg32(mem_buf, cr);
break;
}
case 67:
return gdb_get_regl(mem_buf, env->lr);
gdb_get_regl(mem_buf, env->lr);
break;
case 68:
return gdb_get_regl(mem_buf, env->ctr);
gdb_get_regl(mem_buf, env->ctr);
break;
case 69:
return gdb_get_regl(mem_buf, env->xer);
gdb_get_regl(mem_buf, env->xer);
break;
case 70:
{
if (gdb_has_xml) {
return 0;
}
return gdb_get_reg32(mem_buf, env->fpscr);
}
gdb_get_reg32(mem_buf, env->fpscr);
break;
}
}
return 0;
return r;
}

int ppc_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
{
PowerPCCPU *cpu = POWERPC_CPU(cs);
CPUPPCState *env = &cpu->env;
int r = ppc_gdb_register_len(n);

if (!r) {
return r;
}
if (n < 32) {
/* gprs */
env->gpr[n] = ldtul_p(mem_buf);
return sizeof(target_ulong);
} else if (n < 64) {
/* fprs */
if (gdb_has_xml) {
return 0;
}
env->fpr[n-32] = ldfq_p(mem_buf);
return 8;
} else {
switch (n) {
case 64:
env->nip = ldtul_p(mem_buf);
return sizeof(target_ulong);
break;
case 65:
ppc_store_msr(env, ldtul_p(mem_buf));
return sizeof(target_ulong);
break;
case 66:
{
uint32_t cr = ldl_p(mem_buf);
int i;
for (i = 0; i < 8; i++) {
env->crf[i] = (cr >> (32 - ((i + 1) * 4))) & 0xF;
}
return 4;
break;
}
case 67:
env->lr = ldtul_p(mem_buf);
return sizeof(target_ulong);
break;
case 68:
env->ctr = ldtul_p(mem_buf);
return sizeof(target_ulong);
break;
case 69:
env->xer = ldtul_p(mem_buf);
return sizeof(target_ulong);
break;
case 70:
/* fpscr */
if (gdb_has_xml) {
return 0;
}
store_fpscr(env, ldtul_p(mem_buf), 0xffffffff);
return sizeof(target_ulong);
break;
}
}
return 0;
return r;
}

0 comments on commit c46e983

Please sign in to comment.