]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
update from main archive 960911
authorUlrich Drepper <drepper@redhat.com>
Thu, 12 Sep 1996 02:50:36 +0000 (02:50 +0000)
committerUlrich Drepper <drepper@redhat.com>
Thu, 12 Sep 1996 02:50:36 +0000 (02:50 +0000)
sysdeps/unix/sysv/linux/m68k/Dist
sysdeps/unix/sysv/linux/m68k/sysdep.S
sysdeps/unix/sysv/linux/m68k/sysdep.h

index a281cba3f941863b764236967c7556aa598875b9..738b9cc54201d9ee0e928a10338f74cf9ad76e7d 100644 (file)
@@ -1,2 +1 @@
-init-first.h
 clone.S
index 895ea2770b0cc1165c0e3d37f10bd22341d0482b..674715f8249847f77b8c6dbc21f0e2682b62d8fe 100644 (file)
@@ -33,8 +33,9 @@ errno:        .space 4
 _errno = errno /* This name is expected by hj libc.so.5 startup code.  */
        .text
 
-/* The following code is not used at all in the shared library.
-   The PIC system call stubs set errno themselves.  */
+/* The following code is only used in the shared library when we
+   compile the reentrant version.  Otherwise each system call defines
+   each own version.  */
 
 #ifndef        PIC
 
@@ -42,30 +43,34 @@ _errno = errno      /* This name is expected by hj libc.so.5 startup code.  */
 #define _ERRNO_H
 #include <errnos.h>
 
-.globl errno
-.globl __syscall_error
-
 /* The syscall stubs jump here when they detect an error.  */
 
 .globl __syscall_error
 __syscall_error:
        neg.l %d0
-
-#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
-       /* We translate the system's EWOULDBLOCK error into EAGAIN.
-          The GNU C library always defines EWOULDBLOCK==EAGAIN.
-          EWOULDBLOCK_sys is the original number.  */
-       move.l #EWOULDBLOCK_sys, %d1
-       cmp.l %d0, %d1
-       jne 1f
-       move.l #EAGAIN, %d0
-1:
-#endif
-
        move.l %d0, errno
+#ifdef _LIBC_REENTRANT
+       move.l %d0, -(%sp)
+       jbsr __errno_location
+       move.l (%sp)+, (%a0)
+#endif
        move.l #-1, %d0
        /* Copy return value to %a0 for syscalls that are declared to
           return a pointer.  */
        move.l %d0, %a0
        rts
+       .size   __syscall_error, . - __syscall_error
 #endif /* PIC */
+
+#ifdef _LIBC_REENTRANT
+       .globl  __errno_location
+       .type   __errno_location, @function
+__errno_location:
+#ifdef PIC
+       move.l  (%pc, errno@GOTPC), %a0
+#else
+       lea     errno, %a0
+#endif
+       rts
+       .size   __errno_location, . - __errno_location
+#endif
index fe2c6aa8233f4b4b3ce327f99a614bfba7f4472f..9de750c326bdabaace22328ed1d3b59651d8be7a 100644 (file)
@@ -78,19 +78,37 @@ Cambridge, MA 02139, USA.  */
 
 #ifdef PIC
 /* Store (- %d0) into errno through the GOT.  */
+#ifdef _LIBC_REENTRANT
 #define SYSCALL_ERROR_HANDLER                                                \
+    .type syscall_error, @function;                                          \
 syscall_error:                                                               \
     move.l (errno@GOTPC, %pc), %a0;                                          \
     neg.l %d0;                                                               \
     move.l %d0, (%a0);                                                       \
+    move.l %d0, -(%sp);                                                              \
+    jbsr __errno_location@PLTPC                                                      \
+    move.l (%sp)+, (%a0);                                                    \
     move.l POUND -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
+#define SYSCALL_ERROR_HANDLER                                                \
+    .type syscall_error, @function;                                          \
+syscall_error:                                                               \
+    move.l (errno@GOTPC, %pc), %a0;                                          \
+    neg.l %d0;                                                               \
+    move.l %d0, (%a0);                                                       \
+    move.l POUND -1, %d0;                                                    \
+    /* Copy return value to %a0 for syscalls that are declared to return      \
+       a pointer (e.g., mmap).  */                                           \
+    move.l %d0, %a0;                                                         \
+    rts;
+#endif /* _LIBC_REENTRANT */
+#else
 #define SYSCALL_ERROR_HANDLER  /* Nothing here; code in sysdep.S is used.  */
-#endif
+#endif /* PIC */
 
 /* Linux takes system call arguments in registers: