2005-12-27 Roland McGrath <roland@redhat.com>
[glibc-ports.git] / sysdeps / unix / arm / sysdep.S
blobdcb427e57fc1c5e498763c7082bbfa0b5e8b654a
1 /* Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2002, 2003,
2    2004, 2005
3    Free Software Foundation, Inc.
4    This file is part of the GNU C Library.
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
11    The GNU C Library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
16    You should have received a copy of the GNU Lesser General Public
17    License along with the GNU C Library; if not, write to the Free
18    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19    02111-1307 USA.  */
21 #include <sysdep.h>
22 #define _ERRNO_H
23 #include <bits/errno.h>
25 #ifdef IS_IN_rtld
26 # include <dl-sysdep.h>                 /* Defines RTLD_PRIVATE_ERRNO.  */
27 #endif
29 #include <tls.h>
31 #undef syscall_error
32 #ifdef NO_UNDERSCORES
33 __syscall_error:
34 #else
35 syscall_error:
36 #endif
37 #if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
38         /* We translate the system's EWOULDBLOCK error into EAGAIN.
39            The GNU C library always defines EWOULDBLOCK==EAGAIN.
40            EWOULDBLOCK_sys is the original number.  */
41         cmp r0, $EWOULDBLOCK_sys /* Is it the old EWOULDBLOCK?  */
42         moveq r0, $EAGAIN       /* Yes; translate it to EAGAIN.  */
43 #endif
45 #if USE___THREAD
46         mov ip, lr
47         mov r1, r0
49         mov r0, #0xffff0fff
50         mov lr, pc
51         sub pc, r0, #31
53         ldr r2, 1f
54 2:      ldr r2, [pc, r2]
55         str r1, [r0, r2]
56         mvn r0, #0
57         RETINSTR (, ip)
59 1:      .word errno(gottpoff) + (. - 2b - 8)
60 #elif RTLD_PRIVATE_ERRNO
61         ldr r1, 1f
62 0:      str r0, [pc, r1]
63         mvn r0, $0
64         DO_RET(r14)
66 1:      .word C_SYMBOL_NAME(rtld_errno) - 0b - 8
67 #elif defined(_LIBC_REENTRANT)
68         str lr, [sp, #-4]!
69         str r0, [sp, #-4]!
70         bl PLTJMP(C_SYMBOL_NAME(__errno_location))
71         ldr r1, [sp], #4
72         str r1, [r0]
73         mvn r0, $0
74         ldr pc, [sp], #4        
75 #else
76 #ifndef PIC
77         ldr r1, 1f
78         str r0, [r1]
79         mvn r0, $0
80         DO_RET (r14)
82 1:      .long C_SYMBOL_NAME(errno)
83 #else
84         @ we have to establish our PIC register
85         ldr r2, 1f
86         ldr r1, 2f
87 0:      add r2, pc, r2
88         str r0, [r1, r2]
89         mvn r0, $0
90         DO_RET (r14)
92 1:      .word _GLOBAL_OFFSET_TABLE_ - 0b - 8
93 2:      .word C_SYMBOL_NAME(errno)(GOTOFF)
94 #endif
95 #endif
97 #undef  __syscall_error
98 END (__syscall_error)