xref: /csrg-svn/lib/libc/tahoe/gen/setjmp.s (revision 29698)
1#ifdef LIBC_SCCS
2	.asciz	"@(#)setjmp.s	1.1 (Berkeley/CCI) 08/01/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 * BUG: always restores onsigstack state to 0
16 */
17
18#include "DEFS.h"
19
20ENTRY(setjmp, 0)
21	pushl	$0
22	callf	$8,_sigblock		# get signal mask
23	movl	r0,r1
24	movl	4(fp),r0
25	movl	(fp),(r0)		# save frame pointer of caller
26	movl	-8(fp),4(r0)		# save pc of caller
27	movl	r1,8(r0)		# save signal mask
28	clrl	12(r0)			# XXX (should be onsigstack) XXX
29	clrl	r0
30	ret
31
32ENTRY(longjmp, 0)
33	movl	8(fp),r0		# return(v)
34	movl	4(fp),r1		# fetch buffer
35	tstl	(r1)
36	beql	botch
37loop:
38	cmpl	(r1),(fp)
39	beql	done
40	blssu	botch
41	movl	$loop,-8(fp)
42	ret				# pop another frame
43
44done:
45	cmpb	*-8(fp),reiins		# returning to an "rei"?
46	bneq	1f
47	movab	3f,-8(fp)		# do return w/ psl-pc pop
48	brw	2f
491:
50	movab	4f,-8(fp)		# do standard return
512:
52	ret				# unwind stack before signals enabled
533:
54	addl2	$8,sp			# compensate for PSL-PC push
554:
56	pushal	(sp)			# old stack pointer
57	pushl	8(r1)			# old signal mask
58	pushl	12(r1)			# old onsigstack
59	pushal	(sp)			# pointer to sigcontext
60	kcall	$139			# restore previous signal context
61	jmp	*4(r1)			# done, return....
62
63botch:
64	callf	$4,_longjmperror
65	halt
66
67	.data
68reiins:	rei
69