xref: /original-bsd/lib/libc/vax/gen/setjmp.s (revision f82e54c4)
1/*	setjmp.s	4.5	83/08/14	*/
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	sp			# old stack pointer
67	pushl	8(r1)			# old signal mask
68	pushl	12(r1)			# old onsigstack
69	pushl	sp			# pointer to sigcontext
70	chmk	$139			# restore previous signal context
71	jmp	*4(r1)			# done, return....
72
73botch:
74	pushl	$msgend-msg
75	pushl	$msg
76	pushl	$2
77	calls	$3,_write
78	halt
79
80	.data
81msg:	.ascii	"longjmp botch\n"
82msgend:
83reiins:	rei
84