Update copyright dates with scripts/update-copyrights
[glibc.git] / sysdeps / unix / sysv / linux / ia64 / sysdep.S
blob165cbd157c5b604280566c05272bfb8473a2c26f
1 /* Copyright (C) 1999-2023 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
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.
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.
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <https://www.gnu.org/licenses/>.  */
18 #include <sysdep.h>
19 #include <features.h>
20 #include <tls.h>
22 ENTRY(__syscall_error)
23 #if RTLD_PRIVATE_ERRNO
24         /*
25          * Note that the gp has to be set properly for this to work.
26          * As long as all syscalls are in the same load unit
27          * (executable or shared library) as this routine, we should
28          * be fine.  Otherwise, we would have to first load the global
29          * pointer register from __gp.
30          */
31         addl    r2=@gprel(rtld_errno),gp
32         ;;
33         st4     [r2]=r8
34         mov     r8=-1
35 #else
36 # if IS_IN (libc)
37 #  define SYSCALL_ERROR_ERRNO __libc_errno
38 # else
39 #  define SYSCALL_ERROR_ERRNO errno
40 # endif
41         addl    r2=@ltoff(@tprel(SYSCALL_ERROR_ERRNO)), gp;;
42         ld8     r2=[r2]
43         mov     r3=r8;;
44         mov     r8=-1
45         add     r2=r2,r13;;
46         st4     [r2]=r3
47 #endif
48         ret                     // ret is #define'd in syscall.h!
49 END(__syscall_error)
51 ENTRY(__ia64_syscall)
52         mov r15=r37             /* syscall number */
53         break __IA64_BREAK_SYSCALL
54         cmp.eq p6,p0=-1,r10     /* r10 = -1 on error */
55 (p6)    br.cond.spnt.few __syscall_error
56         ret
57 PSEUDO_END(__ia64_syscall)