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