setjmp.S revision 1.14
11.14Smatt/*	$NetBSD: setjmp.S,v 1.14 2013/07/16 22:12:20 matt Exp $	*/
21.5Sthorpej
31.1Spaulus/*-
41.1Spaulus * Copyright (c) 1990 The Regents of the University of California.
51.1Spaulus * All rights reserved.
61.1Spaulus *
71.1Spaulus * This code is derived from software contributed to Berkeley by
81.1Spaulus * the Systems Programming Group of the University of Utah Computer
91.1Spaulus * Science Department.
101.1Spaulus *
111.1Spaulus * Redistribution and use in source and binary forms, with or without
121.1Spaulus * modification, are permitted provided that the following conditions
131.1Spaulus * are met:
141.1Spaulus * 1. Redistributions of source code must retain the above copyright
151.1Spaulus *    notice, this list of conditions and the following disclaimer.
161.1Spaulus * 2. Redistributions in binary form must reproduce the above copyright
171.1Spaulus *    notice, this list of conditions and the following disclaimer in the
181.1Spaulus *    documentation and/or other materials provided with the distribution.
191.11Sagc * 3. Neither the name of the University nor the names of its contributors
201.1Spaulus *    may be used to endorse or promote products derived from this software
211.1Spaulus *    without specific prior written permission.
221.1Spaulus *
231.1Spaulus * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
241.1Spaulus * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
251.1Spaulus * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
261.1Spaulus * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
271.1Spaulus * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
281.1Spaulus * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
291.1Spaulus * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
301.1Spaulus * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
311.1Spaulus * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
321.1Spaulus * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
331.1Spaulus * SUCH DAMAGE.
341.1Spaulus */
351.1Spaulus
361.6Sthorpej#include <machine/asm.h>
371.5Sthorpej
381.1Spaulus#if defined(LIBC_SCCS) && !defined(lint)
391.5Sthorpej#if 0
401.5Sthorpej	RCSID("from: @(#)setjmp.s	5.1 (Berkeley) 5/12/90")
411.5Sthorpej#else
421.14Smatt	RCSID("$NetBSD: setjmp.S,v 1.14 2013/07/16 22:12:20 matt Exp $")
431.5Sthorpej#endif
441.1Spaulus#endif /* LIBC_SCCS and not lint */
451.1Spaulus
461.1Spaulus/*
471.1Spaulus * C library -- setjmp, longjmp
481.1Spaulus *
491.1Spaulus *	longjmp(a,v)
501.1Spaulus * will generate a "return(v)" from
511.1Spaulus * the last call to
521.1Spaulus *	setjmp(a)
531.1Spaulus * by restoring registers from the stack,
541.1Spaulus * and a struct sigcontext, see <signal.h>
551.1Spaulus */
561.1Spaulus
571.12SchristosENTRY(__setjmp14)
581.12Schristos	/* Get signal stack info.  Note overlay of ss_sp and ss_size! */
591.13Smatt	lea	-12(%sp),%sp	/* sizeof(stack_t) */
601.13Smatt	clrl	(%sp)		/* ss = NULL */
611.13Smatt	movl	%sp,4(%sp)	/* oss = stack_t on stack */
621.9Sitohy	jbsr	PIC_PLT(_C_LABEL(__sigaltstack14))
631.12Schristos
641.13Smatt	movl	8(%sp),%d0	/* ss_flags */
651.12Schristos	andl	#1,%d0		/* extract SS_ONSTACK */
661.13Smatt	lea	12(%sp),%sp	/* pop stack_t */
671.12Schristos
681.12Schristos	/* Get pointer to jmp_buf; a sigcontext is at the beginning. */
691.13Smatt	movl	4(%sp),%a0
701.13Smatt	movl	%d0,(%a0)	/* store onstack */
711.13Smatt	clrl	4(%a0)		/* unused word (old style signal mask) */
721.12Schristos
731.12Schristos	/* Get the signal mask. */
741.13Smatt	pea	28(%a0)	/* oset = &sc.sc_mask */
751.13Smatt	movl	#0,-(%sp)	/* set = NULL */
761.13Smatt	movl	#0,-(%sp)	/* action = 0 <ignored> */
771.12Schristos	jbsr	PIC_PLT(_C_LABEL(__sigprocmask14))
781.12Schristos	addl	#12,%sp
791.12Schristos
801.13Smatt	movl	4(%sp),%a0	/* get jmp_buf pointer again */
811.13Smatt	lea	4(%sp),%a1	/* adjust SP since we won't rts */
821.13Smatt	movl	%a1,8(%a0)	/* save SP */
831.13Smatt	movl	%a6,12(%a0)	/* save FP */
841.13Smatt	clrl	16(%a0)	/* no AP */
851.13Smatt	movl	(%sp),20(%a0)	/* save return PC */
861.13Smatt	clrl	24(%a0)	/* clear PS */
871.12Schristos
881.12Schristos	/* Save remaining non-scratch regs after signal mask. */
891.13Smatt	moveml	#0x3CFC,44(%a0)
901.12Schristos
911.10Sthorpej	clrl	%d0		/* return 0 */
921.1Spaulus	rts
931.14SmattEND(__setjmp14)
94