1 /* $FreeBSD: releng/6.0/sys/alpha/linux/linux_locore.s 69539 2000-12-03 01:30:31Z marcel $ */
2
3 #include <machine/asm.h>
4 #include <alpha/linux/linux_syscall.h>
5
6 /*
7 * Signal "trampoline" code. Invoked from RTE setup by sendsig().
8 *
9 * On entry, stack & registers look like:
10 *
11 * a0 signal number
12 * a1 pointer to siginfo_t
13 * a2 pointer to signal context frame (scp)
14 * a3 address of handler
15 * sp+0 saved hardware state
16 * .
17 * .
18 * scp+0 beginning of signal context frame
19 */
20
21 /*
22 * System call glue.
23 */
24 #define LINUX_SYSCALLNUM(name) \
25 ___CONCAT(LINUX_SYS_,name)
26
27 #define LINUX_CALLSYS_NOERROR(name) \
28 ldiq v0, LINUX_SYSCALLNUM(name); \
29 call_pal PAL_OSF1_callsys
30
31
32
33 NESTED(linux_sigcode,0,0,ra,0,0)
34 lda sp, -16(sp) /* save the sigcontext pointer */
35 stq a2, 0(sp)
36 jsr ra, (t12) /* call the signal handler (t12==pv) */
37 ldq a0, 0(sp) /* get the sigcontext pointer */
38 lda sp, 16(sp)
39 /* and call sigreturn() with it. */
40 LINUX_CALLSYS_NOERROR(osf1_sigreturn)
41 mov v0, a0 /* if that failed, get error code */
42 LINUX_CALLSYS_NOERROR(exit) /* and call exit() with it. */
43 XNESTED(linux_esigcode,0)
44 END(linux_sigcode)
45
46 .data
47 EXPORT(linux_szsigcode)
48 .quad linux_esigcode-linux_sigcode
49 .text
Cache object: 1c6ff8e29b753e98dabb2591350dea8d
|