]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/alpha/linux/linux_locore.s
merge fix for boot-time hang on centos' xen
[FreeBSD/FreeBSD.git] / sys / alpha / linux / linux_locore.s
1 /* $FreeBSD$ */
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