xref: /csrg-svn/lib/libc/vax/gen/_setjmp.s (revision 61225)
121418Sdist/*
2*61225Sbostic * Copyright (c) 1980, 1993
3*61225Sbostic *	The Regents of the University of California.  All rights reserved.
434480Sbostic *
542637Sbostic * %sccs.include.redist.c%
621418Sdist */
713498Ssam
834819Sbostic#if defined(LIBC_SCCS) && !defined(lint)
9*61225Sbostic	.asciz "@(#)_setjmp.s	8.1 (Berkeley) 06/04/93"
1034819Sbostic#endif /* LIBC_SCCS and not lint */
1121418Sdist
1213498Ssam/*
1313498Ssam * C library -- _setjmp, _longjmp
1413498Ssam *
1513498Ssam *	_longjmp(a,v)
1613498Ssam * will generate a "return(v)" from
1713498Ssam * the last call to
1813498Ssam *	_setjmp(a)
1913498Ssam * by restoring registers from the stack,
2013498Ssam * The previous signal state is NOT restored.
2113498Ssam */
2213498Ssam
2313498Ssam#include "DEFS.h"
2413498Ssam
2517328SsamENTRY(_setjmp, 0)
2613498Ssam	movl	4(ap),r0
2713498Ssam	movl	12(fp),(r0)		# save frame pointer of caller
2813498Ssam	movl	16(fp),4(r0)		# save pc of caller
2913498Ssam	clrl	r0
3013498Ssam	ret
3113498Ssam
3217328SsamENTRY(_longjmp, 0)
3313498Ssam	movl	8(ap),r0		# return(v)
3413498Ssam	movl	4(ap),r1		# fetch buffer
3513498Ssam	tstl	(r1)
3613498Ssam	beql	botch
3713498Ssamloop:
3813498Ssam	bitw	$1,6(fp)		# r0 saved?
3913498Ssam	beql	1f
4013498Ssam	movl	r0,20(fp)
4113498Ssam	bitw	$2,6(fp)		# was r1 saved?
4213498Ssam	beql	2f
4313498Ssam	movl	r1,24(fp)
4413498Ssam	brb	2f
4513498Ssam1:
4613498Ssam	bitw	$2,6(fp)		# was r1 saved?
4713498Ssam	beql	2f
4813498Ssam	movl	r1,20(fp)
4913498Ssam2:
5013498Ssam	cmpl	(r1),12(fp)
5113498Ssam	beql	done
5213498Ssam	blssu	botch
5313498Ssam	movl	$loop,16(fp)
5413498Ssam	ret				# pop another frame
5513498Ssam
5613498Ssamdone:
5713498Ssam	cmpb	*16(fp),reiins		# returning to an "rei"?
5813498Ssam	bneq	1f
5913498Ssam	movab	3f,16(fp)		# do return w/ psl-pc pop
6013498Ssam	brw	2f
6113498Ssam1:
6213498Ssam	movab	4f,16(fp)		# do standard return
6313498Ssam2:
6413498Ssam	ret				# unwind stack before signals enabled
6513498Ssam3:
6613498Ssam	addl2	$8,sp			# compensate for PSL-PC push
6713498Ssam4:
6813498Ssam	jmp	*4(r1)			# done, return....
6913498Ssam
7013498Ssambotch:
7125784Smckusick	calls	$0,_longjmperror
7213498Ssam	halt
7325922Skarels
7425922Skarels	.data
7525922Skarelsreiins: rei
76