update from main archive 960906
[kopensolaris-gnu/glibc.git] / sysdeps / unix / alpha / sysdep.S
1 /* Copyright (C) 1993, 1996 Free Software Foundation, Inc.
2    Contributed by Brendan Kehoe (brendan@zen.org).
3
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public
15 License along with the GNU C Library; see the file COPYING.LIB.  If
16 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
17 Cambridge, MA 02139, USA.  */
18
19 #include <sysdep.h>
20 #include <features.h>
21
22         .section .bss
23         .globl errno
24         .align 2
25 errno:  .space 4
26 #ifdef __ELF__
27         .type errno, @object
28         .size errno, 4
29 #endif
30
31         .text
32         .align 2
33
34 #ifdef  _LIBC_REENTRANT
35
36         .globl __syscall_error
37         .ent __syscall_error
38 __syscall_error:
39         ldgp    gp, 0(t12)
40         lda     sp, -16(sp)
41         .frame  sp, 16, ra, 0
42         stq     ra, 0(sp)
43         stq     v0, 8(sp)
44         .mask   0x4000001, -16
45         .prologue 1
46
47         /* Find our pre-thread errno address  */
48         jsr     ra, __errno_location
49
50         /* Store the error value.  */
51         ldl     t0, 8(sp)
52         stl     t0, 0(v0)
53
54         /* And kick back a -1.  */
55         ldi     v0, -1
56
57         ldq     ra, 0(sp)
58         lda     sp, 16(sp)
59         ret
60         .end __syscall_error
61
62 /* A default non-threaded version of __errno_location that just returns
63    the address of errno.  */
64
65         .weak   __errno_location
66         .ent    __errno_location
67 __errno_location:
68         .frame  sp, 0, ra
69         ldgp    gp, 0(t12)
70         .mask   0, 0
71         .prologue 1
72
73         lda     v0, errno
74         ret
75         .end __errno_location
76
77 #else
78
79 ENTRY(__syscall_error)
80         ldgp    gp, 0(t12)
81         .prologue 1
82
83         stl     v0, errno
84         lda     v0, -1
85         ret
86         END(__syscall_error)
87
88 #endif /* _LIBC_REENTRANT */