xref: /csrg-svn/lib/libc/tahoe/gen/setjmp.s (revision 29797)
129698Ssam#ifdef LIBC_SCCS
2*29797Ssam	.asciz	"@(#)setjmp.s	1.2 (Berkeley/CCI) 08/22/86"
329698Ssam#endif LIBC_SCCS
429698Ssam
529698Ssam/*
629698Ssam * C library -- setjmp, longjmp
729698Ssam *
829698Ssam *	longjmp(a,v)
929698Ssam * will generate a "return(v)" from
1029698Ssam * the last call to
1129698Ssam *	setjmp(a)
1229698Ssam * by restoring registers from the stack,
1329698Ssam * previous signal mask, and doing a return.
1429698Ssam */
1529698Ssam
1629698Ssam#include "DEFS.h"
1729698Ssam
18*29797SsamENTRY(setjmp, R6)
19*29797Ssam	movl	4(fp),r6		# construct sigcontext
20*29797Ssam	movab	-8(sp),sp		# space for current struct sigstack
21*29797Ssam	pushal	(sp)			# get current values
22*29797Ssam	pushl	$0			# no new values
23*29797Ssam	callf	$16,_sigstack		# pop args plus signal stack value
24*29797Ssam	movl	(sp)+,(r6)		# save onsigstack status of caller
2529698Ssam	pushl	$0
2629698Ssam	callf	$8,_sigblock		# get signal mask
27*29797Ssam	movl	r0,4(r6)		# save signal mask of caller
28*29797Ssam	addl3	$8,fp,8(r6)		# save stack pointer of caller
29*29797Ssam	movl	(fp),12(r6)		# save frame pointer of caller
30*29797Ssam	movl	-8(fp),20(r6)		# save pc of caller
31*29797Ssam	movpsl	24(r6)			# save psl of caller
3229698Ssam	clrl	r0
3329698Ssam	ret
3429698Ssam
3529698SsamENTRY(longjmp, 0)
3629698Ssam	movl	8(fp),r0		# return(v)
3729698Ssam	movl	4(fp),r1		# fetch buffer
38*29797Ssam	tstl	12(r1)
3929698Ssam	beql	botch
4029698Ssamloop:
41*29797Ssam	cmpl	12(r1),(fp)
4229698Ssam	beql	done
4329698Ssam	blssu	botch
4429698Ssam	movl	$loop,-8(fp)
4529698Ssam	ret				# pop another frame
4629698Ssam
4729698Ssamdone:
4829698Ssam	cmpb	*-8(fp),reiins		# returning to an "rei"?
4929698Ssam	bneq	1f
5029698Ssam	movab	3f,-8(fp)		# do return w/ psl-pc pop
5129698Ssam	brw	2f
5229698Ssam1:
5329698Ssam	movab	4f,-8(fp)		# do standard return
5429698Ssam2:
5529698Ssam	ret				# unwind stack before signals enabled
5629698Ssam3:
5729698Ssam	addl2	$8,sp			# compensate for PSL-PC push
5829698Ssam4:
59*29797Ssam	pushl	r1			# pointer to sigcontext
60*29797Ssam	callf	$4,_sigreturn		# restore previous context
61*29797Ssam					# we should never return
6229698Ssam
6329698Ssambotch:
6429698Ssam	callf	$4,_longjmperror
6529698Ssam	halt
6629698Ssam
6729698Ssam	.data
6829698Ssamreiins:	rei
69