summaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/m68k/sysdep.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/m68k/sysdep.S')
-rw-r--r--sysdeps/unix/sysv/linux/m68k/sysdep.S39
1 files changed, 22 insertions, 17 deletions
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