about summary refs log tree commit diff
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)				\