From 11430a8e3c521e2bd8a2d0821a60c3b0d554e6ff Mon Sep 17 00:00:00 2001 From: "Peter S. Mazinger" Date: Tue, 12 Apr 2011 22:36:24 +0200 Subject: _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 Signed-off-by: Bernhard Reutner-Fischer --- libc/sysdeps/linux/common/_exit.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'libc/sysdeps/linux/common/_exit.c') diff --git a/libc/sysdeps/linux/common/_exit.c b/libc/sysdeps/linux/common/_exit.c index 2196a98fe..c9e73c546 100644 --- a/libc/sysdeps/linux/common/_exit.c +++ b/libc/sysdeps/linux/common/_exit.c @@ -10,17 +10,33 @@ #include #include #include +#include + +#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 -- cgit v1.2.3