[Patch][newlib][arm] Enable return code with semi-hosting SYS_EXIT_EXTENDED
Jeff Johnston
jjohnstn@redhat.com
Thu Nov 29 15:14:00 GMT 2018
Pushed to master.
-- Jeff J.
On Mon, Nov 26, 2018 at 5:26 AM Matthew Malcomson <Matthew.Malcomson@arm.com>
wrote:
> On 20/11/18 11:16, Richard Earnshaw (lists) wrote:
> > On 16/11/2018 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.
> >>
> >> 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.
> >>
> >> Tested with gcc testsuite on arm-none-eabi and no issues.
> >> Ok for master?
> >>
> >> PS. I don't have commit rights so if OK can someone commit for me?
> > This change needs to be applied to the similar code in newlib's sys
> > directory as well. PLEASE keep this in sync.
> >
> > R.
> Thanks for pointing that out, and thanks for the help in testing too.
> The patch applying this same change to the sys/ directory is attached.
>
> If OK could someone commit for me? I don't have commit rights.
>
> Regards,
> Matthew
>
>
> #### Patch inlined for ease of reply ###
>
> diff --git a/newlib/libc/sys/arm/syscalls.c
> b/newlib/libc/sys/arm/syscalls.c
> index 87ddca7..b521074 100644
> --- a/newlib/libc/sys/arm/syscalls.c
> +++ b/newlib/libc/sys/arm/syscalls.c
> @@ -30,7 +30,7 @@ int _stat (const char *, struct stat *);
> int _fstat (int, struct stat *);
> void * _sbrk (ptrdiff_t);
> pid_t _getpid (void);
> -int _kill (int, int) __attribute__((__noreturn__));
> +int _kill (int, int);
> void _exit (int);
> int _close (int);
> int _swiclose (int);
> @@ -49,6 +49,7 @@ static int error (int);
> static int get_errno (void);
> static int remap_handle (int);
> static int findslot (int);
> +static int _kill_shared (int, int, int)
> __attribute__((__noreturn__));
>
> /* Register name faking - works in collusion with the linker. */
> register char * stack_ptr asm ("sp");
> @@ -424,21 +425,35 @@ _close (int file)
> return wrap (_swiclose (file));
> }
>
> -int
> -_kill (int pid, int sig)
> +static int
> +_kill_shared (int pid, int sig, int reason)
> {
> - (void)pid; (void)sig;
> + (void) pid; (void) sig;
> #ifdef ARM_RDI_MONITOR
> /* Note: The pid argument is thrown away. */
> - switch (sig) {
> - case SIGABRT:
> - do_AngelSWI (AngelSWI_Reason_ReportException,
> - (void *) ADP_Stopped_RunTimeError);
> - __builtin_unreachable();
> - default:
> - do_AngelSWI (AngelSWI_Reason_ReportException,
> - (void *) ADP_Stopped_ApplicationExit);
> - }
> + int block[2];
> + block[1] = sig;
> + block[0] = reason;
> + int insn;
> +
> +#if SEMIHOST_V2
> + if (_has_ext_exit_extended ())
> + {
> + insn = AngelSWI_Reason_ReportExceptionExtended;
> + }
> + else
> +#endif
> + {
> + insn = AngelSWI_Reason_ReportException;
> + }
> +
> +#if SEMIHOST_V2
> +if (_has_ext_exit_extended ())
> + do_AngelSWI (insn, block);
> +else
> +#endif
> + do_AngelSWI (insn, (void*)block[0]);
> +
> #else
> asm ("swi %a0" :: "i" (SWI_Exit));
> #endif
> @@ -446,15 +461,24 @@ _kill (int pid, int sig)
> __builtin_unreachable();
> }
>
> +int
> +_kill (int pid, int sig)
> +{
> + if (sig == SIGABRT)
> + _kill_shared (pid, sig, ADP_Stopped_RunTimeError);
> + else
> + _kill_shared (pid, sig, ADP_Stopped_ApplicationExit);
> +}
> +
> 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);
> }
>
> pid_t
> --
> 2.7.4
>
>
>
>
More information about the Newlib
mailing list