mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-31 11:30:56 +08:00
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.
This commit is contained in:
parent
df7824d1a4
commit
6dbd190111
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user