aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Brook <paul@codesourcery.com>2010-06-16 13:03:51 +0100
committerPaul Brook <paul@codesourcery.com>2010-06-16 13:03:51 +0100
commit0e1c9c54afb9ce6be2339923ced025a0d2a541ea (patch)
tree37ecff9eb90d4c880b80bfdcb53ab976dc6236e8
parent1884533c74aea64f8acac735a30bc8f427de161f (diff)
GDB exit status for semihosting
Report exit status to GDB when a semihosted application exits. Signed-off-by: Paul Brook <paul@codesourcery.com>
-rw-r--r--arm-semi.c1
-rw-r--r--gdbstub.c34
-rw-r--r--gdbstub.h2
-rw-r--r--m68k-semi.c1
4 files changed, 23 insertions, 15 deletions
diff --git a/arm-semi.c b/arm-semi.c
index 5239ffc8c4..0687b03006 100644
--- a/arm-semi.c
+++ b/arm-semi.c
@@ -459,6 +459,7 @@ uint32_t do_arm_semihosting(CPUState *env)
return 0;
}
case SYS_EXIT:
+ gdb_exit(env, 0);
exit(0);
default:
fprintf(stderr, "qemu: Unsupported SemiHosting SWI 0x%02x\n", nr);
diff --git a/gdbstub.c b/gdbstub.c
index 474ed8aeae..c1852c243f 100644
--- a/gdbstub.c
+++ b/gdbstub.c
@@ -2373,6 +2373,26 @@ static void gdb_read_byte(GDBState *s, int ch)
}
}
+/* Tell the remote gdb that the process has exited. */
+void gdb_exit(CPUState *env, int code)
+{
+ GDBState *s;
+ char buf[4];
+
+ s = gdbserver_state;
+ if (!s) {
+ return;
+ }
+#ifdef CONFIG_USER_ONLY
+ if (gdbserver_fd < 0 || s->fd < 0) {
+ return;
+ }
+#endif
+
+ snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
+ put_packet(s, buf);
+}
+
#ifdef CONFIG_USER_ONLY
int
gdb_queuesig (void)
@@ -2436,20 +2456,6 @@ gdb_handlesig (CPUState *env, int sig)
return sig;
}
-/* Tell the remote gdb that the process has exited. */
-void gdb_exit(CPUState *env, int code)
-{
- GDBState *s;
- char buf[4];
-
- s = gdbserver_state;
- if (gdbserver_fd < 0 || s->fd < 0)
- return;
-
- snprintf(buf, sizeof(buf), "W%02x", code);
- put_packet(s, buf);
-}
-
/* Tell the remote gdb that the process has exited due to SIG. */
void gdb_signalled(CPUState *env, int sig)
{
diff --git a/gdbstub.h b/gdbstub.h
index 54d753cfd4..219abdab0e 100644
--- a/gdbstub.h
+++ b/gdbstub.h
@@ -17,10 +17,10 @@ typedef void (*gdb_syscall_complete_cb)(CPUState *env,
void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...);
int use_gdb_syscalls(void);
void gdb_set_stop_cpu(CPUState *env);
+void gdb_exit(CPUState *, int);
#ifdef CONFIG_USER_ONLY
int gdb_queuesig (void);
int gdb_handlesig (CPUState *, int);
-void gdb_exit(CPUState *, int);
void gdb_signalled(CPUState *, int);
void gdbserver_fork(CPUState *);
#endif
diff --git a/m68k-semi.c b/m68k-semi.c
index 48e3bd38be..d16bc671c6 100644
--- a/m68k-semi.c
+++ b/m68k-semi.c
@@ -172,6 +172,7 @@ void do_m68k_semihosting(CPUM68KState *env, int nr)
args = env->dregs[1];
switch (nr) {
case HOSTED_EXIT:
+ gdb_exit(env, env->dregs[0]);
exit(env->dregs[0]);
case HOSTED_OPEN:
if (use_gdb_syscalls()) {