qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] target-arm: return more meaningful exit status


From: Eric Botcazou
Subject: [Qemu-devel] [PATCH] target-arm: return more meaningful exit status
Date: Mon, 07 Apr 2014 23:42:34 +0200
User-agent: KMail/4.7.2 (Linux/3.1.10-1.29-desktop; KDE/4.7.2; x86_64; ; )

Hi,

this partially addresses a long-standing limitation of the ARM semi-hosting
mode, whereby the only exit status of the emulator is 0, whatever the exit
status of the target executable, by mapping arguments of the SYS_EXIT syscall.

See https://lists.gnu.org/archive/html/qemu-devel/2011-02/msg02178.html for
an earlier attempt.

It's only a partial solution because EXIT_SUCCESS will be returned in all
cases as before, except when the target execution is stopped with SIGABRT.
But that's sufficient to run the testsuite of the compiler for bare board
ARM, e.g. arm-none-eabi with newlib.

Signed-off-by: Eric Botcazou <address@hidden>
---
 target-arm/arm-semi.c |   23 +++++++++++++++++++++--
 1 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/target-arm/arm-semi.c b/target-arm/arm-semi.c
index ebb5235..dd6c2d9 100644
--- a/target-arm/arm-semi.c
+++ b/target-arm/arm-semi.c
@@ -58,6 +58,9 @@
 #define TARGET_SYS_HEAPINFO    0x16
 #define TARGET_SYS_EXIT        0x18
 
+#define ADP_Stopped_ApplicationExit ((2 << 16) + 38)
+#define ADP_Stopped_RunTimeError    ((2 << 16) + 35)
+
 #ifndef O_BINARY
 #define O_BINARY 0
 #endif
@@ -551,8 +554,24 @@ uint32_t do_arm_semihosting(CPUARMState *env)
             return 0;
         }
     case TARGET_SYS_EXIT:
-        gdb_exit(env, 0);
-        exit(0);
+        {
+            int code;
+
+            switch (args) {
+            case ADP_Stopped_ApplicationExit:
+                 code = EXIT_SUCCESS;
+                 break;
+            case ADP_Stopped_RunTimeError:
+                 code = EXIT_FAILURE;
+                 break;
+            default:
+                 code = -EXIT_FAILURE;
+                 break;
+            }
+
+            gdb_exit(env, code);
+            exit(code);
+        }
     default:
         fprintf(stderr, "qemu: Unsupported SemiHosting SWI 0x%02x\n", nr);
         cpu_dump_state(cs, stderr, fprintf, 0);
-- 
1.7.7

-- 
Eric Botcazou



reply via email to

[Prev in Thread] Current Thread [Next in Thread]