aboutsummaryrefslogtreecommitdiff
path: root/gdbstub.c
diff options
context:
space:
mode:
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2005-04-24 10:07:11 +0000
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2005-04-24 10:07:11 +0000
commit41625033686b7cb8bf8966c7d0907ec208d6a028 (patch)
treef0925951aeea88b6ee915bbabf19b4f786c2ea3d /gdbstub.c
parent6bae7ed8b900bc0f1fb1df0f70ceed5e8cca0ca1 (diff)
downloadqemu-41625033686b7cb8bf8966c7d0907ec208d6a028.zip
qemu-41625033686b7cb8bf8966c7d0907ec208d6a028.tar.gz
qemu-41625033686b7cb8bf8966c7d0907ec208d6a028.tar.bz2
removed RS_CONTINUE 'state'
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1389 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'gdbstub.c')
-rw-r--r--gdbstub.c38
1 files changed, 21 insertions, 17 deletions
diff --git a/gdbstub.c b/gdbstub.c
index 5dc93c4..eb30627 100644
--- a/gdbstub.c
+++ b/gdbstub.c
@@ -42,17 +42,19 @@ enum RSState {
RS_GETLINE,
RS_CHKSUM1,
RS_CHKSUM2,
- RS_CONTINUE
};
/* XXX: This is not thread safe. Do we care? */
static int gdbserver_fd = -1;
typedef struct GDBState {
- enum RSState state;
+ enum RSState state; /* parsing state */
int fd;
char line_buf[4096];
int line_buf_index;
int line_csum;
+#ifdef CONFIG_USER_ONLY
+ int running_state;
+#endif
} GDBState;
#ifdef CONFIG_USER_ONLY
@@ -431,7 +433,12 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf)
env->npc = addr + 4;
#endif
}
- return RS_CONTINUE;
+#ifdef CONFIG_USER_ONLY
+ s->running_state = 1;
+#else
+ vm_start();
+#endif
+ return RS_IDLE;
case 's':
if (*p != '\0') {
addr = strtoul(p, (char **)&p, 16);
@@ -445,7 +452,12 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf)
#endif
}
cpu_single_step(env, 1);
- return RS_CONTINUE;
+#ifdef CONFIG_USER_ONLY
+ s->running_state = 1;
+#else
+ vm_start();
+#endif
+ return RS_IDLE;
case 'g':
reg_size = cpu_gdb_read_registers(env, mem_buf);
memtohex(buf, mem_buf, reg_size);
@@ -556,8 +568,9 @@ static void gdb_read_byte(GDBState *s, CPUState *env, int ch)
/* when the CPU is running, we cannot do anything except stop
it when receiving a char */
vm_stop(EXCP_INTERRUPT);
- } else {
+ } else
#endif
+ {
switch(s->state) {
case RS_IDLE:
if (ch == '$') {
@@ -595,16 +608,8 @@ static void gdb_read_byte(GDBState *s, CPUState *env, int ch)
s->state = gdb_handle_packet(s, env, s->line_buf);
}
break;
- case RS_CONTINUE:
-#ifndef CONFIG_USER_ONLY
- vm_start();
- s->state = RS_IDLE;
-#endif
- break;
}
-#ifndef CONFIG_USER_ONLY
}
-#endif
}
#ifdef CONFIG_USER_ONLY
@@ -630,11 +635,10 @@ gdb_handlesig (CPUState *env, int sig)
put_packet(s, buf);
}
- /* TODO: How do we terminate this loop? */
sig = 0;
s->state = RS_IDLE;
- while (s->state != RS_CONTINUE)
- {
+ s->running_state = 0;
+ while (s->running_state == 0) {
n = read (s->fd, buf, 256);
if (n > 0)
{
@@ -649,7 +653,7 @@ gdb_handlesig (CPUState *env, int sig)
connection before continuing. */
return sig;
}
- }
+ }
return sig;
}
#else