xref: /csrg-svn/lib/libc/vax/gen/setjmp.s (revision 13500)
1*13500Ssam/*	setjmp.s	4.3	83/06/30	*/
213419Sroot
313419Sroot/*
413419Sroot * C library -- setjmp, longjmp
513419Sroot *
613419Sroot *	longjmp(a,v)
713419Sroot * will generate a "return(v)" from
813419Sroot * the last call to
913419Sroot *	setjmp(a)
1013419Sroot * by restoring registers from the stack,
1113419Sroot * previous signal mask, and doing a return.
1213419Sroot *
1313419Sroot * BUG: always restores onsigstack state to 0
1413419Sroot */
1513419Sroot
1613419Sroot#include "DEFS.h"
1713419Sroot
1813419SrootENTRY(setjmp)
1913419Sroot	pushl	$0
2013419Sroot	calls	$1,_sigblock		# get signal mask
2113419Sroot	movl	r0,r1
2213419Sroot	movl	4(ap),r0
2313419Sroot	movl	12(fp),(r0)		# save frame pointer of caller
2413419Sroot	movl	16(fp),4(r0)		# save pc of caller
2513419Sroot	movl	r1,8(r0)		# save signal mask
2613419Sroot	clrl	12(r0)			# XXX (should be onsigstack) XXX
2713419Sroot	clrl	r0
2813419Sroot	ret
2913419Sroot
3013419SrootENTRY(longjmp)
3113419Sroot	movl	8(ap),r0		# return(v)
3213419Sroot	movl	4(ap),r1		# fetch buffer
3313419Sroot	tstl	(r1)
3413419Sroot	beql	botch
3513419Srootloop:
3613419Sroot	bitw	$1,6(fp)		# r0 saved?
3713419Sroot	beql	1f
3813419Sroot	movl	r0,20(fp)
3913419Sroot	bitw	$2,6(fp)		# was r1 saved?
4013419Sroot	beql	2f
4113419Sroot	movl	r1,24(fp)
4213419Sroot	brb	2f
4313419Sroot1:
4413419Sroot	bitw	$2,6(fp)		# was r1 saved?
4513419Sroot	beql	2f
4613419Sroot	movl	r1,20(fp)
4713419Sroot2:
4813419Sroot	cmpl	(r1),12(fp)
4913419Sroot	beql	done
5013419Sroot	blssu	botch
5113419Sroot	movl	$loop,16(fp)
5213419Sroot	ret				# pop another frame
5313419Sroot
5413419Srootdone:
5513419Sroot	cmpb	*16(fp),reiins		# returning to an "rei"?
5613419Sroot	bneq	1f
5713419Sroot	movab	3f,16(fp)		# do return w/ psl-pc pop
5813419Sroot	brw	2f
5913419Sroot1:
6013419Sroot	movab	4f,16(fp)		# do standard return
6113419Sroot2:
6213419Sroot	ret				# unwind stack before signals enabled
6313419Sroot3:
6413419Sroot	addl2	$8,sp			# compensate for PSL-PC push
6513419Sroot4:
6613419Sroot	pushl	8(r1)			# old signal mask
6713419Sroot	pushl	12(r1)			# old onsigstack
6813419Sroot	chmk	$139			# restore previous signal context
6913419Sroot	jmp	*4(r1)			# done, return....
7013419Sroot
7113419Srootbotch:
72*13500Ssam	pushl	$msgend-msg
7313419Sroot	pushl	$msg
7413419Sroot	pushl	$2
7513419Sroot	calls	$3,_write
7613419Sroot	halt
7713419Sroot
78*13500Ssammsg:	.ascii	"longjmp botch\n"
79*13500Ssammsgend:
8013419Srootreiins:	rei
81