d2c3d0916cede50824b7fd2df51112aa2f044363
[kopensolaris-gnu/glibc.git] / sysdeps / unix / x86_64 / sysdep.S
1 /* Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.  */
18
19 #include <sysdep.h>
20 #define _ERRNO_H
21 #include <bits/errno.h>
22 #include <bp-asm.h>
23 #include <bp-sym.h>
24 #include <tls.h>
25
26 #ifdef IS_IN_rtld
27 # include <dl-sysdep.h>         /* Defines RTLD_PRIVATE_ERRNO.  */
28 #endif
29
30 .globl C_SYMBOL_NAME(errno)
31 .globl syscall_error
32
33 #undef syscall_error
34 #ifdef NO_UNDERSCORES
35 __syscall_error:
36 #else
37 syscall_error:
38 #endif
39 #if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
40         /* We translate the system's EWOULDBLOCK error into EAGAIN.
41            The GNU C library always defines EWOULDBLOCK==EAGAIN.
42            EWOULDBLOCK_sys is the original number.  */
43         cmpq $EWOULDBLOCK_sys, %rax /* Is it the old EWOULDBLOCK?  */
44         jne notb                /* Branch if not.  */
45         movq $EAGAIN, %rax      /* Yes; translate it to EAGAIN.  */
46 notb:
47 #endif
48 #if USE___THREAD
49 # ifdef PIC
50         movq C_SYMBOL_NAME(errno@GOTTPOFF)(%rip), %rcx
51         movl %eax, %fs:0(%rcx)
52 # else
53         movl %eax, %fs:C_SYMBOL_NAME(errno@TPOFF)
54 # endif
55 #elif !defined PIC
56 # ifndef _LIBC_REENTRANT
57         movl %eax, C_SYMBOL_NAME(errno)
58 # else
59         pushq %rax
60         cfi_adjust_cfa_offset(8)
61         PUSH_ERRNO_LOCATION_RETURN
62         call BP_SYM (__errno_location)
63         POP_ERRNO_LOCATION_RETURN
64         popq %rcx
65         cfi_adjust_cfa_offset(-8)
66         movl %ecx, (%rax)
67 # endif
68 #else
69 # if RTLD_PRIVATE_ERRNO
70         leaq errno(%rip), %rcx
71         movl %eax, (%rcx)
72 # elif !defined _LIBC_REENTRANT
73         movq C_SYMBOL_NAME(errno)@GOTPCREL(%rip), %rcx
74         movl %eax, (%rcx)
75 # else
76         pushq %rax
77         cfi_adjust_cfa_offset(8)
78         PUSH_ERRNO_LOCATION_RETURN
79         call C_SYMBOL_NAME (BP_SYM (__errno_location)@PLT)
80         POP_ERRNO_LOCATION_RETURN
81         popq %rcx
82         cfi_adjust_cfa_offset(-8)
83         movl %ecx, (%rax)
84 # endif
85 #endif
86         movq $-1, %rax
87         ret
88
89 #undef  __syscall_error
90 END (__syscall_error)