Browse Source

_exit.c: add ABORT_INSTRUCTION

Warn if the arch has no  __UCLIBC_ABORT_INSTRUCTION__.
Run only one syscall, exit_group is not an exclusivity, use it if THREADS are enabled.
Guard according header.

Signed-off-by: Peter S. Mazinger <ps.m@gmx.net>
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Peter S. Mazinger 13 years ago
parent
commit
11430a8e3c
1 changed files with 19 additions and 3 deletions
  1. 19 3
      libc/sysdeps/linux/common/_exit.c

+ 19 - 3
libc/sysdeps/linux/common/_exit.c

@@ -10,17 +10,33 @@
 #include <unistd.h>
 #include <stdlib.h>
 #include <sys/syscall.h>
+#include <bits/kernel-features.h>
+
+#ifdef __UCLIBC_ABORT_INSTRUCTION__
+# define ABORT_INSTRUCTION __asm__(__UCLIBC_ABORT_INSTRUCTION__)
+#else
+# warning "no abort instruction defined for this arch"
+#endif
+
+/* have to check for kernel 2.5.35 too, since NR was earlier present */
+#if defined __NR_exit_group && __LINUX_KERNEL_VERSION >= 0x020600 \
+	&& defined __UCLIBC_HAS_THREADS__
+# undef __NR_exit
+# define __NR_exit __NR_exit_group
+#endif
 
 void _exit(int status)
 {
 	/* The loop is added only to keep gcc happy. */
 	while(1)
 	{
-#if defined __NR_exit_group && defined __UCLIBC_HAS_THREADS_NATIVE__
-		INLINE_SYSCALL(exit_group, 1, status);
-#endif
 		INLINE_SYSCALL(exit, 1, status);
+#ifdef ABORT_INSTRUCTION
+		ABORT_INSTRUCTION;
+#endif
 	}
 }
 libc_hidden_def(_exit)
+#ifdef __USE_ISOC99
 weak_alias(_exit,_Exit)
+#endif