xref: /csrg-svn/lib/libc/vax/gen/_setjmp.s (revision 13625)
1*13625Ssam/*	_setjmp.s	4.2	83/07/02	*/
213498Ssam
313498Ssam/*
413498Ssam * C library -- _setjmp, _longjmp
513498Ssam *
613498Ssam *	_longjmp(a,v)
713498Ssam * will generate a "return(v)" from
813498Ssam * the last call to
913498Ssam *	_setjmp(a)
1013498Ssam * by restoring registers from the stack,
1113498Ssam * The previous signal state is NOT restored.
1213498Ssam */
1313498Ssam
1413498Ssam#include "DEFS.h"
1513498Ssam
1613498SsamENTRY(_setjmp)
1713498Ssam	movl	4(ap),r0
1813498Ssam	movl	12(fp),(r0)		# save frame pointer of caller
1913498Ssam	movl	16(fp),4(r0)		# save pc of caller
2013498Ssam	clrl	r0
2113498Ssam	ret
2213498Ssam
2313498SsamENTRY(_longjmp)
2413498Ssam	movl	8(ap),r0		# return(v)
2513498Ssam	movl	4(ap),r1		# fetch buffer
2613498Ssam	tstl	(r1)
2713498Ssam	beql	botch
2813498Ssamloop:
2913498Ssam	bitw	$1,6(fp)		# r0 saved?
3013498Ssam	beql	1f
3113498Ssam	movl	r0,20(fp)
3213498Ssam	bitw	$2,6(fp)		# was r1 saved?
3313498Ssam	beql	2f
3413498Ssam	movl	r1,24(fp)
3513498Ssam	brb	2f
3613498Ssam1:
3713498Ssam	bitw	$2,6(fp)		# was r1 saved?
3813498Ssam	beql	2f
3913498Ssam	movl	r1,20(fp)
4013498Ssam2:
4113498Ssam	cmpl	(r1),12(fp)
4213498Ssam	beql	done
4313498Ssam	blssu	botch
4413498Ssam	movl	$loop,16(fp)
4513498Ssam	ret				# pop another frame
4613498Ssam
4713498Ssamdone:
4813498Ssam	cmpb	*16(fp),reiins		# returning to an "rei"?
4913498Ssam	bneq	1f
5013498Ssam	movab	3f,16(fp)		# do return w/ psl-pc pop
5113498Ssam	brw	2f
5213498Ssam1:
5313498Ssam	movab	4f,16(fp)		# do standard return
5413498Ssam2:
5513498Ssam	ret				# unwind stack before signals enabled
5613498Ssam3:
5713498Ssam	addl2	$8,sp			# compensate for PSL-PC push
5813498Ssam4:
5913498Ssam	jmp	*4(r1)			# done, return....
6013498Ssam
6113498Ssambotch:
6213498Ssam	pushl	$msgend-msg
6313498Ssam	pushl	$msg
6413498Ssam	pushl	$2
6513498Ssam	calls	$3,_write
6613498Ssam	halt
6713498Ssam
68*13625Ssam	.data
6913498Ssammsg:	.ascii	"_longjmp botch\n"
7013498Ssammsgend:
7113498Ssamreiins:	rei
72