* sysdeps/unix/sysv/linux/alpha/rt_sigaction.S: Fix .prologue;
[glibc.git] / sysdeps / unix / sysv / linux / alpha / rt_sigaction.S
blob56975849146e8c4a73f6fa510bb0c682c271a7ab
1 /* Copyright (C) 1998 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Richard Henderson <rth@cygnus.com>, 1998
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Library General Public License as
7    published by the Free Software Foundation; either version 2 of the
8    License, or (at your option) any later version.
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    Library General Public License for more details.
15    You should have received a copy of the GNU Library General Public
16    License along with the GNU C Library; see the file COPYING.LIB.  If not,
17    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18    Boston, MA 02111-1307, USA.  */
20 #include <sysdep.h>
22 /* On Alpha we desparately want to avoid having to issue an imb.  Ordinarily
23    the kernel would have to issue one after setting up the signal return
24    stack, but the Linux rt_sigaction syscall is prepared to accept a pointer
25    to the sigreturn syscall, instead of inlining it on the stack.
27    This just about halves signal delivery time.  */
29 #ifdef __NR_rt_sigaction
30         .text
31 ENTRY(__syscall_rt_sigaction)
32         .frame  sp,0,ra,0
33 #ifdef PROF
34         ldgp    gp,0(pv)
35         .set noat
36         lda     AT, _mcount
37         jsr     AT, (AT), _mcount
38         .set at
39 #endif
40         /* Indicate non-standard use of our PV.  */
41         .prologue 2
43         beq     a1, 0f
44         ldl     t0, 8(a1)                               # sa_flags
45         lda     a4, sigreturn-__syscall_rt_sigaction(pv)
46         lda     t1, rt_sigreturn-__syscall_rt_sigaction(pv)
47         and     t0, 0x00000040, t0                      # SA_SIGINFO
48         cmovne  t0, t1, a4
49 0:      ldi     v0,__NR_rt_sigaction
50         callsys
51         bne     a3,1f
52         ret
55 #ifndef PROF
56         br      gp,2f
57 2:      ldgp    gp,0(gp)
58 #endif
59         jmp     __syscall_error
61 END(__syscall_rt_sigaction)
63         .align  5
64         .ent    sigreturn
65 sigreturn:
66         .prologue 0
67         mov     sp,a0
68         ldi     v0,__NR_sigreturn
69         callsys
70         .end    sigreturn
72         .align  4
73         .ent    rt_sigreturn
74 rt_sigreturn:
75         .prologue 0
76         mov     sp,a0
77         ldi     v0,__NR_rt_sigreturn
78         callsys
79         .end    rt_sigreturn
80 #else
81 ENTRY(__syscall_rt_sigaction)
82         ldgp $29,0($27)
83         .prologue 1
84         ldi $0,ENOSYS
85         jmp __syscall_error
86 END(__syscall_rt_sigaction)
87 #endif