Home | History | Annotate | Line # | Download | only in gen
setjmp.S revision 1.10.4.1
      1  1.10.4.1  wrstuden /*	$NetBSD: setjmp.S,v 1.10.4.1 1999/12/27 18:29:35 wrstuden Exp $	*/
      2       1.5  jonathan 
      3       1.1     glass /*-
      4       1.1     glass  * Copyright (c) 1991, 1993
      5       1.1     glass  *	The Regents of the University of California.  All rights reserved.
      6       1.1     glass  *
      7       1.1     glass  * This code is derived from software contributed to Berkeley by
      8       1.1     glass  * Ralph Campbell.
      9       1.1     glass  *
     10       1.1     glass  * Redistribution and use in source and binary forms, with or without
     11       1.1     glass  * modification, are permitted provided that the following conditions
     12       1.1     glass  * are met:
     13       1.1     glass  * 1. Redistributions of source code must retain the above copyright
     14       1.1     glass  *    notice, this list of conditions and the following disclaimer.
     15       1.1     glass  * 2. Redistributions in binary form must reproduce the above copyright
     16       1.1     glass  *    notice, this list of conditions and the following disclaimer in the
     17       1.1     glass  *    documentation and/or other materials provided with the distribution.
     18       1.1     glass  * 3. All advertising materials mentioning features or use of this software
     19       1.1     glass  *    must display the following acknowledgement:
     20       1.1     glass  *	This product includes software developed by the University of
     21       1.1     glass  *	California, Berkeley and its contributors.
     22       1.1     glass  * 4. Neither the name of the University nor the names of its contributors
     23       1.1     glass  *    may be used to endorse or promote products derived from this software
     24       1.1     glass  *    without specific prior written permission.
     25       1.1     glass  *
     26       1.1     glass  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     27       1.1     glass  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     28       1.1     glass  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     29       1.1     glass  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     30       1.1     glass  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     31       1.1     glass  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     32       1.1     glass  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     33       1.1     glass  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     34       1.1     glass  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     35       1.1     glass  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     36       1.1     glass  * SUCH DAMAGE.
     37       1.1     glass  */
     38       1.1     glass 
     39       1.9    castor #include <machine/cdefs.h>
     40       1.1     glass #include <sys/syscall.h>
     41       1.6  jonathan #include <mips/regnum.h>
     42       1.6  jonathan #include <mips/asm.h>
     43      1.10    castor #include <machine/signal.h>
     44       1.9    castor #include <machine/setjmp.h>
     45       1.1     glass 
     46       1.1     glass #if defined(LIBC_SCCS) && !defined(lint)
     47       1.1     glass 	ASMSTR("from: @(#)setjmp.s	8.1 (Berkeley) 6/4/93")
     48  1.10.4.1  wrstuden 	ASMSTR("$NetBSD: setjmp.S,v 1.10.4.1 1999/12/27 18:29:35 wrstuden Exp $")
     49       1.1     glass #endif /* LIBC_SCCS and not lint */
     50       1.1     glass 
     51       1.6  jonathan #ifdef ABICALLS
     52       1.6  jonathan 	.abicalls
     53       1.6  jonathan #endif
     54       1.6  jonathan 
     55       1.1     glass /*
     56       1.1     glass  * C library -- setjmp, longjmp
     57       1.1     glass  *
     58       1.1     glass  *	longjmp(a,v)
     59       1.1     glass  * will generate a "return(v)" from
     60       1.1     glass  * the last call to
     61       1.1     glass  *	setjmp(a)
     62       1.1     glass  * by restoring registers from the stack,
     63       1.1     glass  * and a struct sigcontext, see <signal.h>
     64       1.1     glass  */
     65       1.1     glass 
     66      1.10    castor #define SETJMP_FRAME_SIZE	(CALLFRAME_SIZ + 12)
     67       1.1     glass 
     68       1.3   mycroft NON_LEAF(setjmp, SETJMP_FRAME_SIZE, ra)
     69      1.10    castor 	.mask	0x80000000, (CALLFRAME_RA - CALLFRAME_SIZ)
     70       1.6  jonathan #ifdef ABICALLS
     71       1.6  jonathan 	.set	noreorder
     72       1.6  jonathan 	.cpload	t9
     73       1.6  jonathan 	.set	reorder
     74       1.6  jonathan #endif
     75       1.1     glass 	subu	sp, sp, SETJMP_FRAME_SIZE	# allocate stack frame
     76       1.6  jonathan #ifdef ABICALLS
     77       1.6  jonathan 	.cprestore 16
     78       1.6  jonathan #endif
     79      1.10    castor 	sw	ra, CALLFRAME_RA(sp)		# save state
     80       1.1     glass 	sw	a0, SETJMP_FRAME_SIZE(sp)
     81       1.1     glass 	move	a0, zero			# get current signal mask
     82       1.3   mycroft 	jal	_C_LABEL(sigblock)
     83       1.1     glass 	lw	v1, SETJMP_FRAME_SIZE(sp)	# v1 = jmpbuf
     84       1.1     glass 	sw	v0, (1 * 4)(v1)			# save sc_mask = sigblock(0)
     85       1.1     glass 	move	a0, zero
     86      1.10    castor 	addu	a1, sp, CALLFRAME_SIZ	# pointer to struct sigaltstack
     87       1.7   thorpej 	jal	_C_LABEL(__sigaltstack14)
     88       1.1     glass 	lw	a0, SETJMP_FRAME_SIZE(sp)	# restore jmpbuf
     89      1.10    castor 	lw	v1, CALLFRAME_SIZ+8(sp)	# get old ss_onstack
     90       1.1     glass 	and	v1, v1, 1			# extract onstack flag
     91       1.1     glass 	sw	v1, 0(a0)			# save it in sc_onstack
     92      1.10    castor 	lw	ra, CALLFRAME_RA(sp)
     93       1.1     glass 	addu	sp, sp, SETJMP_FRAME_SIZE
     94       1.1     glass 	blt	v0, zero, botch			# check for sigstack() error
     95       1.9    castor 	REG_PROLOGUE
     96       1.9    castor 	REG_S	ra, (2 * 4)(a0)			# sc_pc = return address
     97       1.9    castor 	REG_LI	v0, 0xACEDBADE			# sigcontext magic number
     98       1.9    castor 	REG_S	v0, (_OFFSETOF_SC_REGS + SZREG * ZERO)(a0) # saved in sc_regs[0]
     99       1.9    castor 	REG_S	s0, (_OFFSETOF_SC_REGS + SZREG * S0)(a0)
    100       1.9    castor 	REG_S	s1, (_OFFSETOF_SC_REGS + SZREG * S1)(a0)
    101       1.9    castor 	REG_S	s2, (_OFFSETOF_SC_REGS + SZREG * S2)(a0)
    102       1.9    castor 	REG_S	s3, (_OFFSETOF_SC_REGS + SZREG * S3)(a0)
    103       1.9    castor 	REG_S	s4, (_OFFSETOF_SC_REGS + SZREG * S4)(a0)
    104       1.9    castor 	REG_S	s5, (_OFFSETOF_SC_REGS + SZREG * S5)(a0)
    105       1.9    castor 	REG_S	s6, (_OFFSETOF_SC_REGS + SZREG * S6)(a0)
    106       1.9    castor 	REG_S	s7, (_OFFSETOF_SC_REGS + SZREG * S7)(a0)
    107       1.9    castor 	REG_S	gp, (_OFFSETOF_SC_REGS + SZREG * GP)(a0)
    108       1.9    castor 	REG_S	sp, (_OFFSETOF_SC_REGS + SZREG * SP)(a0)
    109       1.9    castor 	REG_S	s8, (_OFFSETOF_SC_REGS + SZREG * S8)(a0)
    110       1.1     glass 	li	v0, 1				# be nice if we could tell
    111       1.9    castor 	sw	v0, (_OFFSETOF_SC_REGS + 34 * SZREG)(a0)	# sc_fpused = 1
    112  1.10.4.1  wrstuden #ifndef SOFTFLOAT
    113       1.1     glass 	cfc1	v0, $31
    114       1.9    castor 	swc1	$f20, (20 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    115       1.9    castor 	swc1	$f21, (21 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    116       1.9    castor 	swc1	$f22, (22 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    117       1.9    castor 	swc1	$f23, (23 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    118       1.9    castor 	swc1	$f24, (24 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    119       1.9    castor 	swc1	$f25, (25 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    120       1.9    castor 	swc1	$f26, (26 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    121       1.9    castor 	swc1	$f27, (27 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    122       1.9    castor 	swc1	$f28, (28 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    123       1.9    castor 	swc1	$f29, (29 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    124       1.9    castor 	swc1	$f30, (30 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    125       1.9    castor 	swc1	$f31, (31 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    126       1.9    castor 	sw	v0, ((32 * 4) + _OFFSETOF_SC_FPREGS)(a0)
    127  1.10.4.1  wrstuden #endif
    128       1.9    castor 	REG_EPILOGUE
    129       1.1     glass 	move	v0, zero
    130       1.1     glass 	j	ra
    131       1.3   mycroft END(setjmp)
    132       1.1     glass 
    133       1.3   mycroft LEAF(longjmp)
    134       1.6  jonathan #ifdef ABICALLS
    135       1.6  jonathan 	.set	noreorder
    136       1.6  jonathan 	.cpload	t9
    137       1.6  jonathan 	.set	reorder
    138       1.6  jonathan 	subu	sp, sp, 32
    139       1.6  jonathan 	.cprestore 16
    140       1.6  jonathan #endif
    141       1.9    castor 	REG_PROLOGUE
    142       1.9    castor 	/* save return value in sc_regs[V0] */
    143       1.9    castor 	REG_S	a1, (_OFFSETOF_SC_REGS + V0 * SZREG)(a0)
    144       1.9    castor 	REG_EPILOGUE
    145       1.8  jonathan 	li	v0, SYS_compat_13_sigreturn13
    146       1.1     glass 	syscall
    147       1.1     glass botch:
    148       1.3   mycroft 	jal	_C_LABEL(longjmperror)
    149       1.3   mycroft 	jal	_C_LABEL(abort)
    150       1.3   mycroft END(longjmp)
    151