Re: [Patch][arm] Enable return code with semi-hosting SYS_EXIT_EXTENDED
Matthew Malcomson <[email protected]>
| Newsgroups | gmane.comp.lib.newlib |
|---|---|
| Message-ID | <[email protected]> |
On 19/11/18 11:24, Corinna Vinschen wrote: > On Nov 16 18:48, Matthew Malcomson wrote: >> The _exit function currently passes -1 as a "sig" to the _kill function as an >> invalid signal number so that _kill can distinguish between an abort and a >> standard exit. > Thanks for the patch, but it doesn't apply. Can you please resend the > patch as attachment in `git format-patch' format? > > > Thanks, > Corinna > Apologies, `git format-patch' file attached. Cheers, Matthew
0001-newlib-arm-Enable-return-code-with-semi-hosting-SYS_.patch
(text/x-patch, 3.6 KB)
From 752398d1015b7c5c7e12c326cc9e6b0cc0f4ed01 Mon Sep 17 00:00:00 2001 From: Matthew Malcomson <[email protected]> Date: Fri, 16 Nov 2018 11:45:48 +0000 Subject: [PATCH] [newlib][arm] Enable return code with semi-hosting SYS_EXIT_EXTENDED The _exit function currently passes -1 as a "sig" to the _kill function as an invalid signal number so that _kill can distinguish between an abort and a standard exit. For boards using the SYS_EXIT_EXTENDED semi-hosting operation to return a status code, this means that the "status" paramter to _exit is ignored and the return code is always -1. https://developer.arm.com/docs/100863/latest/semihosting-operations/sys_exit_extended-0x20 This patch puts shared code between _kill and _exit into a new function _kill_shared that takes the semi-hosting "reason" to use (if semi-hosting is available) as an argument. For semi-hosting _kill_shared provides that "reason". Without the "sig" argument being used to distinguish between a normal and abnormal exit, the _exit function can provide the return code to be used if the SYS_EXIT_EXTENDED operation is available. Hence the exit code can be returned. --- libgloss/arm/_exit.c | 15 ++++++++------- libgloss/arm/_kill.c | 27 ++++++++++++--------------- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/libgloss/arm/_exit.c b/libgloss/arm/_exit.c index 4a071df..180541e 100644 --- a/libgloss/arm/_exit.c +++ b/libgloss/arm/_exit.c @@ -1,15 +1,16 @@ #include <_ansi.h> +#include "swi.h" -int _kill (int, int) __attribute__((__noreturn__)); +int _kill_shared (int, int, int) __attribute__((__noreturn__)); void _exit (int); void _exit (int status) { - /* There is only one SWI for both _exit and _kill. For _exit, call - the SWI with the second argument set to -1, an invalid value for - signum, so that the SWI handler can distinguish the two calls. - Note: The RDI implementation of _kill throws away both its - arguments. */ - _kill (status, -1); + /* The same SWI is used for both _exit and _kill. + For _exit, call the SWI with "reason" set to ADP_Stopped_ApplicationExit + to mark a standard exit. + Note: The RDI implementation of _kill_shared throws away all its + arguments and all implementations ignore the first argument. */ + _kill_shared (-1, status, ADP_Stopped_ApplicationExit); } diff --git a/libgloss/arm/_kill.c b/libgloss/arm/_kill.c index 34a6ffd..69f9856 100644 --- a/libgloss/arm/_kill.c +++ b/libgloss/arm/_kill.c @@ -2,16 +2,27 @@ #include <signal.h> #include "swi.h" -int _kill (int, int) __attribute__((__noreturn__)); +int _kill_shared (int, int, int) __attribute__((__noreturn__)); +int _kill (int, int); int _kill (int pid, int sig) { + if (sig == SIGABRT) + _kill_shared (pid, sig, ADP_Stopped_RunTimeError); + else + _kill_shared (pid, sig, ADP_Stopped_ApplicationExit); +} + +int +_kill_shared (int pid, int sig, int reason) +{ (void) pid; (void) sig; #ifdef ARM_RDI_MONITOR /* Note: The pid argument is thrown away. */ int block[2]; block[1] = sig; + block[0] = reason; int insn; #if SEMIHOST_V2 @@ -25,20 +36,6 @@ _kill (int pid, int sig) insn = AngelSWI_Reason_ReportException; } - switch (sig) - { - case SIGABRT: - { - block[0] = ADP_Stopped_RunTimeError; - break; - } - default: - { - block[0] = ADP_Stopped_ApplicationExit; - break; - } - } - #if SEMIHOST_V2 if (_has_ext_exit_extended ()) do_AngelSWI (insn, block); -- 2.7.4