]>
Commit | Line | Data |
---|---|---|
dff8da6b | 1 | /* Copyright (C) 1999-2024 Free Software Foundation, Inc. |
d5efd131 | 2 | This file is part of the GNU C Library. |
d5efd131 MF |
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 | |
75efb018 | 15 | License along with the GNU C Library; if not, see |
5a82c748 | 16 | <https://www.gnu.org/licenses/>. */ |
d5efd131 MF |
17 | |
18 | #include <sysdep.h> | |
19 | #include <features.h> | |
20 | #include <tls.h> | |
21 | ||
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 | |
4f41c682 | 36 | # if IS_IN (libc) |
d5efd131 MF |
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) | |
50 | ||
51 | ENTRY(__ia64_syscall) | |
52 | mov r15=r37 /* syscall number */ | |
a1bd5f86 | 53 | break __IA64_BREAK_SYSCALL |
d5efd131 MF |
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) |