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