]>
Commit | Line | Data |
---|---|---|
f7a9f785 | 1 | /* Copyright (C) 1999-2016 Free Software Foundation, Inc. |
d5efd131 MF |
2 | This file is part of the GNU C Library. |
3 | Contributed by David Mosberger-Tang <davidm@hpl.hp.com>. | |
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 | |
75efb018 MF |
16 | License along with the GNU C Library; if not, see |
17 | <http://www.gnu.org/licenses/>. */ | |
d5efd131 MF |
18 | |
19 | #include <sysdep.h> | |
20 | #include <features.h> | |
21 | #include <tls.h> | |
22 | ||
23 | ENTRY(__syscall_error) | |
24 | #if RTLD_PRIVATE_ERRNO | |
25 | /* | |
26 | * Note that the gp has to be set properly for this to work. | |
27 | * As long as all syscalls are in the same load unit | |
28 | * (executable or shared library) as this routine, we should | |
29 | * be fine. Otherwise, we would have to first load the global | |
30 | * pointer register from __gp. | |
31 | */ | |
32 | addl r2=@gprel(rtld_errno),gp | |
33 | ;; | |
34 | st4 [r2]=r8 | |
35 | mov r8=-1 | |
36 | #else | |
4f41c682 | 37 | # if IS_IN (libc) |
d5efd131 MF |
38 | # define SYSCALL_ERROR_ERRNO __libc_errno |
39 | # else | |
40 | # define SYSCALL_ERROR_ERRNO errno | |
41 | # endif | |
42 | addl r2=@ltoff(@tprel(SYSCALL_ERROR_ERRNO)), gp;; | |
43 | ld8 r2=[r2] | |
44 | mov r3=r8;; | |
45 | mov r8=-1 | |
46 | add r2=r2,r13;; | |
47 | st4 [r2]=r3 | |
48 | #endif | |
49 | ret // ret is #define'd in syscall.h! | |
50 | END(__syscall_error) | |
51 | ||
52 | ENTRY(__ia64_syscall) | |
53 | mov r15=r37 /* syscall number */ | |
54 | break __BREAK_SYSCALL | |
55 | cmp.eq p6,p0=-1,r10 /* r10 = -1 on error */ | |
56 | (p6) br.cond.spnt.few __syscall_error | |
57 | ret | |
58 | PSEUDO_END(__ia64_syscall) |