Use correct definition of errno for NOT_IN_libc.
[kopensolaris-gnu/glibc.git] / sysdeps / unix / alpha / sysdep.S
1 /* Copyright (C) 1993, 1996, 1998, 2002 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Brendan Kehoe (brendan@zen.org).
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
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #include <sysdep.h>
21 #include <features.h>
22
23 #if defined(__ELF__) && defined(PIC)
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
29         .text
30 #endif
31
32 #ifdef PIC
33         /* When building a shared library, we branch here without
34            having loaded the GP.  Nor, since it was a direct branch,
35            have we loaded PV with our address.  Do both.  */
36 # define LOADGP         br pv, 1f; 1: ldgp gp, 0(pv)
37 # define PROLOGUE       .prologue 0
38 #else
39 # define LOADGP         ldgp gp, 0(pv)
40 # define PROLOGUE       .prologue 1
41 #endif
42
43         .align 4
44         .globl __syscall_error
45         .ent __syscall_error
46 __syscall_error:
47
48 #if defined(_LIBC_REENTRANT) && USE___THREAD
49
50 #ifndef NOT_IN_libc
51 # define SYSCALL_ERROR_ERRNO __libc_errno
52 #else
53 # define SYSCALL_ERROR_ERRNO errno
54 #endif
55
56         LOADGP
57         PROLOGUE
58         mov     v0, t0
59         call_pal PAL_rduniq
60         ldq     t1, SYSCALL_ERROR_ERRNO(gp) !gottprel
61         addq    v0, t1, v0
62         stl     t0, 0(v0)
63         lda     v0, -1
64         ret
65
66 #elif defined(_LIBC_REENTRANT)
67
68         LOADGP
69         lda     sp, -16(sp)
70         .frame  sp, 16, ra, 0
71         stq     ra, 0(sp)
72         stq     v0, 8(sp)
73         .mask   0x4000001, -16
74         PROLOGUE
75
76         /* Find our per-thread errno address  */
77 #ifdef PIC
78         bsr     ra, __errno_location    !samegp
79 #else
80         jsr     ra, __errno_location
81 #endif
82
83         /* Store the error value.  */
84         ldq     t0, 8(sp)
85         stl     t0, 0(v0)
86
87         /* And kick back a -1.  */
88         ldi     v0, -1
89
90         ldq     ra, 0(sp)
91         lda     sp, 16(sp)
92         ret
93
94 #else
95
96         LOADGP
97         PROLOGUE
98         stl     v0, errno
99         lda     v0, -1
100         ret
101
102 #endif
103
104         .end __syscall_error