aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix')
-rw-r--r--sysdeps/unix/arm/sysdep.S52
-rw-r--r--sysdeps/unix/sysv/linux/alpha/adjtime.c3
-rw-r--r--sysdeps/unix/sysv/linux/arm/socket.S2
-rw-r--r--sysdeps/unix/sysv/linux/arm/sysdep.h43
4 files changed, 59 insertions, 41 deletions
diff --git a/sysdeps/unix/arm/sysdep.S b/sysdeps/unix/arm/sysdep.S
index 6487caa919..5fc80a872e 100644
--- a/sysdeps/unix/arm/sysdep.S
+++ b/sysdeps/unix/arm/sysdep.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991,92,93,94,95,96,97,98 Free Software Foundation, Inc.
+/* Copyright (C) 1991,92,93,94,95,96,97,98,2002,03 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -37,42 +37,34 @@ syscall_error:
moveq r0, $EAGAIN /* Yes; translate it to EAGAIN. */
#endif
-#ifndef PIC
- ldr r1, _errno_loc
- str r0, [r1]
#ifdef _LIBC_REENTRANT
- stmdb sp!, {r0, lr}
- /* put another copy of r0 at a specific errno location */
- bl C_SYMBOL_NAME(__errno_location)
- ldmia sp!, {r1, lr}
+ str lr, [sp, #-4]!
+ str r0, [sp, #-4]!
+ bl PLTJMP(C_SYMBOL_NAME(__errno_location))
+ ldr r1, [sp], #4
str r1, [r0]
-#endif
+ mvn r0, $0
+ ldr pc, [sp], #4
#else
- stmdb sp!,{r10, lr}
- @ we have to establish our PIC register
- ldr r10, 1f
- add r10, pc, r10
-0: ldr r1, 2f
- ldr r1, [r10, r1]
- @ store a copy in _errno_loc
+#ifndef PIC
+ ldr r1, 1f
str r0, [r1]
-#ifdef _LIBC_REENTRANT
- @ and another copy in thread copy of _errno_loc
- mov r10, r0
- bl __errno_location(PLT)
- str r10, [r0]
-#endif
- ldmia sp!, {r10, lr}
- b 4f
-1: .word _GLOBAL_OFFSET_TABLE_ - 0b - 4
-2: .word C_SYMBOL_NAME(errno)(GOT)
-4:
-#endif
mvn r0, $0
RETINSTR(mov, pc, r14)
-#ifndef PIC
-_errno_loc: .long C_SYMBOL_NAME(errno)
+1: .long C_SYMBOL_NAME(errno)
+#else
+ @ we have to establish our PIC register
+ ldr r2, 1f
+ ldr r1, 2f
+0: add r2, pc, r2
+ str r0, [r1, r2]
+ mvn r0, $0
+ RETINSTR(mov, pc, r14)
+
+1: .word _GLOBAL_OFFSET_TABLE_ - 0b - 8
+2: .word C_SYMBOL_NAME(errno)(GOTOFF)
+#endif
#endif
#undef __syscall_error
diff --git a/sysdeps/unix/sysv/linux/alpha/adjtime.c b/sysdeps/unix/sysv/linux/alpha/adjtime.c
index 2bed884ae4..34df942257 100644
--- a/sysdeps/unix/sysv/linux/alpha/adjtime.c
+++ b/sysdeps/unix/sysv/linux/alpha/adjtime.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 2000, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 2000, 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -191,5 +191,6 @@ __adjtimex_tv64 (struct timex *tx)
strong_alias (__adjtimex_tv64, __adjtimex_internal);
strong_alias (__adjtimex_tv64, __adjtimex_tv64p);
+weak_alias (__adjtimex_tv64, ntp_adjtime);
versioned_symbol (libc, __adjtimex_tv64, __adjtimex, GLIBC_2_1);
versioned_symbol (libc, __adjtimex_tv64p, adjtimex, GLIBC_2_1);
diff --git a/sysdeps/unix/sysv/linux/arm/socket.S b/sysdeps/unix/sysv/linux/arm/socket.S
index 2672de7b2c..f4ccc5465d 100644
--- a/sysdeps/unix/sysv/linux/arm/socket.S
+++ b/sysdeps/unix/sysv/linux/arm/socket.S
@@ -79,7 +79,7 @@ ENTRY (__socket)
/* r0 is < 0 if there was an error. */
cmn r0, $124
RETINSTR(movcc, pc, r14)
- b PLTJMP(syscall_error)
+ b PLTJMP(SYSCALL_ERROR)
PSEUDO_END (__socket)
diff --git a/sysdeps/unix/sysv/linux/arm/sysdep.h b/sysdeps/unix/sysv/linux/arm/sysdep.h
index cdb1d8ed3b..e7caaa1480 100644
--- a/sysdeps/unix/sysv/linux/arm/sysdep.h
+++ b/sysdeps/unix/sysv/linux/arm/sysdep.h
@@ -49,14 +49,13 @@
#undef PSEUDO
#define PSEUDO(name, syscall_name, args) \
.text; \
- .type syscall_error,%function; \
ENTRY (name); \
DO_CALL (syscall_name, args); \
cmn r0, $4096;
#define PSEUDO_RET \
RETINSTR(movcc, pc, lr); \
- b PLTJMP(__syscall_error)
+ b PLTJMP(SYSCALL_ERROR)
#undef ret
#define ret PSEUDO_RET
@@ -65,7 +64,22 @@
SYSCALL_ERROR_HANDLER \
END (name)
-#define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */
+#if NOT_IN_libc
+# define SYSCALL_ERROR __local_syscall_error
+# define SYSCALL_ERROR_HANDLER \
+__local_syscall_error: \
+ str lr, [sp, #-4]!; \
+ str r0, [sp, #-4]!; \
+ bl PLTJMP(C_SYMBOL_NAME(__errno_location)); \
+ ldr r1, [sp], #4; \
+ rsb r1, r1, #0; \
+ str r1, [r0]; \
+ mvn r0, #0; \
+ ldr pc, [sp], #4;
+#else
+# define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */
+# define SYSCALL_ERROR __syscall_error
+#endif
/* Linux takes system call args in registers:
syscall number in the SWI instruction
@@ -123,7 +137,17 @@
/* Define a macro which expands into the inline wrapper code for a system
call. */
#undef INLINE_SYSCALL
-#define INLINE_SYSCALL(name, nr, args...) \
+#define INLINE_SYSCALL(name, nr, args...) \
+ ({ unsigned int _sys_result = INTERNAL_SYSCALL (name, nr, args); \
+ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (_sys_result), 0)) \
+ { \
+ __set_errno (INTERNAL_SYSCALL_ERRNO (_sys_result)); \
+ _sys_result = (unsigned int) -1; \
+ } \
+ (int) _sys_result; })
+
+#undef INTERNAL_SYSCALL
+#define INTERNAL_SYSCALL(name, nr, args...) \
({ unsigned int _sys_result; \
{ \
register int _a1 asm ("a1"); \
@@ -134,13 +158,14 @@
: "a1", "memory"); \
_sys_result = _a1; \
} \
- if (_sys_result >= (unsigned int) -4095) \
- { \
- __set_errno (-_sys_result); \
- _sys_result = (unsigned int) -1; \
- } \
(int) _sys_result; })
+#undef INTERNAL_SYSCALL_ERROR_P
+#define INTERNAL_SYSCALL_ERROR_P(val) ((unsigned int) (val) >= 0xfffff001u)
+
+#undef INTERNAL_SYSCALL_ERRNO
+#define INTERNAL_SYSCALL_ERRNO(val) (-(val))
+
#define LOAD_ARGS_0()
#define ASM_ARGS_0
#define LOAD_ARGS_1(a1) \