gdbstub: extend GByteArray to read register helpers
Instead of passing a pointer to memory now just extend the GByteArray to all the read register helpers. They can then safely append their data through the normal way. We don't bother with this abstraction for write registers as we have already ensured the buffer being copied from is the correct size. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Acked-by: David Gibson <david@gibson.dropbear.id.au> Reviewed-by: Damien Hedde <damien.hedde@greensocs.com> Message-Id: <20200316172155.971-15-alex.bennee@linaro.org>
This commit is contained in:
parent
b7b8756a9c
commit
a010bdbe71
20
gdbstub.c
20
gdbstub.c
@ -319,8 +319,8 @@ static int gdb_signal_to_target (int sig)
|
||||
typedef struct GDBRegisterState {
|
||||
int base_reg;
|
||||
int num_regs;
|
||||
gdb_reg_cb get_reg;
|
||||
gdb_reg_cb set_reg;
|
||||
gdb_get_reg_cb get_reg;
|
||||
gdb_set_reg_cb set_reg;
|
||||
const char *xml;
|
||||
struct GDBRegisterState *next;
|
||||
} GDBRegisterState;
|
||||
@ -905,19 +905,19 @@ static const char *get_feature_xml(const char *p, const char **newp,
|
||||
return name ? xml_builtin[i][1] : NULL;
|
||||
}
|
||||
|
||||
static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
|
||||
static int gdb_read_register(CPUState *cpu, GByteArray *buf, int reg)
|
||||
{
|
||||
CPUClass *cc = CPU_GET_CLASS(cpu);
|
||||
CPUArchState *env = cpu->env_ptr;
|
||||
GDBRegisterState *r;
|
||||
|
||||
if (reg < cc->gdb_num_core_regs) {
|
||||
return cc->gdb_read_register(cpu, mem_buf, reg);
|
||||
return cc->gdb_read_register(cpu, buf, reg);
|
||||
}
|
||||
|
||||
for (r = cpu->gdb_regs; r; r = r->next) {
|
||||
if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
|
||||
return r->get_reg(env, mem_buf, reg - r->base_reg);
|
||||
return r->get_reg(env, buf, reg - r->base_reg);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@ -948,7 +948,7 @@ static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
|
||||
*/
|
||||
|
||||
void gdb_register_coprocessor(CPUState *cpu,
|
||||
gdb_reg_cb get_reg, gdb_reg_cb set_reg,
|
||||
gdb_get_reg_cb get_reg, gdb_set_reg_cb set_reg,
|
||||
int num_regs, const char *xml, int g_pos)
|
||||
{
|
||||
GDBRegisterState *s;
|
||||
@ -1739,7 +1739,7 @@ static void handle_get_reg(GdbCmdContext *gdb_ctx, void *user_ctx)
|
||||
}
|
||||
|
||||
reg_size = gdb_read_register(gdbserver_state.g_cpu,
|
||||
gdbserver_state.mem_buf->data,
|
||||
gdbserver_state.mem_buf,
|
||||
gdb_ctx->params[0].val_ull);
|
||||
if (!reg_size) {
|
||||
put_packet("E14");
|
||||
@ -1832,14 +1832,14 @@ static void handle_read_all_regs(GdbCmdContext *gdb_ctx, void *user_ctx)
|
||||
target_ulong addr, len;
|
||||
|
||||
cpu_synchronize_state(gdbserver_state.g_cpu);
|
||||
g_byte_array_set_size(gdbserver_state.mem_buf, 0);
|
||||
len = 0;
|
||||
for (addr = 0; addr < gdbserver_state.g_cpu->gdb_num_g_regs; addr++) {
|
||||
len += gdb_read_register(gdbserver_state.g_cpu,
|
||||
gdbserver_state.mem_buf->data + len,
|
||||
gdbserver_state.mem_buf,
|
||||
addr);
|
||||
}
|
||||
/* FIXME: This is after the fact sizing */
|
||||
g_byte_array_set_size(gdbserver_state.mem_buf, len);
|
||||
g_assert(len == gdbserver_state.mem_buf->len);
|
||||
|
||||
memtohex(gdbserver_state.str_buf, gdbserver_state.mem_buf->data, len);
|
||||
put_strbuf();
|
||||
|
@ -177,7 +177,7 @@ static int cpu_common_write_elf64_note(WriteCoreDumpFunction f,
|
||||
}
|
||||
|
||||
|
||||
static int cpu_common_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg)
|
||||
static int cpu_common_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
@ -68,53 +68,76 @@ void gdb_signalled(CPUArchState *, int);
|
||||
void gdbserver_fork(CPUState *);
|
||||
#endif
|
||||
/* Get or set a register. Returns the size of the register. */
|
||||
typedef int (*gdb_reg_cb)(CPUArchState *env, uint8_t *buf, int reg);
|
||||
typedef int (*gdb_get_reg_cb)(CPUArchState *env, GByteArray *buf, int reg);
|
||||
typedef int (*gdb_set_reg_cb)(CPUArchState *env, uint8_t *buf, int reg);
|
||||
void gdb_register_coprocessor(CPUState *cpu,
|
||||
gdb_reg_cb get_reg, gdb_reg_cb set_reg,
|
||||
gdb_get_reg_cb get_reg, gdb_set_reg_cb set_reg,
|
||||
int num_regs, const char *xml, int g_pos);
|
||||
|
||||
/* The GDB remote protocol transfers values in target byte order. This means
|
||||
* we can use the raw memory access routines to access the value buffer.
|
||||
* Conveniently, these also handle the case where the buffer is mis-aligned.
|
||||
/*
|
||||
* The GDB remote protocol transfers values in target byte order. As
|
||||
* the gdbstub may be batching up several register values we always
|
||||
* append to the array.
|
||||
*/
|
||||
|
||||
static inline int gdb_get_reg8(uint8_t *mem_buf, uint8_t val)
|
||||
static inline int gdb_get_reg8(GByteArray *buf, uint8_t val)
|
||||
{
|
||||
stb_p(mem_buf, val);
|
||||
g_byte_array_append(buf, &val, 1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int gdb_get_reg16(uint8_t *mem_buf, uint16_t val)
|
||||
static inline int gdb_get_reg16(GByteArray *buf, uint16_t val)
|
||||
{
|
||||
stw_p(mem_buf, val);
|
||||
uint16_t to_word = tswap16(val);
|
||||
g_byte_array_append(buf, (uint8_t *) &to_word, 2);
|
||||
return 2;
|
||||
}
|
||||
|
||||
static inline int gdb_get_reg32(uint8_t *mem_buf, uint32_t val)
|
||||
static inline int gdb_get_reg32(GByteArray *buf, uint32_t val)
|
||||
{
|
||||
stl_p(mem_buf, val);
|
||||
uint32_t to_long = tswap32(val);
|
||||
g_byte_array_append(buf, (uint8_t *) &to_long, 4);
|
||||
return 4;
|
||||
}
|
||||
|
||||
static inline int gdb_get_reg64(uint8_t *mem_buf, uint64_t val)
|
||||
static inline int gdb_get_reg64(GByteArray *buf, uint64_t val)
|
||||
{
|
||||
stq_p(mem_buf, val);
|
||||
uint64_t to_quad = tswap64(val);
|
||||
g_byte_array_append(buf, (uint8_t *) &to_quad, 8);
|
||||
return 8;
|
||||
}
|
||||
|
||||
static inline int gdb_get_reg128(uint8_t *mem_buf, uint64_t val_hi,
|
||||
static inline int gdb_get_reg128(GByteArray *buf, uint64_t val_hi,
|
||||
uint64_t val_lo)
|
||||
{
|
||||
uint64_t to_quad;
|
||||
#ifdef TARGET_WORDS_BIGENDIAN
|
||||
stq_p(mem_buf, val_hi);
|
||||
stq_p(mem_buf + 8, val_lo);
|
||||
to_quad = tswap64(val_hi);
|
||||
g_byte_array_append(buf, (uint8_t *) &to_quad, 8);
|
||||
to_quad = tswap64(val_lo);
|
||||
g_byte_array_append(buf, (uint8_t *) &to_quad, 8);
|
||||
#else
|
||||
stq_p(mem_buf, val_lo);
|
||||
stq_p(mem_buf + 8, val_hi);
|
||||
to_quad = tswap64(val_lo);
|
||||
g_byte_array_append(buf, (uint8_t *) &to_quad, 8);
|
||||
to_quad = tswap64(val_hi);
|
||||
g_byte_array_append(buf, (uint8_t *) &to_quad, 8);
|
||||
#endif
|
||||
return 16;
|
||||
}
|
||||
|
||||
/**
|
||||
* gdb_get_reg_ptr: get pointer to start of last element
|
||||
* @len: length of element
|
||||
*
|
||||
* This is a helper function to extract the pointer to the last
|
||||
* element for additional processing. Some front-ends do additional
|
||||
* dynamic swapping of the elements based on CPU state.
|
||||
*/
|
||||
static inline uint8_t * gdb_get_reg_ptr(GByteArray *buf, int len)
|
||||
{
|
||||
return buf->data + buf->len - len;
|
||||
}
|
||||
|
||||
#if TARGET_LONG_BITS == 64
|
||||
#define gdb_get_regl(buf, val) gdb_get_reg64(buf, val)
|
||||
#define ldtul_p(addr) ldq_p(addr)
|
||||
|
@ -195,7 +195,7 @@ typedef struct CPUClass {
|
||||
hwaddr (*get_phys_page_attrs_debug)(CPUState *cpu, vaddr addr,
|
||||
MemTxAttrs *attrs);
|
||||
int (*asidx_from_attrs)(CPUState *cpu, MemTxAttrs attrs);
|
||||
int (*gdb_read_register)(CPUState *cpu, uint8_t *buf, int reg);
|
||||
int (*gdb_read_register)(CPUState *cpu, GByteArray *buf, int reg);
|
||||
int (*gdb_write_register)(CPUState *cpu, uint8_t *buf, int reg);
|
||||
bool (*debug_check_watchpoint)(CPUState *cpu, CPUWatchpoint *wp);
|
||||
void (*debug_excp_handler)(CPUState *cpu);
|
||||
|
@ -280,7 +280,7 @@ void alpha_cpu_do_interrupt(CPUState *cpu);
|
||||
bool alpha_cpu_exec_interrupt(CPUState *cpu, int int_req);
|
||||
void alpha_cpu_dump_state(CPUState *cs, FILE *f, int flags);
|
||||
hwaddr alpha_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
|
||||
int alpha_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
int alpha_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
|
||||
int alpha_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
void alpha_cpu_do_unaligned_access(CPUState *cpu, vaddr addr,
|
||||
MMUAccessType access_type,
|
||||
|
@ -21,7 +21,7 @@
|
||||
#include "cpu.h"
|
||||
#include "exec/gdbstub.h"
|
||||
|
||||
int alpha_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
int alpha_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
|
||||
{
|
||||
AlphaCPU *cpu = ALPHA_CPU(cs);
|
||||
CPUAlphaState *env = &cpu->env;
|
||||
|
@ -968,7 +968,7 @@ bool arm_cpu_exec_interrupt(CPUState *cpu, int int_req);
|
||||
hwaddr arm_cpu_get_phys_page_attrs_debug(CPUState *cpu, vaddr addr,
|
||||
MemTxAttrs *attrs);
|
||||
|
||||
int arm_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
int arm_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
|
||||
int arm_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
|
||||
/* Dynamically generates for gdb stub an XML description of the sysregs from
|
||||
@ -988,7 +988,7 @@ int arm_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||
int cpuid, void *opaque);
|
||||
|
||||
#ifdef TARGET_AARCH64
|
||||
int aarch64_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
int aarch64_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
|
||||
int aarch64_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
void aarch64_sve_narrow_vq(CPUARMState *env, unsigned vq);
|
||||
void aarch64_sve_change_el(CPUARMState *env, int old_el,
|
||||
|
@ -32,7 +32,7 @@ typedef struct RegisterSysregXmlParam {
|
||||
We hack round this by giving the FPA regs zero size when talking to a
|
||||
newer gdb. */
|
||||
|
||||
int arm_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
int arm_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
|
||||
{
|
||||
ARMCPU *cpu = ARM_CPU(cs);
|
||||
CPUARMState *env = &cpu->env;
|
||||
|
@ -20,7 +20,7 @@
|
||||
#include "cpu.h"
|
||||
#include "exec/gdbstub.h"
|
||||
|
||||
int aarch64_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
int aarch64_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
|
||||
{
|
||||
ARMCPU *cpu = ARM_CPU(cs);
|
||||
CPUARMState *env = &cpu->env;
|
||||
|
@ -48,30 +48,27 @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
|
||||
|
||||
static void switch_mode(CPUARMState *env, int mode);
|
||||
|
||||
static int vfp_gdb_get_reg(CPUARMState *env, uint8_t *buf, int reg)
|
||||
static int vfp_gdb_get_reg(CPUARMState *env, GByteArray *buf, int reg)
|
||||
{
|
||||
ARMCPU *cpu = env_archcpu(env);
|
||||
int nregs = cpu_isar_feature(aa32_simd_r32, cpu) ? 32 : 16;
|
||||
|
||||
/* VFP data registers are always little-endian. */
|
||||
if (reg < nregs) {
|
||||
stq_le_p(buf, *aa32_vfp_dreg(env, reg));
|
||||
return 8;
|
||||
return gdb_get_reg64(buf, *aa32_vfp_dreg(env, reg));
|
||||
}
|
||||
if (arm_feature(env, ARM_FEATURE_NEON)) {
|
||||
/* Aliases for Q regs. */
|
||||
nregs += 16;
|
||||
if (reg < nregs) {
|
||||
uint64_t *q = aa32_vfp_qreg(env, reg - 32);
|
||||
stq_le_p(buf, q[0]);
|
||||
stq_le_p(buf + 8, q[1]);
|
||||
return 16;
|
||||
return gdb_get_reg128(buf, q[0], q[1]);
|
||||
}
|
||||
}
|
||||
switch (reg - nregs) {
|
||||
case 0: stl_p(buf, env->vfp.xregs[ARM_VFP_FPSID]); return 4;
|
||||
case 1: stl_p(buf, vfp_get_fpscr(env)); return 4;
|
||||
case 2: stl_p(buf, env->vfp.xregs[ARM_VFP_FPEXC]); return 4;
|
||||
case 0: return gdb_get_reg32(buf, env->vfp.xregs[ARM_VFP_FPSID]); break;
|
||||
case 1: return gdb_get_reg32(buf, vfp_get_fpscr(env)); break;
|
||||
case 2: return gdb_get_reg32(buf, env->vfp.xregs[ARM_VFP_FPEXC]); break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -102,7 +99,7 @@ static int vfp_gdb_set_reg(CPUARMState *env, uint8_t *buf, int reg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int aarch64_fpu_gdb_get_reg(CPUARMState *env, uint8_t *buf, int reg)
|
||||
static int aarch64_fpu_gdb_get_reg(CPUARMState *env, GByteArray *buf, int reg)
|
||||
{
|
||||
switch (reg) {
|
||||
case 0 ... 31:
|
||||
@ -205,7 +202,7 @@ static void write_raw_cp_reg(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||
}
|
||||
}
|
||||
|
||||
static int arm_gdb_get_sysreg(CPUARMState *env, uint8_t *buf, int reg)
|
||||
static int arm_gdb_get_sysreg(CPUARMState *env, GByteArray *buf, int reg)
|
||||
{
|
||||
ARMCPU *cpu = env_archcpu(env);
|
||||
const ARMCPRegInfo *ri;
|
||||
|
@ -195,8 +195,8 @@ void cris_cpu_dump_state(CPUState *cs, FILE *f, int flags);
|
||||
|
||||
hwaddr cris_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
|
||||
|
||||
int crisv10_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
int cris_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
int crisv10_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
|
||||
int cris_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
|
||||
int cris_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
|
||||
/* you can call this signal handler from your SIGBUS and SIGSEGV
|
||||
|
@ -21,7 +21,7 @@
|
||||
#include "cpu.h"
|
||||
#include "exec/gdbstub.h"
|
||||
|
||||
int crisv10_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
int crisv10_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
|
||||
{
|
||||
CRISCPU *cpu = CRIS_CPU(cs);
|
||||
CPUCRISState *env = &cpu->env;
|
||||
@ -53,7 +53,7 @@ int crisv10_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cris_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
int cris_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
|
||||
{
|
||||
CRISCPU *cpu = CRIS_CPU(cs);
|
||||
CPUCRISState *env = &cpu->env;
|
||||
|
@ -321,7 +321,7 @@ void cpu_hppa_change_prot_id(CPUHPPAState *env);
|
||||
|
||||
int cpu_hppa_signal_handler(int host_signum, void *pinfo, void *puc);
|
||||
hwaddr hppa_cpu_get_phys_page_debug(CPUState *cs, vaddr addr);
|
||||
int hppa_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
int hppa_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
|
||||
int hppa_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
void hppa_cpu_do_interrupt(CPUState *cpu);
|
||||
bool hppa_cpu_exec_interrupt(CPUState *cpu, int int_req);
|
||||
|
@ -21,7 +21,7 @@
|
||||
#include "cpu.h"
|
||||
#include "exec/gdbstub.h"
|
||||
|
||||
int hppa_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
int hppa_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
|
||||
{
|
||||
HPPACPU *cpu = HPPA_CPU(cs);
|
||||
CPUHPPAState *env = &cpu->env;
|
||||
|
@ -1766,7 +1766,7 @@ void x86_cpu_dump_state(CPUState *cs, FILE *f, int flags);
|
||||
hwaddr x86_cpu_get_phys_page_attrs_debug(CPUState *cpu, vaddr addr,
|
||||
MemTxAttrs *attrs);
|
||||
|
||||
int x86_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
int x86_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
|
||||
int x86_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
|
||||
void x86_cpu_exec_enter(CPUState *cpu);
|
||||
|
@ -79,7 +79,7 @@ static const int gpr_map32[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
|
||||
#endif
|
||||
|
||||
|
||||
int x86_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
int x86_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
|
||||
{
|
||||
X86CPU *cpu = X86_CPU(cs);
|
||||
CPUX86State *env = &cpu->env;
|
||||
|
@ -202,7 +202,7 @@ void lm32_cpu_do_interrupt(CPUState *cpu);
|
||||
bool lm32_cpu_exec_interrupt(CPUState *cs, int int_req);
|
||||
void lm32_cpu_dump_state(CPUState *cpu, FILE *f, int flags);
|
||||
hwaddr lm32_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
|
||||
int lm32_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
int lm32_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
|
||||
int lm32_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
|
||||
typedef enum {
|
||||
|
@ -22,7 +22,7 @@
|
||||
#include "exec/gdbstub.h"
|
||||
#include "hw/lm32/lm32_pic.h"
|
||||
|
||||
int lm32_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
int lm32_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
|
||||
{
|
||||
LM32CPU *cpu = LM32_CPU(cs);
|
||||
CPULM32State *env = &cpu->env;
|
||||
|
@ -168,7 +168,7 @@ void m68k_cpu_do_interrupt(CPUState *cpu);
|
||||
bool m68k_cpu_exec_interrupt(CPUState *cpu, int int_req);
|
||||
void m68k_cpu_dump_state(CPUState *cpu, FILE *f, int flags);
|
||||
hwaddr m68k_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
|
||||
int m68k_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
int m68k_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
|
||||
int m68k_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
|
||||
void m68k_tcg_init(void);
|
||||
|
@ -21,7 +21,7 @@
|
||||
#include "cpu.h"
|
||||
#include "exec/gdbstub.h"
|
||||
|
||||
int m68k_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
int m68k_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
|
||||
{
|
||||
M68kCPU *cpu = M68K_CPU(cs);
|
||||
CPUM68KState *env = &cpu->env;
|
||||
|
@ -68,7 +68,7 @@ void m68k_cpu_list(void)
|
||||
g_slist_free(list);
|
||||
}
|
||||
|
||||
static int cf_fpu_gdb_get_reg(CPUM68KState *env, uint8_t *mem_buf, int n)
|
||||
static int cf_fpu_gdb_get_reg(CPUM68KState *env, GByteArray *mem_buf, int n)
|
||||
{
|
||||
if (n < 8) {
|
||||
float_status s;
|
||||
@ -105,7 +105,7 @@ static int cf_fpu_gdb_set_reg(CPUM68KState *env, uint8_t *mem_buf, int n)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int m68k_fpu_gdb_get_reg(CPUM68KState *env, uint8_t *mem_buf, int n)
|
||||
static int m68k_fpu_gdb_get_reg(CPUM68KState *env, GByteArray *mem_buf, int n)
|
||||
{
|
||||
if (n < 8) {
|
||||
int len = gdb_get_reg16(mem_buf, env->fregs[n].l.upper);
|
||||
|
@ -313,7 +313,7 @@ void mb_cpu_do_interrupt(CPUState *cs);
|
||||
bool mb_cpu_exec_interrupt(CPUState *cs, int int_req);
|
||||
void mb_cpu_dump_state(CPUState *cpu, FILE *f, int flags);
|
||||
hwaddr mb_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
|
||||
int mb_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
int mb_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
|
||||
int mb_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
|
||||
void mb_tcg_init(void);
|
||||
|
@ -21,7 +21,7 @@
|
||||
#include "cpu.h"
|
||||
#include "exec/gdbstub.h"
|
||||
|
||||
int mb_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
int mb_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
|
||||
{
|
||||
MicroBlazeCPU *cpu = MICROBLAZE_CPU(cs);
|
||||
CPUMBState *env = &cpu->env;
|
||||
|
@ -22,7 +22,7 @@
|
||||
#include "internal.h"
|
||||
#include "exec/gdbstub.h"
|
||||
|
||||
int mips_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
int mips_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
|
||||
{
|
||||
MIPSCPU *cpu = MIPS_CPU(cs);
|
||||
CPUMIPSState *env = &cpu->env;
|
||||
|
@ -82,7 +82,7 @@ void mips_cpu_do_interrupt(CPUState *cpu);
|
||||
bool mips_cpu_exec_interrupt(CPUState *cpu, int int_req);
|
||||
void mips_cpu_dump_state(CPUState *cpu, FILE *f, int flags);
|
||||
hwaddr mips_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
|
||||
int mips_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
int mips_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
|
||||
int mips_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
void mips_cpu_do_unaligned_access(CPUState *cpu, vaddr addr,
|
||||
MMUAccessType access_type,
|
||||
|
@ -124,7 +124,7 @@ static void nios2_cpu_disas_set_info(CPUState *cpu, disassemble_info *info)
|
||||
#endif
|
||||
}
|
||||
|
||||
static int nios2_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
static int nios2_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
|
||||
{
|
||||
Nios2CPU *cpu = NIOS2_CPU(cs);
|
||||
CPUClass *cc = CPU_GET_CLASS(cs);
|
||||
|
@ -320,7 +320,7 @@ void openrisc_cpu_do_interrupt(CPUState *cpu);
|
||||
bool openrisc_cpu_exec_interrupt(CPUState *cpu, int int_req);
|
||||
void openrisc_cpu_dump_state(CPUState *cpu, FILE *f, int flags);
|
||||
hwaddr openrisc_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
|
||||
int openrisc_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
int openrisc_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
|
||||
int openrisc_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
void openrisc_translate_init(void);
|
||||
bool openrisc_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
|
||||
|
@ -21,7 +21,7 @@
|
||||
#include "cpu.h"
|
||||
#include "exec/gdbstub.h"
|
||||
|
||||
int openrisc_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
int openrisc_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
|
||||
{
|
||||
OpenRISCCPU *cpu = OPENRISC_CPU(cs);
|
||||
CPUOpenRISCState *env = &cpu->env;
|
||||
|
@ -1218,8 +1218,8 @@ bool ppc_cpu_exec_interrupt(CPUState *cpu, int int_req);
|
||||
void ppc_cpu_dump_state(CPUState *cpu, FILE *f, int flags);
|
||||
void ppc_cpu_dump_statistics(CPUState *cpu, int flags);
|
||||
hwaddr ppc_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
|
||||
int ppc_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
int ppc_cpu_gdb_read_register_apple(CPUState *cpu, uint8_t *buf, int reg);
|
||||
int ppc_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
|
||||
int ppc_cpu_gdb_read_register_apple(CPUState *cpu, GByteArray *buf, int reg);
|
||||
int ppc_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
int ppc_cpu_gdb_write_register_apple(CPUState *cpu, uint8_t *buf, int reg);
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
|
@ -114,10 +114,11 @@ void ppc_maybe_bswap_register(CPUPPCState *env, uint8_t *mem_buf, int len)
|
||||
* the FP regs zero size when talking to a newer gdb.
|
||||
*/
|
||||
|
||||
int ppc_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
int ppc_cpu_gdb_read_register(CPUState *cs, GByteArray *buf, int n)
|
||||
{
|
||||
PowerPCCPU *cpu = POWERPC_CPU(cs);
|
||||
CPUPPCState *env = &cpu->env;
|
||||
uint8_t *mem_buf;
|
||||
int r = ppc_gdb_register_len(n);
|
||||
|
||||
if (!r) {
|
||||
@ -126,17 +127,17 @@ int ppc_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
|
||||
if (n < 32) {
|
||||
/* gprs */
|
||||
gdb_get_regl(mem_buf, env->gpr[n]);
|
||||
gdb_get_regl(buf, env->gpr[n]);
|
||||
} else if (n < 64) {
|
||||
/* fprs */
|
||||
stfq_p(mem_buf, *cpu_fpr_ptr(env, n - 32));
|
||||
gdb_get_reg64(buf, *cpu_fpr_ptr(env, n - 32));
|
||||
} else {
|
||||
switch (n) {
|
||||
case 64:
|
||||
gdb_get_regl(mem_buf, env->nip);
|
||||
gdb_get_regl(buf, env->nip);
|
||||
break;
|
||||
case 65:
|
||||
gdb_get_regl(mem_buf, env->msr);
|
||||
gdb_get_regl(buf, env->msr);
|
||||
break;
|
||||
case 66:
|
||||
{
|
||||
@ -145,31 +146,33 @@ 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));
|
||||
}
|
||||
gdb_get_reg32(mem_buf, cr);
|
||||
gdb_get_reg32(buf, cr);
|
||||
break;
|
||||
}
|
||||
case 67:
|
||||
gdb_get_regl(mem_buf, env->lr);
|
||||
gdb_get_regl(buf, env->lr);
|
||||
break;
|
||||
case 68:
|
||||
gdb_get_regl(mem_buf, env->ctr);
|
||||
gdb_get_regl(buf, env->ctr);
|
||||
break;
|
||||
case 69:
|
||||
gdb_get_reg32(mem_buf, env->xer);
|
||||
gdb_get_reg32(buf, env->xer);
|
||||
break;
|
||||
case 70:
|
||||
gdb_get_reg32(mem_buf, env->fpscr);
|
||||
gdb_get_reg32(buf, env->fpscr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
mem_buf = buf->data + buf->len - r;
|
||||
ppc_maybe_bswap_register(env, mem_buf, r);
|
||||
return r;
|
||||
}
|
||||
|
||||
int ppc_cpu_gdb_read_register_apple(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
int ppc_cpu_gdb_read_register_apple(CPUState *cs, GByteArray *buf, int n)
|
||||
{
|
||||
PowerPCCPU *cpu = POWERPC_CPU(cs);
|
||||
CPUPPCState *env = &cpu->env;
|
||||
uint8_t *mem_buf;
|
||||
int r = ppc_gdb_register_len_apple(n);
|
||||
|
||||
if (!r) {
|
||||
@ -178,21 +181,21 @@ int ppc_cpu_gdb_read_register_apple(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
|
||||
if (n < 32) {
|
||||
/* gprs */
|
||||
gdb_get_reg64(mem_buf, env->gpr[n]);
|
||||
gdb_get_reg64(buf, env->gpr[n]);
|
||||
} else if (n < 64) {
|
||||
/* fprs */
|
||||
stfq_p(mem_buf, *cpu_fpr_ptr(env, n - 32));
|
||||
gdb_get_reg64(buf, *cpu_fpr_ptr(env, n - 32));
|
||||
} else if (n < 96) {
|
||||
/* Altivec */
|
||||
stq_p(mem_buf, n - 64);
|
||||
stq_p(mem_buf + 8, 0);
|
||||
gdb_get_reg64(buf, n - 64);
|
||||
gdb_get_reg64(buf, 0);
|
||||
} else {
|
||||
switch (n) {
|
||||
case 64 + 32:
|
||||
gdb_get_reg64(mem_buf, env->nip);
|
||||
gdb_get_reg64(buf, env->nip);
|
||||
break;
|
||||
case 65 + 32:
|
||||
gdb_get_reg64(mem_buf, env->msr);
|
||||
gdb_get_reg64(buf, env->msr);
|
||||
break;
|
||||
case 66 + 32:
|
||||
{
|
||||
@ -201,23 +204,24 @@ int ppc_cpu_gdb_read_register_apple(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
for (i = 0; i < 8; i++) {
|
||||
cr |= env->crf[i] << (32 - ((i + 1) * 4));
|
||||
}
|
||||
gdb_get_reg32(mem_buf, cr);
|
||||
gdb_get_reg32(buf, cr);
|
||||
break;
|
||||
}
|
||||
case 67 + 32:
|
||||
gdb_get_reg64(mem_buf, env->lr);
|
||||
gdb_get_reg64(buf, env->lr);
|
||||
break;
|
||||
case 68 + 32:
|
||||
gdb_get_reg64(mem_buf, env->ctr);
|
||||
gdb_get_reg64(buf, env->ctr);
|
||||
break;
|
||||
case 69 + 32:
|
||||
gdb_get_reg32(mem_buf, env->xer);
|
||||
gdb_get_reg32(buf, env->xer);
|
||||
break;
|
||||
case 70 + 32:
|
||||
gdb_get_reg64(mem_buf, env->fpscr);
|
||||
gdb_get_reg64(buf, env->fpscr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
mem_buf = buf->data + buf->len - r;
|
||||
ppc_maybe_bswap_register(env, mem_buf, r);
|
||||
return r;
|
||||
}
|
||||
|
@ -9857,7 +9857,7 @@ static int gdb_find_spr_idx(CPUPPCState *env, int n)
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int gdb_get_spr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
|
||||
static int gdb_get_spr_reg(CPUPPCState *env, GByteArray *buf, int n)
|
||||
{
|
||||
int reg;
|
||||
int len;
|
||||
@ -9868,8 +9868,8 @@ static int gdb_get_spr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
|
||||
}
|
||||
|
||||
len = TARGET_LONG_SIZE;
|
||||
stn_p(mem_buf, len, env->spr[reg]);
|
||||
ppc_maybe_bswap_register(env, mem_buf, len);
|
||||
gdb_get_regl(buf, env->spr[reg]);
|
||||
ppc_maybe_bswap_register(env, gdb_get_reg_ptr(buf, len), len);
|
||||
return len;
|
||||
}
|
||||
|
||||
@ -9891,15 +9891,18 @@ static int gdb_set_spr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
|
||||
}
|
||||
#endif
|
||||
|
||||
static int gdb_get_float_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
|
||||
static int gdb_get_float_reg(CPUPPCState *env, GByteArray *buf, int n)
|
||||
{
|
||||
uint8_t *mem_buf;
|
||||
if (n < 32) {
|
||||
stfq_p(mem_buf, *cpu_fpr_ptr(env, n));
|
||||
gdb_get_reg64(buf, *cpu_fpr_ptr(env, n));
|
||||
mem_buf = gdb_get_reg_ptr(buf, 8);
|
||||
ppc_maybe_bswap_register(env, mem_buf, 8);
|
||||
return 8;
|
||||
}
|
||||
if (n == 32) {
|
||||
stl_p(mem_buf, env->fpscr);
|
||||
gdb_get_reg32(buf, env->fpscr);
|
||||
mem_buf = gdb_get_reg_ptr(buf, 4);
|
||||
ppc_maybe_bswap_register(env, mem_buf, 4);
|
||||
return 4;
|
||||
}
|
||||
@ -9921,28 +9924,31 @@ static int gdb_set_float_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gdb_get_avr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
|
||||
static int gdb_get_avr_reg(CPUPPCState *env, GByteArray *buf, int n)
|
||||
{
|
||||
uint8_t *mem_buf;
|
||||
|
||||
if (n < 32) {
|
||||
ppc_avr_t *avr = cpu_avr_ptr(env, n);
|
||||
if (!avr_need_swap(env)) {
|
||||
stq_p(mem_buf, avr->u64[0]);
|
||||
stq_p(mem_buf + 8, avr->u64[1]);
|
||||
gdb_get_reg128(buf, avr->u64[0] , avr->u64[1]);
|
||||
} else {
|
||||
stq_p(mem_buf, avr->u64[1]);
|
||||
stq_p(mem_buf + 8, avr->u64[0]);
|
||||
gdb_get_reg128(buf, avr->u64[1] , avr->u64[0]);
|
||||
}
|
||||
mem_buf = gdb_get_reg_ptr(buf, 16);
|
||||
ppc_maybe_bswap_register(env, mem_buf, 8);
|
||||
ppc_maybe_bswap_register(env, mem_buf + 8, 8);
|
||||
return 16;
|
||||
}
|
||||
if (n == 32) {
|
||||
stl_p(mem_buf, helper_mfvscr(env));
|
||||
gdb_get_reg32(buf, helper_mfvscr(env));
|
||||
mem_buf = gdb_get_reg_ptr(buf, 4);
|
||||
ppc_maybe_bswap_register(env, mem_buf, 4);
|
||||
return 4;
|
||||
}
|
||||
if (n == 33) {
|
||||
stl_p(mem_buf, (uint32_t)env->spr[SPR_VRSAVE]);
|
||||
gdb_get_reg32(buf, (uint32_t)env->spr[SPR_VRSAVE]);
|
||||
mem_buf = gdb_get_reg_ptr(buf, 4);
|
||||
ppc_maybe_bswap_register(env, mem_buf, 4);
|
||||
return 4;
|
||||
}
|
||||
@ -9977,25 +9983,25 @@ static int gdb_set_avr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gdb_get_spe_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
|
||||
static int gdb_get_spe_reg(CPUPPCState *env, GByteArray *buf, int n)
|
||||
{
|
||||
if (n < 32) {
|
||||
#if defined(TARGET_PPC64)
|
||||
stl_p(mem_buf, env->gpr[n] >> 32);
|
||||
ppc_maybe_bswap_register(env, mem_buf, 4);
|
||||
gdb_get_reg32(buf, env->gpr[n] >> 32);
|
||||
ppc_maybe_bswap_register(env, gdb_get_reg_ptr(buf, 4), 4);
|
||||
#else
|
||||
stl_p(mem_buf, env->gprh[n]);
|
||||
gdb_get_reg32(buf, env->gprh[n]);
|
||||
#endif
|
||||
return 4;
|
||||
}
|
||||
if (n == 32) {
|
||||
stq_p(mem_buf, env->spe_acc);
|
||||
ppc_maybe_bswap_register(env, mem_buf, 8);
|
||||
gdb_get_reg64(buf, env->spe_acc);
|
||||
ppc_maybe_bswap_register(env, gdb_get_reg_ptr(buf, 8), 8);
|
||||
return 8;
|
||||
}
|
||||
if (n == 33) {
|
||||
stl_p(mem_buf, env->spe_fscr);
|
||||
ppc_maybe_bswap_register(env, mem_buf, 4);
|
||||
gdb_get_reg32(buf, env->spe_fscr);
|
||||
ppc_maybe_bswap_register(env, gdb_get_reg_ptr(buf, 4), 4);
|
||||
return 4;
|
||||
}
|
||||
return 0;
|
||||
@ -10030,11 +10036,11 @@ static int gdb_set_spe_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gdb_get_vsx_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
|
||||
static int gdb_get_vsx_reg(CPUPPCState *env, GByteArray *buf, int n)
|
||||
{
|
||||
if (n < 32) {
|
||||
stq_p(mem_buf, *cpu_vsrl_ptr(env, n));
|
||||
ppc_maybe_bswap_register(env, mem_buf, 8);
|
||||
gdb_get_reg64(buf, *cpu_vsrl_ptr(env, n));
|
||||
ppc_maybe_bswap_register(env, gdb_get_reg_ptr(buf, 8), 8);
|
||||
return 8;
|
||||
}
|
||||
return 0;
|
||||
|
@ -293,7 +293,7 @@ extern const char * const riscv_excp_names[];
|
||||
extern const char * const riscv_intr_names[];
|
||||
|
||||
void riscv_cpu_do_interrupt(CPUState *cpu);
|
||||
int riscv_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
int riscv_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
|
||||
int riscv_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
bool riscv_cpu_exec_interrupt(CPUState *cs, int interrupt_request);
|
||||
bool riscv_cpu_fp_enabled(CPURISCVState *env);
|
||||
|
@ -270,7 +270,7 @@ static int csr_register_map[] = {
|
||||
CSR_MHCOUNTEREN,
|
||||
};
|
||||
|
||||
int riscv_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
int riscv_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
|
||||
{
|
||||
RISCVCPU *cpu = RISCV_CPU(cs);
|
||||
CPURISCVState *env = &cpu->env;
|
||||
@ -301,14 +301,14 @@ int riscv_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int riscv_gdb_get_fpu(CPURISCVState *env, uint8_t *mem_buf, int n)
|
||||
static int riscv_gdb_get_fpu(CPURISCVState *env, GByteArray *buf, int n)
|
||||
{
|
||||
if (n < 32) {
|
||||
if (env->misa & RVD) {
|
||||
return gdb_get_reg64(mem_buf, env->fpr[n]);
|
||||
return gdb_get_reg64(buf, env->fpr[n]);
|
||||
}
|
||||
if (env->misa & RVF) {
|
||||
return gdb_get_reg32(mem_buf, env->fpr[n]);
|
||||
return gdb_get_reg32(buf, env->fpr[n]);
|
||||
}
|
||||
/* there is hole between ft11 and fflags in fpu.xml */
|
||||
} else if (n < 36 && n > 32) {
|
||||
@ -322,7 +322,7 @@ static int riscv_gdb_get_fpu(CPURISCVState *env, uint8_t *mem_buf, int n)
|
||||
result = riscv_csrrw_debug(env, n - 33 + csr_register_map[8], &val,
|
||||
0, 0);
|
||||
if (result == 0) {
|
||||
return gdb_get_regl(mem_buf, val);
|
||||
return gdb_get_regl(buf, val);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@ -351,7 +351,7 @@ static int riscv_gdb_set_fpu(CPURISCVState *env, uint8_t *mem_buf, int n)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int riscv_gdb_get_csr(CPURISCVState *env, uint8_t *mem_buf, int n)
|
||||
static int riscv_gdb_get_csr(CPURISCVState *env, GByteArray *buf, int n)
|
||||
{
|
||||
if (n < ARRAY_SIZE(csr_register_map)) {
|
||||
target_ulong val = 0;
|
||||
@ -359,7 +359,7 @@ static int riscv_gdb_get_csr(CPURISCVState *env, uint8_t *mem_buf, int n)
|
||||
|
||||
result = riscv_csrrw_debug(env, csr_register_map[n], &val, 0, 0);
|
||||
if (result == 0) {
|
||||
return gdb_get_regl(mem_buf, val);
|
||||
return gdb_get_regl(buf, val);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@ -379,13 +379,13 @@ static int riscv_gdb_set_csr(CPURISCVState *env, uint8_t *mem_buf, int n)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int riscv_gdb_get_virtual(CPURISCVState *cs, uint8_t *mem_buf, int n)
|
||||
static int riscv_gdb_get_virtual(CPURISCVState *cs, GByteArray *buf, int n)
|
||||
{
|
||||
if (n == 0) {
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
return gdb_get_regl(mem_buf, 0);
|
||||
return gdb_get_regl(buf, 0);
|
||||
#else
|
||||
return gdb_get_regl(mem_buf, cs->priv);
|
||||
return gdb_get_regl(buf, cs->priv);
|
||||
#endif
|
||||
}
|
||||
return 0;
|
||||
|
@ -27,7 +27,7 @@
|
||||
#include "sysemu/hw_accel.h"
|
||||
#include "sysemu/tcg.h"
|
||||
|
||||
int s390_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
int s390_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
|
||||
{
|
||||
S390CPU *cpu = S390_CPU(cs);
|
||||
CPUS390XState *env = &cpu->env;
|
||||
@ -82,11 +82,11 @@ int s390_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
/* total number of registers in s390-acr.xml */
|
||||
#define S390_NUM_AC_REGS 16
|
||||
|
||||
static int cpu_read_ac_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
|
||||
static int cpu_read_ac_reg(CPUS390XState *env, GByteArray *buf, int n)
|
||||
{
|
||||
switch (n) {
|
||||
case S390_A0_REGNUM ... S390_A15_REGNUM:
|
||||
return gdb_get_reg32(mem_buf, env->aregs[n]);
|
||||
return gdb_get_reg32(buf, env->aregs[n]);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@ -111,13 +111,13 @@ static int cpu_write_ac_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
|
||||
/* total number of registers in s390-fpr.xml */
|
||||
#define S390_NUM_FP_REGS 17
|
||||
|
||||
static int cpu_read_fp_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
|
||||
static int cpu_read_fp_reg(CPUS390XState *env, GByteArray *buf, int n)
|
||||
{
|
||||
switch (n) {
|
||||
case S390_FPC_REGNUM:
|
||||
return gdb_get_reg32(mem_buf, env->fpc);
|
||||
return gdb_get_reg32(buf, env->fpc);
|
||||
case S390_F0_REGNUM ... S390_F15_REGNUM:
|
||||
return gdb_get_reg64(mem_buf, *get_freg(env, n - S390_F0_REGNUM));
|
||||
return gdb_get_reg64(buf, *get_freg(env, n - S390_F0_REGNUM));
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@ -145,17 +145,17 @@ static int cpu_write_fp_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
|
||||
/* total number of registers in s390-vx.xml */
|
||||
#define S390_NUM_VREGS 32
|
||||
|
||||
static int cpu_read_vreg(CPUS390XState *env, uint8_t *mem_buf, int n)
|
||||
static int cpu_read_vreg(CPUS390XState *env, GByteArray *buf, int n)
|
||||
{
|
||||
int ret;
|
||||
|
||||
switch (n) {
|
||||
case S390_V0L_REGNUM ... S390_V15L_REGNUM:
|
||||
ret = gdb_get_reg64(mem_buf, env->vregs[n][1]);
|
||||
ret = gdb_get_reg64(buf, env->vregs[n][1]);
|
||||
break;
|
||||
case S390_V16_REGNUM ... S390_V31_REGNUM:
|
||||
ret = gdb_get_reg64(mem_buf, env->vregs[n][0]);
|
||||
ret += gdb_get_reg64(mem_buf + 8, env->vregs[n][1]);
|
||||
ret = gdb_get_reg64(buf, env->vregs[n][0]);
|
||||
ret += gdb_get_reg64(buf, env->vregs[n][1]);
|
||||
break;
|
||||
default:
|
||||
ret = 0;
|
||||
@ -186,11 +186,11 @@ static int cpu_write_vreg(CPUS390XState *env, uint8_t *mem_buf, int n)
|
||||
#define S390_NUM_C_REGS 16
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
static int cpu_read_c_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
|
||||
static int cpu_read_c_reg(CPUS390XState *env, GByteArray *buf, int n)
|
||||
{
|
||||
switch (n) {
|
||||
case S390_C0_REGNUM ... S390_C15_REGNUM:
|
||||
return gdb_get_regl(mem_buf, env->cregs[n]);
|
||||
return gdb_get_regl(buf, env->cregs[n]);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@ -223,7 +223,7 @@ static int cpu_write_c_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
|
||||
/* total number of registers in s390-virt.xml */
|
||||
#define S390_NUM_VIRT_REGS 8
|
||||
|
||||
static int cpu_read_virt_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
|
||||
static int cpu_read_virt_reg(CPUS390XState *env, GByteArray *mem_buf, int n)
|
||||
{
|
||||
switch (n) {
|
||||
case S390_VIRT_CKC_REGNUM:
|
||||
@ -296,9 +296,9 @@ static int cpu_write_virt_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
|
||||
/* total number of registers in s390-gs.xml */
|
||||
#define S390_NUM_GS_REGS 4
|
||||
|
||||
static int cpu_read_gs_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
|
||||
static int cpu_read_gs_reg(CPUS390XState *env, GByteArray *buf, int n)
|
||||
{
|
||||
return gdb_get_regl(mem_buf, env->gscb[n]);
|
||||
return gdb_get_regl(buf, env->gscb[n]);
|
||||
}
|
||||
|
||||
static int cpu_write_gs_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
|
||||
|
@ -292,7 +292,7 @@ uint16_t float128_dcmask(CPUS390XState *env, float128 f1);
|
||||
|
||||
|
||||
/* gdbstub.c */
|
||||
int s390_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
int s390_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
|
||||
int s390_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
void s390_cpu_gdb_init(CPUState *cs);
|
||||
|
||||
|
@ -208,7 +208,7 @@ void superh_cpu_do_interrupt(CPUState *cpu);
|
||||
bool superh_cpu_exec_interrupt(CPUState *cpu, int int_req);
|
||||
void superh_cpu_dump_state(CPUState *cpu, FILE *f, int flags);
|
||||
hwaddr superh_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
|
||||
int superh_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
int superh_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
|
||||
int superh_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
void superh_cpu_do_unaligned_access(CPUState *cpu, vaddr addr,
|
||||
MMUAccessType access_type,
|
||||
|
@ -24,7 +24,7 @@
|
||||
/* Hint: Use "set architecture sh4" in GDB to see fpu registers */
|
||||
/* FIXME: We should use XML for this. */
|
||||
|
||||
int superh_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
int superh_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
|
||||
{
|
||||
SuperHCPU *cpu = SUPERH_CPU(cs);
|
||||
CPUSH4State *env = &cpu->env;
|
||||
|
@ -571,7 +571,7 @@ extern const VMStateDescription vmstate_sparc_cpu;
|
||||
void sparc_cpu_do_interrupt(CPUState *cpu);
|
||||
void sparc_cpu_dump_state(CPUState *cpu, FILE *f, int flags);
|
||||
hwaddr sparc_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
|
||||
int sparc_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
int sparc_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
|
||||
int sparc_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
void QEMU_NORETURN sparc_cpu_do_unaligned_access(CPUState *cpu, vaddr addr,
|
||||
MMUAccessType access_type,
|
||||
|
@ -27,7 +27,7 @@
|
||||
#define gdb_get_rega(buf, val) gdb_get_regl(buf, val)
|
||||
#endif
|
||||
|
||||
int sparc_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
int sparc_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
|
||||
{
|
||||
SPARCCPU *cpu = SPARC_CPU(cs);
|
||||
CPUSPARCState *env = &cpu->env;
|
||||
|
@ -569,7 +569,7 @@ void xtensa_cpu_dump_state(CPUState *cpu, FILE *f, int flags);
|
||||
hwaddr xtensa_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
|
||||
void xtensa_count_regs(const XtensaConfig *config,
|
||||
unsigned *n_regs, unsigned *n_core_regs);
|
||||
int xtensa_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
int xtensa_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
|
||||
int xtensa_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||
void xtensa_cpu_do_unaligned_access(CPUState *cpu, vaddr addr,
|
||||
MMUAccessType access_type,
|
||||
|
@ -63,7 +63,7 @@ void xtensa_count_regs(const XtensaConfig *config,
|
||||
}
|
||||
}
|
||||
|
||||
int xtensa_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
int xtensa_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
|
||||
{
|
||||
XtensaCPU *cpu = XTENSA_CPU(cs);
|
||||
CPUXtensaState *env = &cpu->env;
|
||||
|
Loading…
Reference in New Issue
Block a user