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