aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiviu Ionescu <ilg@livius.net>2014-12-11 12:07:48 +0000
committerPeter Maydell <peter.maydell@linaro.org>2014-12-11 12:07:48 +0000
commit1ecc3a2df168034b8ab33ff5ba6434ce3593dbb5 (patch)
treef8b20b341b40306812c8c4d14963fb8829f09b72
parenta09f2d16f6b9f5bcdedb4d116bb54da86e9a3f6e (diff)
downloadqemu-1ecc3a2df168034b8ab33ff5ba6434ce3593dbb5.zip
qemu-1ecc3a2df168034b8ab33ff5ba6434ce3593dbb5.tar.gz
qemu-1ecc3a2df168034b8ab33ff5ba6434ce3593dbb5.tar.bz2
Pass semihosting exit code back to system.
In order to run unit tests under semihosting, it is necessary to pass the application exit code back to the system. ARM defines only the code to be used for non-error application exit (ADP_Stopped_ApplicationExit), all other codes should return non-zero exit codes. This patch checks if the application code passed via TARGET_SYS_EXIT is ADP_Stopped_ApplicationExit, and return 0, otherwise return 1. Signed-off-by: Liviu Ionescu <ilg@livius.net> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r--target-arm/arm-semi.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/target-arm/arm-semi.c b/target-arm/arm-semi.c
index ebb5235..a8b83e6 100644
--- a/target-arm/arm-semi.c
+++ b/target-arm/arm-semi.c
@@ -58,6 +58,10 @@
#define TARGET_SYS_HEAPINFO 0x16
#define TARGET_SYS_EXIT 0x18
+/* ADP_Stopped_ApplicationExit is used for exit(0),
+ * anything else is implemented as exit(1) */
+#define ADP_Stopped_ApplicationExit (0x20026)
+
#ifndef O_BINARY
#define O_BINARY 0
#endif
@@ -551,8 +555,11 @@ uint32_t do_arm_semihosting(CPUARMState *env)
return 0;
}
case TARGET_SYS_EXIT:
- gdb_exit(env, 0);
- exit(0);
+ /* ARM specifies only Stopped_ApplicationExit as normal
+ * exit, everything else is considered an error */
+ ret = (args == ADP_Stopped_ApplicationExit) ? 0 : 1;
+ gdb_exit(env, ret);
+ exit(ret);
default:
fprintf(stderr, "qemu: Unsupported SemiHosting SWI 0x%02x\n", nr);
cpu_dump_state(cs, stderr, fprintf, 0);