compat_setjmp.S revision 1.1 1 /* $NetBSD: compat_setjmp.S,v 1.1 2006/02/18 00:45:22 matt Exp $ */
2
3 #include <sys/syscall.h>
4
5 #include <machine/asm.h>
6
7 #if defined(LIBC_SCCS)
8 .text
9 .asciz "$NetBSD: compat_setjmp.S,v 1.1 2006/02/18 00:45:22 matt Exp $"
10 #endif
11
12 /*
13 * C library -- _setjmp, _longjmp
14 *
15 * longjmp(a,v)
16 * will generate a "return(v?v:1)" from the last call to
17 * setjmp(a)
18 * by restoring registers from the stack.
19 * The previous signal state is restored.
20 */
21
22 ENTRY(setjmp)
23 mr %r6,%r3
24 li %r3,1 # SIG_BLOCK
25 li %r4,0
26 li %r0,SYS_compat_13_sigprocmask13
27 sc # assume no error XXX
28 mflr %r11
29 mfcr %r12
30 mr %r10,%r1
31 mr %r9,%r2
32 mr %r8,%r3
33 stmw %r8,4(%r6)
34 li %r3,0
35 blr
36
37 ENTRY(longjmp)
38 lmw %r8,4(%r3)
39 mr %r6,%r4
40 mtlr %r11
41 mtcr %r12
42 mr %r2,%r9
43 mr %r1,%r10
44 mr %r4,%r8
45 li %r3,3 # SIG_SETMASK
46 li %r0,SYS_compat_13_sigprocmask13
47 sc # assume no error XXX
48 or. %r3,%r6,%r6
49 bnelr
50 li %r3,1
51 blr
52