From 9ff11db453caef3db334ace74cc2b579ff7cccfa Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Sat, 21 Dec 2002 20:09:41 +0000 Subject: *** empty log message *** (SYSCALL_ERROR_HANDLER): Define RTLD_PRIVATE_ERRNO variant. --- sysdeps/unix/sysv/linux/m68k/sysdep.h | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) (limited to 'sysdeps/unix/sysv/linux/m68k/sysdep.h') diff --git a/sysdeps/unix/sysv/linux/m68k/sysdep.h b/sysdeps/unix/sysv/linux/m68k/sysdep.h index 005e60ffe1..06033f4756 100644 --- a/sysdeps/unix/sysv/linux/m68k/sysdep.h +++ b/sysdeps/unix/sysv/linux/m68k/sysdep.h @@ -21,6 +21,9 @@ #include #include +/* Defines RTLD_PRIVATE_ERRNO. */ +#include + /* For Linux we can use the system call table in the header file /usr/include/asm/unistd.h of the kernel. But these symbols do not follow the SYS_* syntax @@ -66,9 +69,21 @@ END (name) #ifdef PIC +# ifdef RTLD_PRIVATE_ERRNO +# define SYSCALL_ERROR_HANDLER \ +SYSCALL_ERROR_LABEL: \ + lea (errno, %pc), %a0; \ + neg.l %d0; \ + move.l %d0, (%a0); \ + move.l &-1, %d0; \ + /* Copy return value to %a0 for syscalls that are declared to return \ + a pointer (e.g., mmap). */ \ + move.l %d0, %a0; \ + rts; +# else /* !RTLD_PRIVATE_ERRNO */ /* Store (- %d0) into errno through the GOT. */ -#ifdef _LIBC_REENTRANT -#define SYSCALL_ERROR_HANDLER \ +# if defined _LIBC_REENTRANT +# define SYSCALL_ERROR_HANDLER \ SYSCALL_ERROR_LABEL: \ neg.l %d0; \ move.l %d0, -(%sp); \ @@ -79,8 +94,8 @@ SYSCALL_ERROR_LABEL: \ a pointer (e.g., mmap). */ \ move.l %d0, %a0; \ rts; -#else /* !_LIBC_REENTRANT */ -#define SYSCALL_ERROR_HANDLER \ +# else /* !_LIBC_REENTRANT */ +# define SYSCALL_ERROR_HANDLER \ SYSCALL_ERROR_LABEL: \ move.l (errno@GOTPC, %pc), %a0; \ neg.l %d0; \ @@ -90,9 +105,10 @@ SYSCALL_ERROR_LABEL: \ a pointer (e.g., mmap). */ \ move.l %d0, %a0; \ rts; -#endif /* _LIBC_REENTRANT */ +# endif /* _LIBC_REENTRANT */ +# endif /* RTLD_PRIVATE_ERRNO */ #else -#define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */ +# define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */ #endif /* PIC */ /* Linux takes system call arguments in registers: -- cgit v1.2.3