xref: /csrg-svn/lib/libc/tahoe/gen/setjmp.s (revision 29797)
1#ifdef LIBC_SCCS
2	.asciz	"@(#)setjmp.s	1.2 (Berkeley/CCI) 08/22/86"
3#endif LIBC_SCCS
4
5/*
6 * C library -- setjmp, longjmp
7 *
8 *	longjmp(a,v)
9 * will generate a "return(v)" from
10 * the last call to
11 *	setjmp(a)
12 * by restoring registers from the stack,
13 * previous signal mask, and doing a return.
14 */
15
16#include "DEFS.h"
17
18ENTRY(setjmp, R6)
19	movl	4(fp),r6		# construct sigcontext
20	movab	-8(sp),sp		# space for current struct sigstack
21	pushal	(sp)			# get current values
22	pushl	$0			# no new values
23	callf	$16,_sigstack		# pop args plus signal stack value
24	movl	(sp)+,(r6)		# save onsigstack status of caller
25	pushl	$0
26	callf	$8,_sigblock		# get signal mask
27	movl	r0,4(r6)		# save signal mask of caller
28	addl3	$8,fp,8(r6)		# save stack pointer of caller
29	movl	(fp),12(r6)		# save frame pointer of caller
30	movl	-8(fp),20(r6)		# save pc of caller
31	movpsl	24(r6)			# save psl of caller
32	clrl	r0
33	ret
34
35ENTRY(longjmp, 0)
36	movl	8(fp),r0		# return(v)
37	movl	4(fp),r1		# fetch buffer
38	tstl	12(r1)
39	beql	botch
40loop:
41	cmpl	12(r1),(fp)
42	beql	done
43	blssu	botch
44	movl	$loop,-8(fp)
45	ret				# pop another frame
46
47done:
48	cmpb	*-8(fp),reiins		# returning to an "rei"?
49	bneq	1f
50	movab	3f,-8(fp)		# do return w/ psl-pc pop
51	brw	2f
521:
53	movab	4f,-8(fp)		# do standard return
542:
55	ret				# unwind stack before signals enabled
563:
57	addl2	$8,sp			# compensate for PSL-PC push
584:
59	pushl	r1			# pointer to sigcontext
60	callf	$4,_sigreturn		# restore previous context
61					# we should never return
62
63botch:
64	callf	$4,_longjmperror
65	halt
66
67	.data
68reiins:	rei
69