2002-09-30 Roland McGrath <roland@redhat.com>
[kopensolaris-gnu/glibc.git] / sysdeps / unix / i386 / sysdep.S
1 /* Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 2000, 2002
2         Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #include <sysdep.h>
21 #define _ERRNO_H
22 #include <bits/errno.h>
23 #include <bp-asm.h>
24 #include <bp-sym.h>
25
26 .globl C_SYMBOL_NAME(errno)
27 .globl syscall_error
28
29 #undef syscall_error
30 #ifdef NO_UNDERSCORES
31 __syscall_error:
32 #else
33 syscall_error:
34 #endif
35 #if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
36         /* We translate the system's EWOULDBLOCK error into EAGAIN.
37            The GNU C library always defines EWOULDBLOCK==EAGAIN.
38            EWOULDBLOCK_sys is the original number.  */
39         cmpl $EWOULDBLOCK_sys, %eax /* Is it the old EWOULDBLOCK?  */
40         jne notb                /* Branch if not.  */
41         movl $EAGAIN, %eax      /* Yes; translate it to EAGAIN.  */
42 notb:
43 #endif
44 #ifndef PIC
45 # if USE_TLS && HAVE___THREAD
46         movl %eax, %gs:C_SYMBOL_NAME(errno@NTPOFF)
47 # elif !defined _LIBC_REENTRANT
48         movl %eax, C_SYMBOL_NAME(errno)
49 # else
50         pushl %eax
51         PUSH_ERRNO_LOCATION_RETURN
52         call BP_SYM (__errno_location)
53         POP_ERRNO_LOCATION_RETURN
54         popl %ecx
55         movl %ecx, (%eax)
56 # endif
57 #else
58         /* The caller has pushed %ebx and then set it up to
59            point to the GOT before calling us through the PLT.  */
60 # if USE_TLS && HAVE___THREAD
61         movl C_SYMBOL_NAME(errno@GOTNTPOFF)(%ebx), %ecx
62
63         /* Pop %ebx value saved before jumping here.  */
64         popl %ebx
65         movl %eax, %gs:0(%ecx)
66 # elif !defined _LIBC_REENTRANT
67         movl C_SYMBOL_NAME(errno@GOT)(%ebx), %ecx
68
69         /* Pop %ebx value saved before jumping here.  */
70         popl %ebx
71         movl %eax, (%ecx)
72 # else
73         pushl %eax
74         PUSH_ERRNO_LOCATION_RETURN
75         call C_SYMBOL_NAME (BP_SYM (__errno_location)@PLT)
76         POP_ERRNO_LOCATION_RETURN
77         popl %ecx
78         /* Pop %ebx value saved before jumping here.  */
79         popl %ebx
80         movl %ecx, (%eax)
81 # endif
82 #endif
83         movl $-1, %eax
84         ret
85
86 #undef  __syscall_error
87 END (__syscall_error)