about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog37
-rw-r--r--nptl/ChangeLog2
-rw-r--r--nptl/pthreadP.h3
-rw-r--r--nptl_db/ChangeLog6
-rw-r--r--nptl_db/td_ta_event_getmsg.c3
-rw-r--r--sysdeps/i386/bits/byteswap.h41
-rw-r--r--sysdeps/ia64/bits/byteswap.h38
-rw-r--r--sysdeps/s390/bits/byteswap.h50
-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
12 files changed, 192 insertions, 88 deletions
diff --git a/ChangeLog b/ChangeLog
index 704edc0dc8..a7536f9333 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,40 @@
+2003-01-06  Philip Blundell  <philb@gnu.org>
+
+	* sysdeps/unix/arm/sysdep.S (syscall_error): Optimise a little.
+	[__LIBC_REENTRANT]: Unify PIC and non-PIC cases.
+
+	* sysdeps/unix/sysv/linux/arm/sysdep.h (PSEUDO): Remove .type
+	directive.
+	(PSEUDO_RET): Use SYSCALL_ERROR in place of __syscall_error.
+	(SYSCALL_ERROR): New.
+	(SYSCALL_ERROR_HANDLER) [NOT_IN_libc]: Provide local copy of error
+	handling code.
+	(INTERNAL_SYSCALL): Define.
+	(INLINE_SYSCALL): Use it.
+	(INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO): Define.
+	* sysdeps/unix/sysv/linux/arm/socket.S (__socket): Use
+	SYSCALL_ERROR in place of __syscall_error.
+
+2003-01-07  Jakub Jelinek  <jakub@redhat.com>
+
+	* sysdeps/ia64/bits/byteswap.h [__GNUC__ >= 2] (__bswap_16,
+	__bswap_32, __bswap_64): Put x into temporary variable
+	to avoid warnings.
+	[!__GNUC__] (__bswap_16, __bswap_32, __bswap_64): Change into static
+	(inline) functions.
+	* sysdeps/s390/bits/byteswap.h [__GNUC__ >= 2] (__bswap_16,
+	__bswap_32, __bswap_64): Put x into temporary variable
+	to avoid warnings.
+	[!__GNUC__] (__bswap_16, __bswap_32, __bswap_64): Change into static
+	(inline) functions.
+	* sysdeps/i386/bits/byteswap.h [!__GNUC__] (__bswap_16, __bswap_32):
+	Likewise.
+
+2003-01-07  Jakub Jelinek  <jakub@redhat.com>
+
+	* sysdeps/unix/sysv/linux/alpha/adjtime.c (ntp_adjtime): New weak
+	alias.
+
 2003-01-07  Jakub Jelinek  <jakub@redhat.com>
 
 	* elf/rtld.c (_rtld_global): Remove _dl_dynamic_weak initializer.
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index aa422d3c46..3afa3e6754 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,5 +1,7 @@
 2003-01-07  Jakub Jelinek  <jakub@redhat.com>
 
+	* pthreadP.h (__pthread_cond_timedwait): Add prototype.
+
 	* sysdeps/unix/sysv/linux/i386/dl-sysdep.h
 	(RTLD_CORRECT_DYNAMIC_WEAK): Remove.
 	(DL_SYSINFO_IMPLEMENTATION): Change into .text section and back.
diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h
index b298524245..3223291dab 100644
--- a/nptl/pthreadP.h
+++ b/nptl/pthreadP.h
@@ -260,6 +260,9 @@ extern int __pthread_cond_init (pthread_cond_t *cond,
 				const pthread_condattr_t *cond_attr);
 extern int __pthread_cond_signal (pthread_cond_t *cond);
 extern int __pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex);
+extern int __pthread_cond_timedwait (pthread_cond_t *cond,
+				     pthread_mutex_t *mutex,
+				     const struct timespec *abstime);
 extern int __pthread_condattr_destroy (pthread_condattr_t *attr);
 extern int __pthread_condattr_init (pthread_condattr_t *attr);
 extern int __pthread_key_create (pthread_key_t *key, void (*destr) (void *));
