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