1 /* Copyright (C) 1993, 1996, 1998, 2002, 2003, 2004
2 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4 Contributed by Brendan Kehoe (brendan@zen.org).
6 The GNU C Library is free software; you can redistribute it and/or
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.
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
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, write to the Free
18 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
24 #if defined(__ELF__) && defined(PIC)
25 /* Put this at the end of libc's text segment so that all of
26 the direct branches from the syscalls are forward, and
27 thus predicted not taken. */
28 .section .text.last, "ax", @progbits
34 /* When building a shared library, we branch here without
35 having loaded the GP. Nor, since it was a direct branch,
36 have we loaded PV with our address. Do both. */
37 # define LOADGP br pv, 1f; 1: ldgp gp, 0(pv)
38 # define PROLOGUE .prologue 0
41 /* When building the static library, we tail call here from
42 elsewhere, which might use a different GP. The entertaining
43 part is that we have to return with the GP of our caller
44 in place, so that linker relaxation works properly. */
45 /* ??? This is so ugly. Consider always putting the errno
46 setting code with the syscall in the static case. */
47 # define GPSAVEREG t10
48 # define LOADGP ldah t11, 0(pv) !gpdisp!1; \
51 1: mov gp, GPSAVEREG; \
52 lda gp, 0(t11) !gpdisp!1; \
57 # define PROLOGUE .prologue 1
58 # define EPILOGUE mov GPSAVEREG, gp
62 .globl __syscall_error
66 #if defined(_LIBC_REENTRANT) && USE___THREAD
69 # define SYSCALL_ERROR_ERRNO __libc_errno
71 # define SYSCALL_ERROR_ERRNO errno
78 ldq t1, SYSCALL_ERROR_ERRNO(gp) !gottprel
85 #elif defined(_LIBC_REENTRANT)
98 /* Find our per-thread errno address */
99 #if defined PIC && !defined IS_IN_librt
100 bsr ra, __errno_location !samegp
102 jsr ra, __errno_location
108 /* Store the error value. */
112 /* And kick back a -1. */
116 ldq GPSAVEREG, 16(sp)