diff --git a/nptl_db/ChangeLog b/nptl_db/ChangeLog
index c15ba3f5ab..d4a4ad0d5c 100644
--- a/nptl_db/ChangeLog
+++ b/nptl_db/ChangeLog
@@ -1,4 +1,8 @@
-2003-01-05  Ulrich Drepper  <drepper@redhat.com>
+2003-01-07  Jakub Jelinek  <jakub@redhat.com>
+
+	* td_ta_event_getmsg.c: Include assert.h.
+
+-2003-01-05  Ulrich Drepper  <drepper@redhat.com>
 
 	* Makefile (libthread_db.so-no-z-defs): Define.
 
diff --git a/nptl_db/td_ta_event_getmsg.c b/nptl_db/td_ta_event_getmsg.c
index 919ba6569b..ae3f8e7fa6 100644
--- a/nptl_db/td_ta_event_getmsg.c
+++ b/nptl_db/td_ta_event_getmsg.c
@@ -1,5 +1,5 @@
 /* Retrieve event.
-   Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2001, 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 1999.
 
@@ -18,6 +18,7 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
+#include <assert.h>
 #include <stddef.h>
 #include <string.h>
 
diff --git a/sysdeps/i386/bits/byteswap.h b/sysdeps/i386/bits/byteswap.h
index db8b15d4d3..0d7d75cb42 100644
--- a/sysdeps/i386/bits/byteswap.h
+++ b/sysdeps/i386/bits/byteswap.h
@@ -28,8 +28,9 @@
 #define __bswap_constant_16(x) \
      ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
 
-#if defined __GNUC__ && __GNUC__ >= 2
-# define __bswap_16(x) \
+#ifdef __GNUC__
+# if __GNUC__ >= 2
+#  define __bswap_16(x) \
      (__extension__							      \
       ({ register unsigned short int __v, __x = (x);			      \
 	 if (__builtin_constant_p (__x))				      \
@@ -40,24 +41,31 @@
  		    : "0" (__x)						      \
  		    : "cc");						      \
 	 __v; }))
-#else
+# else
 /* This is better than nothing.  */
-# define __bswap_16(x) \
+#  define __bswap_16(x) \
      (__extension__							      \
       ({ register unsigned short int __x = (x); __bswap_constant_16 (__x); }))
+# endif
+#else
+static __inline unsigned short int
+__bswap_16 (unsigned short int __bsx)
+{
+  return __bswap_constant_16 (__bsx);
+}
 #endif
 
-
 /* Swap bytes in 32 bit value.  */
 #define __bswap_constant_32(x) \
      ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) |		      \
       (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))
 
-#if defined __GNUC__ && __GNUC__ >= 2
+#ifdef __GNUC__
+# if __GNUC__ >= 2
 /* To swap the bytes in a word the i486 processors and up provide the
    `bswap' opcode.  On i386 we have to use three instructions.  */
-# if !defined __i486__ && !defined __pentium__ && !defined __pentiumpro__
-#  define __bswap_32(x)							      \
+#  if !defined __i486__ && !defined __pentium__ && !defined __pentiumpro__
+#   define __bswap_32(x)						      \
      (__extension__							      \
       ({ register unsigned int __v, __x = (x);				      \
 	 if (__builtin_constant_p (__x))				      \
@@ -70,8 +78,8 @@
 		    : "0" (__x)						      \
 		    : "cc");						      \
 	 __v; }))
-# else
-#  define __bswap_32(x) \
+#  else
+#   define __bswap_32(x) \
      (__extension__							      \
       ({ register unsigned int __v, __x = (x);				      \
 	 if (__builtin_constant_p (__x))				      \
@@ -79,11 +87,18 @@
 	 else								      \
 	   __asm__ ("bswap %0" : "=r" (__v) : "0" (__x));		      \
 	 __v; }))
-# endif
-#else
-# define __bswap_32(x) \
+#  endif
+# else
+#  define __bswap_32(x) \
      (__extension__							      \
       ({ register unsigned int __x = (x); __bswap_constant_32 (__x); }))
+# endif
+#else
+static __inline unsigned int
+__bswap_32 (unsigned int __bsx)
+{
+  return __bswap_constant_32 (__bsx);
+}
 #endif
 
 
diff --git a/sysdeps/ia64/bits/byteswap.h b/sysdeps/ia64/bits/byteswap.h
index 285102c3df..6862aa0b60 100644
--- a/sysdeps/ia64/bits/byteswap.h
+++ b/sysdeps/ia64/bits/byteswap.h
@@ -1,5 +1,5 @@
 /* Macros to swap the order of bytes in integer values.
-   Copyright (C) 1997, 1998, 2000, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1997, 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
@@ -31,18 +31,22 @@
 #if defined __GNUC__ && __GNUC__ >= 2
 # define __bswap_16(x) \
      (__extension__							      \
-      ({ register unsigned short int __v;				      \
+      ({ register unsigned short int __v, __x = (x);			      \
 	 if (__builtin_constant_p (x))					      \
-	   __v = __bswap_constant_16 (x);				      \
+	   __v = __bswap_constant_16 (__x);				      \
 	 else								      \
 	   __asm__ __volatile__ ("shl %0 = %1, 48 ;;"			      \
 				 "mux1 %0 = %0, @rev ;;"		      \
 				 : "=r" (__v)				      \
-				 : "r" ((unsigned short int) (x)));	      \
+				 : "r" ((unsigned short int) (__x)));	      \
 	 __v; }))
 #else
 /* This is better than nothing.  */
-# define __bswap_16(x) __bswap_constant_16 (x)
+static __inline unsigned short int
+__bswap_16 (unsigned short int __bsx)
+{
+  return __bswap_constant_16 (__bsx);
+}
 #endif
 
 
@@ -54,17 +58,21 @@
 #if defined __GNUC__ && __GNUC__ >= 2
 # define __bswap_32(x) \
      (__extension__							      \
-      ({ register unsigned int __v;					      \
+      ({ register unsigned int __v, __x = (x);				      \
 	 if (__builtin_constant_p (x))					      \
-	   __v = __bswap_constant_32 (x);				      \
+	   __v = __bswap_constant_32 (__x);				      \
 	 else								      \
 	   __asm__ __volatile__ ("shl %0 = %1, 32 ;;"			      \
 				 "mux1 %0 = %0, @rev ;;"		      \
 				 : "=r" (__v)				      \
-				 : "r" ((unsigned int) (x)));		      \
+				 : "r" ((unsigned int) (__x)));		      \
 	 __v; }))
 #else
-# define __bswap_32(x) __bswap_constant_32 (x)
+static __inline unsigned int
+__bswap_32 (unsigned int __bsx)
+{
+  return __bswap_constant_32 (__bsx);
+}
 #endif
 
 
@@ -82,17 +90,21 @@
 #if defined __GNUC__ && __GNUC__ >= 2
 # define __bswap_64(x) \
      (__extension__							      \
-      ({ register unsigned long int __v;				      \
+      ({ register unsigned long int __v, __x = (x);			      \
 	 if (__builtin_constant_p (x))					      \
-	   __v = __bswap_constant_64 (x);				      \
+	   __v = __bswap_constant_64 (__x);				      \
 	 else								      \
 	   __asm__ __volatile__ ("mux1 %0 = %1, @rev ;;"		      \
 				 : "=r" (__v)				      \
-				 : "r" ((unsigned long int) (x)));	      \
+				 : "r" ((unsigned long int) (__x)));	      \
          __v; }))
 
 #else
-# define __bswap_64(x) __bswap_constant_64 (x)
+static __inline unsigned long int
+__bswap_64 (unsigned long int __bsx)
+{
+  return __bswap_constant_64 (__bsx);
+}
 #endif
 
 #endif /* _BITS_BYTESWAP_H */
diff --git a/sysdeps/s390/bits/byteswap.h b/sysdeps/s390/bits/byteswap.h
index 6a4b4ae425..d0e31b8364 100644
--- a/sysdeps/s390/bits/byteswap.h
+++ b/sysdeps/s390/bits/byteswap.h
@@ -1,5 +1,5 @@
 /* Macros to swap the order of bytes in integer values.  s390 version.
-   Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
    Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
    This file is part of the GNU C Library.
 
@@ -35,11 +35,11 @@
 # if __WORDSIZE == 64
 #  define __bswap_16(x) \
      (__extension__							      \
-      ({ unsigned short int __v;		                              \
+      ({ unsigned short int __v, __x = (x);	                              \
 	 if (__builtin_constant_p (x))					      \
-	   __v = __bswap_constant_16 (x);				      \
+	   __v = __bswap_constant_16 (__x);				      \
 	 else {								      \
-           unsigned short int __tmp = (unsigned short int) (x);               \
+           unsigned short int __tmp = (unsigned short int) (__x);             \
            __asm__ __volatile__ (                                             \
               "lrvh %0,%1"                                                    \
               : "=&d" (__v) : "m" (__tmp) );                                  \
@@ -48,11 +48,11 @@
 # else
 #  define __bswap_16(x) \
      (__extension__							      \
-      ({ unsigned short int __v;		                              \
+      ({ unsigned short int __v, __x = (x);	                              \
 	 if (__builtin_constant_p (x))					      \
-	   __v = __bswap_constant_16 (x);				      \
+	   __v = __bswap_constant_16 (__x);				      \
 	 else {								      \
-           unsigned short int __tmp = (unsigned short int) (x);               \
+           unsigned short int __tmp = (unsigned short int) (__x);             \
            __asm__ __volatile__ (                                             \
               "sr   %0,%0\n"                                                  \
               "la   1,%1\n"                                                   \
@@ -64,7 +64,11 @@
 # endif
 #else
 /* This is better than nothing.  */
-#define __bswap_16(x) __bswap_constant_16 (x)
+static __inline unsigned short int
+__bswap_16 (unsigned short int __bsx)
+{
+  return __bswap_constant_16 (__bsx);
+}
 #endif
 
 /* Swap bytes in 32 bit value.  */
@@ -76,11 +80,11 @@
 # if __WORDSIZE == 64
 #  define __bswap_32(x) \
      (__extension__							      \
-      ({ unsigned int __v;					              \
+      ({ unsigned int __v, __x = (x);				              \
 	 if (__builtin_constant_p (x))					      \
-	   __v = __bswap_constant_32 (x);				      \
+	   __v = __bswap_constant_32 (__x);				      \
 	 else {								      \
-           unsigned int __tmp = (unsigned int) (x);                           \
+           unsigned int __tmp = (unsigned int) (__x);                         \
            __asm__ __volatile__ (                                             \
               "lrv   %0,%1"                                                   \
               : "=&d" (__v) : "m" (__tmp));                                   \
@@ -89,11 +93,11 @@
 # else
 #  define __bswap_32(x) \
      (__extension__							      \
-      ({ unsigned int __v;				                      \
+      ({ unsigned int __v, __x = (x);			                      \
 	 if (__builtin_constant_p (x))					      \
-	   __v = __bswap_constant_32 (x);				      \
+	   __v = __bswap_constant_32 (__x);				      \
 	 else {								      \
-           unsigned int __tmp = (unsigned int) (x);                           \
+           unsigned int __tmp = (unsigned int) (__x);                         \
            __asm__ __volatile__ (                                             \
               "la    1,%1\n"                                                  \
               "icm   %0,8,3(1)\n"                                             \
@@ -105,7 +109,11 @@
 	 __v; }))
 # endif
 #else
-# define __bswap_32(x) __bswap_constant_32 (x)
+static __inline unsigned int
+__bswap_32 (unsigned int __bsx)
+{
+  return __bswap_constant_32 (__bsx);
+}
 #endif
 
 /* Swap bytes in 64 bit value.  */
@@ -119,11 +127,11 @@
 # if __WORDSIZE == 64
 #  define __bswap_64(x) \
      (__extension__							      \
-      ({ unsigned long __w;					              \
+      ({ unsigned long __w, __x = (x);				              \
 	 if (__builtin_constant_p (x))					      \
-	   __w = __bswap_constant_64 (x);				      \
+	   __w = __bswap_constant_64 (__x);				      \
 	 else {								      \
-           unsigned long __tmp = (unsigned long) (x);                         \
+           unsigned long __tmp = (unsigned long) (__x);                       \
            __asm__ __volatile__ (                                             \
               "lrvg  %0,%1"                                                   \
               : "=&d" (__w) : "m" (__tmp));                                   \
@@ -140,7 +148,11 @@
           __r.__ll; })
 # endif
 #else
-# define __bswap_64(x) __bswap_constant_64 (x)
+static __inline unsigned long long int
+__bswap_64 (unsigned long long int __bsx)
+{
+  return __bswap_constant_64 (__bsx);
+}
 #endif
 
 #endif /* _BITS_BYTESWAP_H */
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)				\