This is the mail archive of the newlib@sources.redhat.com 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]

exit vs. kill on ARM


ARM has only one SWI for both _exit and _kill. To give the SWI handler
(i.e. the kernel) a hope of differentiating the two calls, this patch
modifies _exit to call the SWI with the second argument set to -1,
which is an invalid value for signum. This does not affect the RDI
implementation, since it discards both its arguments anyways.

This patch also removes _raise. My grepping of the code has shown that
newlib calls _raise_r, which is implemented in
newlib/libc/signal/signal.c, but never _raise.

Cheers,
Shaun

2005-07-18  Shaun Jackman  <sjackman@gmail.com>

	* libgloss/arm/syscalls.c (_exit): Call _kill with the second
	argument set to -1, which is an invalid signal number.
	(_kill): Comment and coding style changes only.
	(_raise): Remove function.

Index: libgloss/arm/syscalls.c
===================================================================
RCS file: /cvs/src/src/libgloss/arm/syscalls.c,v
retrieving revision 1.5
diff -u -r1.5 syscalls.c
--- libgloss/arm/syscalls.c	18 Jul 2005 16:18:17 -0000	1.5
+++ libgloss/arm/syscalls.c	18 Jul 2005 23:59:29 -0000
@@ -22,7 +22,6 @@
 int     _isatty		_PARAMS ((int));
  clock_t _times		_PARAMS ((struct tms *));
  int     _gettimeofday	_PARAMS ((struct timeval *, struct timezone *));
-int     _raise 		_PARAMS ((int));
  int     _unlink		_PARAMS ((const char *));
 int     _link 		_PARAMS ((void));
  int     _stat 		_PARAMS ((const char *, struct stat *));
@@ -434,30 +433,28 @@
   return wrap (_swiclose (file));
 }
 
-void
-_exit (int n)
-{
-  /* FIXME: return code is thrown away.  */
-  
-#ifdef ARM_RDI_MONITOR
-  do_AngelSWI (AngelSWI_Reason_ReportException,
-	      (void *) ADP_Stopped_ApplicationExit);
-#else
-  asm ("swi %a0" :: "i" (SWI_Exit));
-#endif
-  n = n;
-}
-
 int
-_kill (int n, int m)
+_kill (int pid, int sig)
 {
+  (void)pid; (void)sig;
  #ifdef ARM_RDI_MONITOR
+  /* Note: Both arguments are thrown away.  */
   return do_AngelSWI (AngelSWI_Reason_ReportException,
 		      (void *) ADP_Stopped_ApplicationExit);
 #else
   asm ("swi %a0" :: "i" (SWI_Exit));
  #endif
-  n = n; m = m;
+}
+
+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);
 }
 
 int __attribute__((weak))
@@ -545,14 +542,6 @@
  #endif
 }
 
-int __attribute__((weak))
-_raise (int sig)
-{
-  (void)sig;
-  errno = ENOSYS;
-  return -1;
-}
-
 int
  _gettimeofday (struct timeval * tp, struct timezone * tzp)
 {

Attachment: libgloss-arm-kill.diff
Description: Text document


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