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