diff options
Diffstat (limited to 'sysdeps/unix')
-rw-r--r-- | sysdeps/unix/arm/sysdep.S | 52 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/alpha/adjtime.c | 3 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/arm/socket.S | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/arm/sysdep.h | 43 |
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) \ |