xref: /csrg-svn/lib/libc/vax/gen/_setjmp.s (revision 13498)
1*13498Ssam/*	_setjmp.s	4.1	83/06/30	*/
2*13498Ssam
3*13498Ssam/*
4*13498Ssam * C library -- _setjmp, _longjmp
5*13498Ssam *
6*13498Ssam *	_longjmp(a,v)
7*13498Ssam * will generate a "return(v)" from
8*13498Ssam * the last call to
9*13498Ssam *	_setjmp(a)
10*13498Ssam * by restoring registers from the stack,
11*13498Ssam * The previous signal state is NOT restored.
12*13498Ssam */
13*13498Ssam
14*13498Ssam#include "DEFS.h"
15*13498Ssam
16*13498SsamENTRY(_setjmp)
17*13498Ssam	movl	4(ap),r0
18*13498Ssam	movl	12(fp),(r0)		# save frame pointer of caller
19*13498Ssam	movl	16(fp),4(r0)		# save pc of caller
20*13498Ssam	clrl	r0
21*13498Ssam	ret
22*13498Ssam
23*13498SsamENTRY(_longjmp)
24*13498Ssam	movl	8(ap),r0		# return(v)
25*13498Ssam	movl	4(ap),r1		# fetch buffer
26*13498Ssam	tstl	(r1)
27*13498Ssam	beql	botch
28*13498Ssamloop:
29*13498Ssam	bitw	$1,6(fp)		# r0 saved?
30*13498Ssam	beql	1f
31*13498Ssam	movl	r0,20(fp)
32*13498Ssam	bitw	$2,6(fp)		# was r1 saved?
33*13498Ssam	beql	2f
34*13498Ssam	movl	r1,24(fp)
35*13498Ssam	brb	2f
36*13498Ssam1:
37*13498Ssam	bitw	$2,6(fp)		# was r1 saved?
38*13498Ssam	beql	2f
39*13498Ssam	movl	r1,20(fp)
40*13498Ssam2:
41*13498Ssam	cmpl	(r1),12(fp)
42*13498Ssam	beql	done
43*13498Ssam	blssu	botch
44*13498Ssam	movl	$loop,16(fp)
45*13498Ssam	ret				# pop another frame
46*13498Ssam
47*13498Ssamdone:
48*13498Ssam	cmpb	*16(fp),reiins		# returning to an "rei"?
49*13498Ssam	bneq	1f
50*13498Ssam	movab	3f,16(fp)		# do return w/ psl-pc pop
51*13498Ssam	brw	2f
52*13498Ssam1:
53*13498Ssam	movab	4f,16(fp)		# do standard return
54*13498Ssam2:
55*13498Ssam	ret				# unwind stack before signals enabled
56*13498Ssam3:
57*13498Ssam	addl2	$8,sp			# compensate for PSL-PC push
58*13498Ssam4:
59*13498Ssam	jmp	*4(r1)			# done, return....
60*13498Ssam
61*13498Ssambotch:
62*13498Ssam	pushl	$msgend-msg
63*13498Ssam	pushl	$msg
64*13498Ssam	pushl	$2
65*13498Ssam	calls	$3,_write
66*13498Ssam	halt
67*13498Ssam
68*13498Ssammsg:	.ascii	"_longjmp botch\n"
69*13498Ssammsgend:
70*13498Ssamreiins:	rei
71