This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch][newlib][arm] Enable return code with semi-hosting SYS_EXIT_EXTENDED


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
From 752398d1015b7c5c7e12c326cc9e6b0cc0f4ed01 Mon Sep 17 00:00:00 2001
From: Matthew Malcomson <matthew.malcomson@arm.com>
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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]