mirror of https://github.com/xemu-project/xemu.git
target/i386/gdbstub: Factor out gdb_get_reg() and gdb_write_reg()
i386 gdbstub handles both i386 and x86_64. Factor out two functions for reading and writing registers without knowing their bitness. While at it, simplify the TARGET_LONG_BITS == 32 case. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> Message-ID: <20240912093012.402366-4-iii@linux.ibm.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
3674bfadb5
commit
e7a4427aec
|
@ -96,6 +96,19 @@ static int gdb_write_reg_cs64(uint32_t hflags, uint8_t *buf, target_ulong *val)
|
||||||
return 4;
|
return 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int gdb_get_reg(CPUX86State *env, GByteArray *mem_buf, target_ulong val)
|
||||||
|
{
|
||||||
|
if (TARGET_LONG_BITS == 64) {
|
||||||
|
if (env->hflags & HF_CS64_MASK) {
|
||||||
|
return gdb_get_reg64(mem_buf, val);
|
||||||
|
} else {
|
||||||
|
return gdb_get_reg64(mem_buf, val & 0xffffffffUL);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return gdb_get_reg32(mem_buf, val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int x86_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
|
int x86_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
|
||||||
{
|
{
|
||||||
X86CPU *cpu = X86_CPU(cs);
|
X86CPU *cpu = X86_CPU(cs);
|
||||||
|
@ -137,15 +150,7 @@ int x86_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
|
||||||
} else {
|
} else {
|
||||||
switch (n) {
|
switch (n) {
|
||||||
case IDX_IP_REG:
|
case IDX_IP_REG:
|
||||||
if (TARGET_LONG_BITS == 64) {
|
return gdb_get_reg(env, mem_buf, env->eip);
|
||||||
if (env->hflags & HF_CS64_MASK) {
|
|
||||||
return gdb_get_reg64(mem_buf, env->eip);
|
|
||||||
} else {
|
|
||||||
return gdb_get_reg64(mem_buf, env->eip & 0xffffffffUL);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return gdb_get_reg32(mem_buf, env->eip);
|
|
||||||
}
|
|
||||||
case IDX_FLAGS_REG:
|
case IDX_FLAGS_REG:
|
||||||
return gdb_get_reg32(mem_buf, env->eflags);
|
return gdb_get_reg32(mem_buf, env->eflags);
|
||||||
|
|
||||||
|
@ -248,6 +253,21 @@ static int x86_cpu_gdb_load_seg(X86CPU *cpu, X86Seg sreg, uint8_t *mem_buf)
|
||||||
return 4;
|
return 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int gdb_write_reg(CPUX86State *env, uint8_t *mem_buf, target_ulong *val)
|
||||||
|
{
|
||||||
|
if (TARGET_LONG_BITS == 64) {
|
||||||
|
if (env->hflags & HF_CS64_MASK) {
|
||||||
|
*val = ldq_p(mem_buf);
|
||||||
|
} else {
|
||||||
|
*val = ldq_p(mem_buf) & 0xffffffffUL;
|
||||||
|
}
|
||||||
|
return 8;
|
||||||
|
} else {
|
||||||
|
*val = (uint32_t)ldl_p(mem_buf);
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int x86_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
|
int x86_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||||
{
|
{
|
||||||
X86CPU *cpu = X86_CPU(cs);
|
X86CPU *cpu = X86_CPU(cs);
|
||||||
|
@ -288,18 +308,7 @@ int x86_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||||
} else {
|
} else {
|
||||||
switch (n) {
|
switch (n) {
|
||||||
case IDX_IP_REG:
|
case IDX_IP_REG:
|
||||||
if (TARGET_LONG_BITS == 64) {
|
return gdb_write_reg(env, mem_buf, &env->eip);
|
||||||
if (env->hflags & HF_CS64_MASK) {
|
|
||||||
env->eip = ldq_p(mem_buf);
|
|
||||||
} else {
|
|
||||||
env->eip = ldq_p(mem_buf) & 0xffffffffUL;
|
|
||||||
}
|
|
||||||
return 8;
|
|
||||||
} else {
|
|
||||||
env->eip &= ~0xffffffffUL;
|
|
||||||
env->eip |= (uint32_t)ldl_p(mem_buf);
|
|
||||||
return 4;
|
|
||||||
}
|
|
||||||
case IDX_FLAGS_REG:
|
case IDX_FLAGS_REG:
|
||||||
env->eflags = ldl_p(mem_buf);
|
env->eflags = ldl_p(mem_buf);
|
||||||
return 4;
|
return 4;
|
||||||
|
|
Loading…
Reference in New Issue