xref: /original-bsd/lib/libc/vax/gen/setjmp.s (revision c43e4352)
1/*	setjmp.s	4.4	83/07/02	*/
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 * previous signal mask, and doing a return.
12 *
13 * BUG: always restores onsigstack state to 0
14 */
15
16#include "DEFS.h"
17
18ENTRY(setjmp)
19	pushl	$0
20	calls	$1,_sigblock		# get signal mask
21	movl	r0,r1
22	movl	4(ap),r0
23	movl	12(fp),(r0)		# save frame pointer of caller
24	movl	16(fp),4(r0)		# save pc of caller
25	movl	r1,8(r0)		# save signal mask
26	clrl	12(r0)			# XXX (should be onsigstack) XXX
27	clrl	r0
28	ret
29
30ENTRY(longjmp)
31	movl	8(ap),r0		# return(v)
32	movl	4(ap),r1		# fetch buffer
33	tstl	(r1)
34	beql	botch
35loop:
36	bitw	$1,6(fp)		# r0 saved?
37	beql	1f
38	movl	r0,20(fp)
39	bitw	$2,6(fp)		# was r1 saved?
40	beql	2f
41	movl	r1,24(fp)
42	brb	2f
431:
44	bitw	$2,6(fp)		# was r1 saved?
45	beql	2f
46	movl	r1,20(fp)
472:
48	cmpl	(r1),12(fp)
49	beql	done
50	blssu	botch
51	movl	$loop,16(fp)
52	ret				# pop another frame
53
54done:
55	cmpb	*16(fp),reiins		# returning to an "rei"?
56	bneq	1f
57	movab	3f,16(fp)		# do return w/ psl-pc pop
58	brw	2f
591:
60	movab	4f,16(fp)		# do standard return
612:
62	ret				# unwind stack before signals enabled
633:
64	addl2	$8,sp			# compensate for PSL-PC push
654:
66	pushl	8(r1)			# old signal mask
67	pushl	12(r1)			# old onsigstack
68	chmk	$139			# restore previous signal context
69	jmp	*4(r1)			# done, return....
70
71botch:
72	pushl	$msgend-msg
73	pushl	$msg
74	pushl	$2
75	calls	$3,_write
76	halt
77
78	.data
79msg:	.ascii	"longjmp botch\n"
80msgend:
81reiins:	rei
82