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