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:
Matthew Malcomson
2018-11-16 11:45:48 +00:00
committed by Corinna Vinschen
parent df7824d1a4
commit 6dbd190111
2 changed files with 20 additions and 22 deletions

View File

@ -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);
}