mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-24 20:19:44 +00:00
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 "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
|
||||
@ -32,23 +70,26 @@ 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;
|
||||
@ -56,50 +97,49 @@ int ppc_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
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);
|
||||
@ -107,25 +147,22 @@ int ppc_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user