gdbstub: Change GDBState::{c,g}_cpu and find_cpu() to CPUState

Use CPUState::env_ptr where still needed.

Signed-off-by: Andreas Färber <afaerber@suse.de>
This commit is contained in:
Andreas Färber 2013-06-27 19:19:39 +02:00
parent f3659eee05
commit 2e0f2cfba6
1 changed files with 52 additions and 52 deletions

104
gdbstub.c
View File

@ -288,8 +288,8 @@ enum RSState {
RS_CHKSUM2, RS_CHKSUM2,
}; };
typedef struct GDBState { typedef struct GDBState {
CPUArchState *c_cpu; /* current CPU for step/continue ops */ CPUState *c_cpu; /* current CPU for step/continue ops */
CPUArchState *g_cpu; /* current CPU for other ops */ CPUState *g_cpu; /* current CPU for other ops */
CPUState *query_cpu; /* for q{f|s}ThreadInfo */ CPUState *query_cpu; /* for q{f|s}ThreadInfo */
enum RSState state; /* parsing state */ enum RSState state; /* parsing state */
char line_buf[MAX_PACKET_LENGTH]; char line_buf[MAX_PACKET_LENGTH];
@ -1958,8 +1958,7 @@ static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
int err = 0; int err = 0;
if (kvm_enabled()) { if (kvm_enabled()) {
return kvm_insert_breakpoint(ENV_GET_CPU(gdbserver_state->c_cpu), return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
addr, len, type);
} }
switch (type) { switch (type) {
@ -1997,8 +1996,7 @@ static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
int err = 0; int err = 0;
if (kvm_enabled()) { if (kvm_enabled()) {
return kvm_remove_breakpoint(ENV_GET_CPU(gdbserver_state->c_cpu), return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
addr, len, type);
} }
switch (type) { switch (type) {
@ -2034,7 +2032,7 @@ static void gdb_breakpoint_remove_all(void)
CPUArchState *env; CPUArchState *env;
if (kvm_enabled()) { if (kvm_enabled()) {
kvm_remove_all_breakpoints(ENV_GET_CPU(gdbserver_state->c_cpu)); kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
return; return;
} }
@ -2049,7 +2047,7 @@ static void gdb_breakpoint_remove_all(void)
static void gdb_set_cpu_pc(GDBState *s, target_ulong pc) static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
{ {
CPUState *cpu = ENV_GET_CPU(s->c_cpu); CPUState *cpu = s->c_cpu;
CPUClass *cc = CPU_GET_CLASS(cpu); CPUClass *cc = CPU_GET_CLASS(cpu);
cpu_synchronize_state(cpu); cpu_synchronize_state(cpu);
@ -2058,13 +2056,13 @@ static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
} }
} }
static CPUArchState *find_cpu(uint32_t thread_id) static CPUState *find_cpu(uint32_t thread_id)
{ {
CPUState *cpu; CPUState *cpu;
for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) { for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
if (cpu_index(cpu) == thread_id) { if (cpu_index(cpu) == thread_id) {
return cpu->env_ptr; return cpu;
} }
} }
@ -2073,7 +2071,10 @@ static CPUArchState *find_cpu(uint32_t thread_id)
static int gdb_handle_packet(GDBState *s, const char *line_buf) static int gdb_handle_packet(GDBState *s, const char *line_buf)
{ {
#ifdef TARGET_XTENSA
CPUArchState *env; CPUArchState *env;
#endif
CPUState *cpu;
const char *p; const char *p;
uint32_t thread; uint32_t thread;
int ch, reg_size, type, res; int ch, reg_size, type, res;
@ -2091,7 +2092,7 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
case '?': case '?':
/* TODO: Make this return the correct value for user-mode. */ /* TODO: Make this return the correct value for user-mode. */
snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP, snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
cpu_index(ENV_GET_CPU(s->c_cpu))); cpu_index(s->c_cpu));
put_packet(s, buf); put_packet(s, buf);
/* Remove all the breakpoints when this query is issued, /* Remove all the breakpoints when this query is issued,
* because gdb is doing and initial connect and the state * because gdb is doing and initial connect and the state
@ -2153,15 +2154,15 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
} }
if (res) { if (res) {
if (res_thread != -1 && res_thread != 0) { if (res_thread != -1 && res_thread != 0) {
env = find_cpu(res_thread); cpu = find_cpu(res_thread);
if (env == NULL) { if (cpu == NULL) {
put_packet(s, "E22"); put_packet(s, "E22");
break; break;
} }
s->c_cpu = env; s->c_cpu = cpu;
} }
if (res == 's') { if (res == 's') {
cpu_single_step(ENV_GET_CPU(s->c_cpu), sstep_flags); cpu_single_step(s->c_cpu, sstep_flags);
} }
s->signal = res_signal; s->signal = res_signal;
gdb_continue(s); gdb_continue(s);
@ -2189,7 +2190,7 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
addr = strtoull(p, (char **)&p, 16); addr = strtoull(p, (char **)&p, 16);
gdb_set_cpu_pc(s, addr); gdb_set_cpu_pc(s, addr);
} }
cpu_single_step(ENV_GET_CPU(s->c_cpu), sstep_flags); cpu_single_step(s->c_cpu, sstep_flags);
gdb_continue(s); gdb_continue(s);
return RS_IDLE; return RS_IDLE;
case 'F': case 'F':
@ -2208,7 +2209,7 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
p++; p++;
type = *p; type = *p;
if (s->current_syscall_cb) { if (s->current_syscall_cb) {
s->current_syscall_cb(ENV_GET_CPU(s->c_cpu), ret, err); s->current_syscall_cb(s->c_cpu, ret, err);
s->current_syscall_cb = NULL; s->current_syscall_cb = NULL;
} }
if (type == 'C') { if (type == 'C') {
@ -2219,26 +2220,28 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
} }
break; break;
case 'g': case 'g':
cpu_synchronize_state(ENV_GET_CPU(s->g_cpu)); cpu_synchronize_state(s->g_cpu);
env = s->g_cpu; #ifdef TARGET_XTENSA
env = s->g_cpu->env_ptr;
#endif
len = 0; len = 0;
for (addr = 0; addr < num_g_regs; addr++) { for (addr = 0; addr < num_g_regs; addr++) {
reg_size = gdb_read_register(ENV_GET_CPU(s->g_cpu), reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
mem_buf + len, addr);
len += reg_size; len += reg_size;
} }
memtohex(buf, mem_buf, len); memtohex(buf, mem_buf, len);
put_packet(s, buf); put_packet(s, buf);
break; break;
case 'G': case 'G':
cpu_synchronize_state(ENV_GET_CPU(s->g_cpu)); cpu_synchronize_state(s->g_cpu);
env = s->g_cpu; #ifdef TARGET_XTENSA
env = s->g_cpu->env_ptr;
#endif
registers = mem_buf; registers = mem_buf;
len = strlen(p) / 2; len = strlen(p) / 2;
hextomem((uint8_t *)registers, p, len); hextomem((uint8_t *)registers, p, len);
for (addr = 0; addr < num_g_regs && len > 0; addr++) { for (addr = 0; addr < num_g_regs && len > 0; addr++) {
reg_size = gdb_write_register(ENV_GET_CPU(s->g_cpu), registers, reg_size = gdb_write_register(s->g_cpu, registers, addr);
addr);
len -= reg_size; len -= reg_size;
registers += reg_size; registers += reg_size;
} }
@ -2249,8 +2252,7 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
if (*p == ',') if (*p == ',')
p++; p++;
len = strtoull(p, NULL, 16); len = strtoull(p, NULL, 16);
if (target_memory_rw_debug(ENV_GET_CPU(s->g_cpu), addr, mem_buf, len, if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
false) != 0) {
put_packet (s, "E14"); put_packet (s, "E14");
} else { } else {
memtohex(buf, mem_buf, len); memtohex(buf, mem_buf, len);
@ -2265,7 +2267,7 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
if (*p == ':') if (*p == ':')
p++; p++;
hextomem(mem_buf, p, len); hextomem(mem_buf, p, len);
if (target_memory_rw_debug(ENV_GET_CPU(s->g_cpu), addr, mem_buf, len, if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
true) != 0) { true) != 0) {
put_packet(s, "E14"); put_packet(s, "E14");
} else { } else {
@ -2279,7 +2281,7 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
if (!gdb_has_xml) if (!gdb_has_xml)
goto unknown_command; goto unknown_command;
addr = strtoull(p, (char **)&p, 16); addr = strtoull(p, (char **)&p, 16);
reg_size = gdb_read_register(ENV_GET_CPU(s->g_cpu), mem_buf, addr); reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
if (reg_size) { if (reg_size) {
memtohex(buf, mem_buf, reg_size); memtohex(buf, mem_buf, reg_size);
put_packet(s, buf); put_packet(s, buf);
@ -2295,7 +2297,7 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
p++; p++;
reg_size = strlen(p) / 2; reg_size = strlen(p) / 2;
hextomem(mem_buf, p, reg_size); hextomem(mem_buf, p, reg_size);
gdb_write_register(ENV_GET_CPU(s->g_cpu), mem_buf, addr); gdb_write_register(s->g_cpu, mem_buf, addr);
put_packet(s, "OK"); put_packet(s, "OK");
break; break;
case 'Z': case 'Z':
@ -2325,18 +2327,18 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
put_packet(s, "OK"); put_packet(s, "OK");
break; break;
} }
env = find_cpu(thread); cpu = find_cpu(thread);
if (env == NULL) { if (cpu == NULL) {
put_packet(s, "E22"); put_packet(s, "E22");
break; break;
} }
switch (type) { switch (type) {
case 'c': case 'c':
s->c_cpu = env; s->c_cpu = cpu;
put_packet(s, "OK"); put_packet(s, "OK");
break; break;
case 'g': case 'g':
s->g_cpu = env; s->g_cpu = cpu;
put_packet(s, "OK"); put_packet(s, "OK");
break; break;
default: default:
@ -2346,9 +2348,9 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
break; break;
case 'T': case 'T':
thread = strtoull(p, (char **)&p, 16); thread = strtoull(p, (char **)&p, 16);
env = find_cpu(thread); cpu = find_cpu(thread);
if (env != NULL) { if (cpu != NULL) {
put_packet(s, "OK"); put_packet(s, "OK");
} else { } else {
put_packet(s, "E22"); put_packet(s, "E22");
@ -2398,9 +2400,8 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
break; break;
} else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) { } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
thread = strtoull(p+16, (char **)&p, 16); thread = strtoull(p+16, (char **)&p, 16);
env = find_cpu(thread); cpu = find_cpu(thread);
if (env != NULL) { if (cpu != NULL) {
CPUState *cpu = ENV_GET_CPU(env);
cpu_synchronize_state(cpu); cpu_synchronize_state(cpu);
len = snprintf((char *)mem_buf, sizeof(mem_buf), len = snprintf((char *)mem_buf, sizeof(mem_buf),
"CPU#%d [%s]", cpu->cpu_index, "CPU#%d [%s]", cpu->cpu_index,
@ -2412,7 +2413,8 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
} }
#ifdef CONFIG_USER_ONLY #ifdef CONFIG_USER_ONLY
else if (strncmp(p, "Offsets", 7) == 0) { else if (strncmp(p, "Offsets", 7) == 0) {
TaskState *ts = s->c_cpu->opaque; CPUArchState *env = s->c_cpu->env_ptr;
TaskState *ts = env->opaque;
snprintf(buf, sizeof(buf), snprintf(buf, sizeof(buf),
"Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
@ -2502,18 +2504,16 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
void gdb_set_stop_cpu(CPUState *cpu) void gdb_set_stop_cpu(CPUState *cpu)
{ {
CPUArchState *env = cpu->env_ptr; gdbserver_state->c_cpu = cpu;
gdbserver_state->g_cpu = cpu;
gdbserver_state->c_cpu = env;
gdbserver_state->g_cpu = env;
} }
#ifndef CONFIG_USER_ONLY #ifndef CONFIG_USER_ONLY
static void gdb_vm_state_change(void *opaque, int running, RunState state) static void gdb_vm_state_change(void *opaque, int running, RunState state)
{ {
GDBState *s = gdbserver_state; GDBState *s = gdbserver_state;
CPUArchState *env = s->c_cpu; CPUArchState *env = s->c_cpu->env_ptr;
CPUState *cpu = ENV_GET_CPU(env); CPUState *cpu = s->c_cpu;
char buf[256]; char buf[256];
const char *type; const char *type;
int ret; int ret;
@ -2643,7 +2643,7 @@ void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
va_end(va); va_end(va);
#ifdef CONFIG_USER_ONLY #ifdef CONFIG_USER_ONLY
put_packet(s, s->syscall_buf); put_packet(s, s->syscall_buf);
gdb_handlesig(ENV_GET_CPU(s->c_cpu), 0); gdb_handlesig(s->c_cpu, 0);
#else #else
/* In this case wait to send the syscall packet until notification that /* In this case wait to send the syscall packet until notification that
the CPU has stopped. This must be done because if the packet is sent the CPU has stopped. This must be done because if the packet is sent
@ -2651,7 +2651,7 @@ void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
is still in the running state, which can cause packets to be dropped is still in the running state, which can cause packets to be dropped
and state transition 'T' packets to be sent while the syscall is still and state transition 'T' packets to be sent while the syscall is still
being processed. */ being processed. */
cpu_exit(ENV_GET_CPU(s->c_cpu)); cpu_exit(s->c_cpu);
#endif #endif
} }
@ -2860,8 +2860,8 @@ static void gdb_accept(void)
socket_set_nodelay(fd); socket_set_nodelay(fd);
s = g_malloc0(sizeof(GDBState)); s = g_malloc0(sizeof(GDBState));
s->c_cpu = first_cpu->env_ptr; s->c_cpu = first_cpu;
s->g_cpu = first_cpu->env_ptr; s->g_cpu = first_cpu;
s->fd = fd; s->fd = fd;
gdb_has_xml = 0; gdb_has_xml = 0;
@ -3045,8 +3045,8 @@ int gdbserver_start(const char *device)
mon_chr = s->mon_chr; mon_chr = s->mon_chr;
memset(s, 0, sizeof(GDBState)); memset(s, 0, sizeof(GDBState));
} }
s->c_cpu = first_cpu->env_ptr; s->c_cpu = first_cpu;
s->g_cpu = first_cpu->env_ptr; s->g_cpu = first_cpu;
s->chr = chr; s->chr = chr;
s->state = chr ? RS_IDLE : RS_INACTIVE; s->state = chr ? RS_IDLE : RS_INACTIVE;
s->mon_chr = mon_chr; s->mon_chr = mon_chr;