xref: /csrg-svn/lib/libc/vax/gen/setjmp.s (revision 61225)
121431Sdist/*
2*61225Sbostic * Copyright (c) 1983, 1993
3*61225Sbostic *	The Regents of the University of California.  All rights reserved.
434480Sbostic *
542637Sbostic * %sccs.include.redist.c%
621431Sdist */
713419Sroot
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 */
1121431Sdist
1213419Sroot/*
1313419Sroot * C library -- setjmp, longjmp
1413419Sroot *
1513419Sroot *	longjmp(a,v)
1613419Sroot * will generate a "return(v)" from
1713419Sroot * the last call to
1813419Sroot *	setjmp(a)
1913419Sroot * by restoring registers from the stack,
2018292Smckusick * and a struct sigcontext, see <signal.h>
2113419Sroot */
2213419Sroot
2313419Sroot#include "DEFS.h"
2413419Sroot
2518715SmckusickENTRY(setjmp, R6)
2618715Smckusick	movl	4(ap),r6		# construct sigcontext
2718292Smckusick	subl2	$8,sp			# space for current struct sigstack
2818292Smckusick	pushl	sp			# get current values
2918292Smckusick	pushl	$0			# no new values
3018292Smckusick	calls	$3,_sigstack		# pop args plus signal stack value
3124300Smckusick	movl	(sp)+,(r6)+		# save onsigstack status of caller
3213419Sroot	pushl	$0
3313419Sroot	calls	$1,_sigblock		# get signal mask
3418715Smckusick	movl	r0,(r6)+		# save signal mask of caller
3518292Smckusick	movl	(ap),r0
3618715Smckusick	moval	4(ap)[r0],(r6)+		# save sp of caller
3718715Smckusick	movl	12(fp),(r6)+		# save frame pointer of caller
3818715Smckusick	movl	8(fp),(r6)+		# save argument pointer of caller
3918715Smckusick	movl	16(fp),(r6)+		# save pc of caller
4018715Smckusick	movpsl	(r6)			# save psl of caller
4118715Smckusick	movw	4(fp),(r6)
4213419Sroot	clrl	r0
4313419Sroot	ret
4413419Sroot
4517329SsamENTRY(longjmp, 0)
4613419Sroot	movl	8(ap),r0		# return(v)
4713419Sroot	movl	4(ap),r1		# fetch buffer
4818292Smckusick	tstl	12(r1)
4913419Sroot	beql	botch
5013419Srootloop:
5118292Smckusick	cmpl	12(r1),fp		# are we there yet?
5218292Smckusick	beql	done
5318292Smckusick	blssu	botch
5418292Smckusick	moval	20(fp),r2
5518292Smckusick	blbc	6(fp),1f		# was r0 saved?
5618292Smckusick	movl	r0,(r2)+
5713419Sroot1:
5818292Smckusick	bbc	$1,6(fp),2f		# was r1 saved?
5918292Smckusick	movl	r1,(r2)
6013419Sroot2:
6113419Sroot	movl	$loop,16(fp)
6213419Sroot	ret				# pop another frame
6313419Sroot
6413419Srootdone:
6518292Smckusick	pushl	r1			# pointer to sigcontext
6618292Smckusick	calls	$1,_sigreturn		# restore previous context
6718292Smckusick					# we should never return
6813419Srootbotch:
6925784Smckusick	calls	$0,_longjmperror
7013419Sroot	halt
71