*** empty log message ***
authorAndreas Schwab <schwab@suse.de>
Sat, 21 Dec 2002 20:09:41 +0000 (20:09 +0000)
committerAndreas Schwab <schwab@suse.de>
Sat, 21 Dec 2002 20:09:41 +0000 (20:09 +0000)
(SYSCALL_ERROR_HANDLER): Define RTLD_PRIVATE_ERRNO variant.

ChangeLog
sysdeps/unix/sysv/linux/m68k/brk.c
sysdeps/unix/sysv/linux/m68k/sysdep.h

index c4c8ad1..ffdcc59 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,7 @@
        * sysdeps/unix/sysv/linux/m68k/sysdep.h (INTERNAL_SYSCALL): Define.
        (INLINE_SYSCALL): Use it.
        (INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO): Define.
+       (SYSCALL_ERROR_HANDLER): Define RTLD_PRIVATE_ERRNO variant.
 
        * sysdeps/unix/sysv/linux/m68k/getpagesize.c: Use INTERNAL_SYSCALL.
        * sysdeps/unix/sysv/linux/m68k/brk.c: Likewise.
index adf6c64..396b97d 100644 (file)
@@ -33,7 +33,7 @@ __brk (void *addr)
 {
   void *newbrk;
 
-  newbrk = INTERNAL_SYSCALL (brk, 1, addr);
+  newbrk = (void *) INTERNAL_SYSCALL (brk, 1, addr);
   __curbrk = newbrk;
 
   if (newbrk < addr)
index 005e60f..06033f4 100644 (file)
@@ -21,6 +21,9 @@
 #include <sysdeps/unix/sysdep.h>
 #include <sysdeps/m68k/sysdep.h>
 
+/* Defines RTLD_PRIVATE_ERRNO.  */
+#include <dl-sysdep.h>
+
 /* 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
   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: