[PIC]: Store into `errno' through the GOT.
[kopensolaris-gnu/glibc.git] / sysdeps / unix / i386 / sysdep.S
index 7fa7ee7..efe4f56 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1992, 1993, 1994, 1995 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
@@ -17,10 +17,36 @@ not, write to the Free Software Foundation, Inc., 675 Mass Ave,
 Cambridge, MA 02139, USA.  */
 
 #include <sysdep.h>
+#define _ERRNO_H
+#include <errnos.h>
 
 .globl C_SYMBOL_NAME(errno)
 .globl syscall_error
+
+#undef syscall_error
+#ifdef NO_UNDERSCORES
+__syscall_error:
+#else
 syscall_error:
+#endif
+#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.  */
+       cmpl $EWOULDBLOCK_sys, %eax /* Is it the old EWOULDBLOCK?  */
+       jne notb                /* Branch if not.  */
+       movl $EAGAIN, %eax      /* Yes; translate it to EAGAIN.  */
+#endif
+notb:
+#ifndef        PIC
        movl %eax, C_SYMBOL_NAME(errno)
+#else
+       /* Standard PIC nonsense to store into `errno' through the GOT.  */
+       call here
+here:  popl %ecx
+       addl $_GLOBAL_OFFSET_TABLE_+[.-here], %ecx
+       movl C_SYMBOL_NAME(errno@GOT)(%ecx), %ecx
+       movl %eax, (%ecx)
+#endif
        movl $-1, %eax
        ret