xref: /csrg-svn/lib/libc/vax/gen/setjmp.s (revision 13419)
1/*	setjmp.s	4.1	83/06/27	*/
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	.word	0x0000
32	movl	8(ap),r0		# return(v)
33	movl	4(ap),r1		# fetch buffer
34	tstl	(r1)
35	beql	botch
36loop:
37	bitw	$1,6(fp)		# r0 saved?
38	beql	1f
39	movl	r0,20(fp)
40	bitw	$2,6(fp)		# was r1 saved?
41	beql	2f
42	movl	r1,24(fp)
43	brb	2f
441:
45	bitw	$2,6(fp)		# was r1 saved?
46	beql	2f
47	movl	r1,20(fp)
482:
49	cmpl	(r1),12(fp)
50	beql	done
51	blssu	botch
52	movl	$loop,16(fp)
53	ret				# pop another frame
54
55done:
56	cmpb	*16(fp),reiins		# returning to an "rei"?
57	bneq	1f
58	movab	3f,16(fp)		# do return w/ psl-pc pop
59	brw	2f
601:
61	movab	4f,16(fp)		# do standard return
622:
63	ret				# unwind stack before signals enabled
643:
65	addl2	$8,sp			# compensate for PSL-PC push
664:
67	pushl	8(r1)			# old signal mask
68	pushl	12(r1)			# old onsigstack
69	chmk	$139			# restore previous signal context
70	jmp	*4(r1)			# done, return....
71
72botch:
73	pushl	$14
74	pushl	$msg
75	pushl	$2
76	calls	$3,_write
77	halt
78
79msg:	.byte	'l, 'o, 'n, 'g, 'j, 'm, 'p, ' , 'b, 'o, 't, 'c, 'h, 012
80reiins:	rei
81