summaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv')
-rw-r--r--sysdeps/unix/sysv/linux/Dist1
-rw-r--r--sysdeps/unix/sysv/linux/i386/Dist1
-rw-r--r--sysdeps/unix/sysv/linux/m68k/Dist1
-rw-r--r--sysdeps/unix/sysv/linux/m68k/sysdep.S39
-rw-r--r--sysdeps/unix/sysv/linux/m68k/sysdep.h20
5 files changed, 42 insertions, 20 deletions
diff --git a/sysdeps/unix/sysv/linux/Dist b/sysdeps/unix/sysv/linux/Dist
index a6b5db6749..db0cd6000d 100644
--- a/sysdeps/unix/sysv/linux/Dist
+++ b/sysdeps/unix/sysv/linux/Dist
@@ -1,3 +1,4 @@
+init-first.h
sysctl.c
net/if.h
nfs/nfs.h
diff --git a/sysdeps/unix/sysv/linux/i386/Dist b/sysdeps/unix/sysv/linux/i386/Dist
index 780edfca50..d5cc620549 100644
--- a/sysdeps/unix/sysv/linux/i386/Dist
+++ b/sysdeps/unix/sysv/linux/i386/Dist
@@ -1,3 +1,2 @@
sys/perm.h sys/vm86.h
-init-first.h
clone.S
diff --git a/sysdeps/unix/sysv/linux/m68k/Dist b/sysdeps/unix/sysv/linux/m68k/Dist
index a281cba3f9..738b9cc542 100644
--- a/sysdeps/unix/sysv/linux/m68k/Dist
+++ b/sysdeps/unix/sysv/linux/m68k/Dist
@@ -1,2 +1 @@
-init-first.h
clone.S
diff --git a/sysdeps/unix/sysv/linux/m68k/sysdep.S b/sysdeps/unix/sysv/linux/m68k/sysdep.S
index 895ea2770b..674715f824 100644
--- a/sysdeps/unix/sysv/linux/m68k/sysdep.S
+++ b/sysdeps/unix/sysv/linux/m68k/sysdep.S
@@ -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
diff --git a/sysdeps/unix/sysv/linux/m68k/sysdep.h b/sysdeps/unix/sysv/linux/m68k/sysdep.h
index fe2c6aa823..9de750c326 100644
--- a/sysdeps/unix/sysv/linux/m68k/sysdep.h
+++ b/sysdeps/unix/sysv/linux/m68k/sysdep.h
@@ -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: