xref: /csrg-svn/lib/libc/tahoe/gen/setjmp.s (revision 29698)
1*29698Ssam#ifdef LIBC_SCCS
2*29698Ssam	.asciz	"@(#)setjmp.s	1.1 (Berkeley/CCI) 08/01/86"
3*29698Ssam#endif LIBC_SCCS
4*29698Ssam
5*29698Ssam/*
6*29698Ssam * C library -- setjmp, longjmp
7*29698Ssam *
8*29698Ssam *	longjmp(a,v)
9*29698Ssam * will generate a "return(v)" from
10*29698Ssam * the last call to
11*29698Ssam *	setjmp(a)
12*29698Ssam * by restoring registers from the stack,
13*29698Ssam * previous signal mask, and doing a return.
14*29698Ssam *
15*29698Ssam * BUG: always restores onsigstack state to 0
16*29698Ssam */
17*29698Ssam
18*29698Ssam#include "DEFS.h"
19*29698Ssam
20*29698SsamENTRY(setjmp, 0)
21*29698Ssam	pushl	$0
22*29698Ssam	callf	$8,_sigblock		# get signal mask
23*29698Ssam	movl	r0,r1
24*29698Ssam	movl	4(fp),r0
25*29698Ssam	movl	(fp),(r0)		# save frame pointer of caller
26*29698Ssam	movl	-8(fp),4(r0)		# save pc of caller
27*29698Ssam	movl	r1,8(r0)		# save signal mask
28*29698Ssam	clrl	12(r0)			# XXX (should be onsigstack) XXX
29*29698Ssam	clrl	r0
30*29698Ssam	ret
31*29698Ssam
32*29698SsamENTRY(longjmp, 0)
33*29698Ssam	movl	8(fp),r0		# return(v)
34*29698Ssam	movl	4(fp),r1		# fetch buffer
35*29698Ssam	tstl	(r1)
36*29698Ssam	beql	botch
37*29698Ssamloop:
38*29698Ssam	cmpl	(r1),(fp)
39*29698Ssam	beql	done
40*29698Ssam	blssu	botch
41*29698Ssam	movl	$loop,-8(fp)
42*29698Ssam	ret				# pop another frame
43*29698Ssam
44*29698Ssamdone:
45*29698Ssam	cmpb	*-8(fp),reiins		# returning to an "rei"?
46*29698Ssam	bneq	1f
47*29698Ssam	movab	3f,-8(fp)		# do return w/ psl-pc pop
48*29698Ssam	brw	2f
49*29698Ssam1:
50*29698Ssam	movab	4f,-8(fp)		# do standard return
51*29698Ssam2:
52*29698Ssam	ret				# unwind stack before signals enabled
53*29698Ssam3:
54*29698Ssam	addl2	$8,sp			# compensate for PSL-PC push
55*29698Ssam4:
56*29698Ssam	pushal	(sp)			# old stack pointer
57*29698Ssam	pushl	8(r1)			# old signal mask
58*29698Ssam	pushl	12(r1)			# old onsigstack
59*29698Ssam	pushal	(sp)			# pointer to sigcontext
60*29698Ssam	kcall	$139			# restore previous signal context
61*29698Ssam	jmp	*4(r1)			# done, return....
62*29698Ssam
63*29698Ssambotch:
64*29698Ssam	callf	$4,_longjmperror
65*29698Ssam	halt
66*29698Ssam
67*29698Ssam	.data
68*29698Ssamreiins:	rei
69