]>
Commit | Line | Data |
---|---|---|
15be932d | 1 | /* Copyright (C) 1993, 1996, 1998, 2002, 2003, 2004, 2012 |
2acd67aa | 2 | Free Software Foundation, Inc. |
3214b89b | 3 | This file is part of the GNU C Library. |
77072f48 BK |
4 | Contributed by Brendan Kehoe (brendan@zen.org). |
5 | ||
f1fc1823 | 6 | The GNU C Library is free software; you can redistribute it and/or |
3214b89b AJ |
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. | |
77072f48 | 10 | |
f1fc1823 UD |
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 | |
3214b89b | 14 | Lesser General Public License for more details. |
77072f48 | 15 | |
3214b89b | 16 | You should have received a copy of the GNU Lesser General Public |
ab84e3ff PE |
17 | License along with the GNU C Library. If not, see |
18 | <http://www.gnu.org/licenses/>. */ | |
77072f48 BK |
19 | |
20 | #include <sysdep.h> | |
44b8acdd | 21 | #include <features.h> |
77072f48 | 22 | |
15be932d | 23 | #if defined(PIC) |
d5a256ad RM |
24 | /* Put this at the end of libc's text segment so that all of |
25 | the direct branches from the syscalls are forward, and | |
26 | thus predicted not taken. */ | |
27 | .section .text.last, "ax", @progbits | |
28 | #else | |
7cc46c19 | 29 | .text |
d5a256ad | 30 | #endif |
44b8acdd | 31 | |
15be932d RH |
32 | #ifndef NOT_IN_libc |
33 | # define SYSCALL_ERROR_ERRNO __libc_errno | |
d5a256ad | 34 | #else |
15be932d | 35 | # define SYSCALL_ERROR_ERRNO errno |
d5a256ad | 36 | #endif |
44b8acdd | 37 | |
d5a256ad | 38 | .align 4 |
15be932d RH |
39 | .globl __syscall_error |
40 | .ent __syscall_error | |
44b8acdd | 41 | __syscall_error: |
15be932d RH |
42 | /* When building a shared library, we branch here without having |
43 | loaded the GP. Nor, since it was a direct branch, have we | |
44 | loaded PV with our address. | |
d5a256ad | 45 | |
15be932d RH |
46 | When building a static library, we tail call here from another |
47 | object file, possibly with a different GP, and must return with | |
48 | the GP of our caller in place so that linker relaxation works. | |
df162e76 | 49 | |
15be932d RH |
50 | Both issues are solved by computing the GP into T1 instead of |
51 | clobbering the traditional GP register. */ | |
52 | .prologue 0 | |
d5a256ad | 53 | mov v0, t0 |
15be932d RH |
54 | br t1, 1f |
55 | 1: ldah t1, 0(t1) !gpdisp!1 | |
d5a256ad | 56 | call_pal PAL_rduniq |
e3829e90 | 57 | |
15be932d RH |
58 | lda t1, 0(t1) !gpdisp!1 |
59 | ldq t1, SYSCALL_ERROR_ERRNO(t1) !gottprel | |
60 | addq v0, t1, t1 | |
44b8acdd | 61 | lda v0, -1 |
44b8acdd | 62 | |
15be932d RH |
63 | stl t0, 0(t1) |
64 | ret | |
d5a256ad RM |
65 | |
66 | .end __syscall_error |