No longer build trampoline code.
[kopensolaris-gnu/glibc.git] / sysdeps / unix / sysv / linux / sparc / sparc32 / __sigtrampoline.S
1 /* Userland trampoline code for sigaction on Linux/SPARC        */
2 /* (C) 1996, 1997 Free Software Foundation, Inc.                */
3 /* This file is part of the GNU C Library.                      */
4 /* Contributed by Miguel de Icaza (miguel@gnu.ai.mit.edu)       */
5 /* Many thanks go to David Miller for explaining all this to me */
6 /* miguel@nuclecu.unam.mx                                       */
7 /* Sources:     David Miller, 4.4BSD/SPARC code                */
8
9 #include <sysdep.h>
10 #define __ASSEMBLY__
11 /* For REGWIN_SZ */
12 #include <asm/ptrace.h>
13 #include <asm/psr.h>
14
15 /* The C compiler frame size */
16 #define CCFSZ  96
17
18         .text
19
20 ENTRY(____sparc_signal_trampoline)
21         .global C_SYMBOL_NAME(____sig_table)
22
23         /* Make room for 32 %f registers + %fsr
24          * this is 132 bytes + alignement = 136
25          * 96 is the C frame size
26          */
27         save    %sp,-136-CCFSZ,%sp
28
29         /* save regular registers */
30         mov     %g2,%l2
31         mov     %g3,%l3
32         mov     %g4,%l4
33         mov     %g5,%l5
34         mov     %g6,%l6
35         mov     %g7,%l7
36
37        /* save fpu registers */
38         ld      [%fp+64+16+20],%l0      /* load the psr from sigcontext */
39         sethi   %hi(PSR_EF),%l1
40         andcc   %l0,%l1,%l0             /* is floating point enabled?   */
41         be      1f
42         rd      %y,%l1                  /* save y anyways */
43
44         /* save fpu registers */
45         st      %fsr, [%sp + CCFSZ + 0]
46         std     %f0, [%sp + CCFSZ + 8]
47         std     %f2, [%sp + CCFSZ + 16]
48         std     %f4, [%sp + CCFSZ + 24]
49         std     %f6, [%sp + CCFSZ + 32]
50         std     %f8, [%sp + CCFSZ + 40]
51         std     %f10, [%sp + CCFSZ + 48]
52         std     %f12, [%sp + CCFSZ + 56]
53         std     %f14, [%sp + CCFSZ + 64]
54         std     %f16, [%sp + CCFSZ + 72]
55         std     %f18, [%sp + CCFSZ + 80]
56         std     %f20, [%sp + CCFSZ + 88]
57         std     %f22, [%sp + CCFSZ + 96]
58         std     %f24, [%sp + CCFSZ + 104]
59         std     %f26, [%sp + CCFSZ + 112]
60         std     %f28, [%sp + CCFSZ + 120]
61         std     %f30, [%sp + CCFSZ + 128]
62
63 1:
64         /* Load signal number */
65         ld      [%fp + REGWIN_SZ],%o0
66         mov     %fp,%o1
67         mov     0xfea,%o2
68
69         /* Sanity check */
70         cmp     %o0,33
71         bl      1f
72         or      %g0,%g0,%g1     /*Call sys_setup */
73         t       0x10
74 1:
75 #ifdef PIC
76         /* Save return address */
77         mov     %o7,%o5
78 11:     call    12f
79          sethi  %hi(_GLOBAL_OFFSET_TABLE_-(11b-.)),%o4
80 12:     or      %o5,%lo(_GLOBAL_OFFSET_TABLE_-(11b-.)),%o4
81         add     %o7,%o4,%o4
82         /* restore return address */
83         mov     %o5,%o7
84         /* o4 has the GOT pointer */
85 #endif
86         sethi   %hi(C_SYMBOL_NAME(____sig_table)),%o5
87         or      %o5,%lo(C_SYMBOL_NAME(____sig_table)),%o5
88 #ifdef PIC
89         ld      [%o4+%o5], %o5
90 #endif
91         sll     %o0,2,%o4
92         add     %o5,%o4,%o4
93         ld      [%o4],%o4
94         ld      [%fp + REGWIN_SZ + 4],%o1         /* Load subcode */
95         ld      [%fp + REGWIN_SZ + 8],%o2         /* pointer to sigcontext */
96         call    %o4
97         ld      [%fp + REGWIN_SZ + 12],%o3        /* Address where signal ocurre
98  */
99
100         /* handler returned, restore state */
101         tst     %l0
102         be      1f
103         wr      %l1,%g0,%y
104
105         /* fpu restoration */
106         ld      [%sp + CCFSZ + 0], %fsr
107         ldd     [%sp + CCFSZ + 8], %f0
108         ldd     [%sp + CCFSZ + 16], %f2
109         ldd     [%sp + CCFSZ + 24], %f4
110         ldd     [%sp + CCFSZ + 32], %f6
111         ldd     [%sp + CCFSZ + 40], %f8
112         ldd     [%sp + CCFSZ + 48], %f10
113         ldd     [%sp + CCFSZ + 56], %f12
114         ldd     [%sp + CCFSZ + 64], %f14
115         ldd     [%sp + CCFSZ + 72], %f16
116         ldd     [%sp + CCFSZ + 80], %f18
117         ldd     [%sp + CCFSZ + 88], %f20
118         ldd     [%sp + CCFSZ + 96], %f22
119         ldd     [%sp + CCFSZ + 104], %f24
120         ldd     [%sp + CCFSZ + 112], %f26
121         ldd     [%sp + CCFSZ + 120], %f28
122         ldd     [%sp + CCFSZ + 128], %f30
123
124 1:
125         mov     %l2,%g2
126         mov     %l3,%g3
127         mov     %l4,%g4
128         mov     %l5,%g5
129         mov     %l6,%g6
130         mov     %l7,%g7
131
132        /* call sigreturn */
133         restore %g0,SYS_ify(sigreturn),%g1      /* register back and set syscal */
134         add     %sp,64+16,%o0
135         t       0x10
136         /* if we return, sysreturn failed */
137         mov     SYS_ify(exit),%g1
138         t       0x10
139
140 END(____sparc_signal_trampoline)