Home | History | Annotate | Line # | Download | only in gen
setjmp.S revision 1.16
      1  1.16        he /*	$NetBSD: setjmp.S,v 1.16 2003/11/26 08:36:49 he 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.15       agc  * 3. Neither the name of the University nor the names of its contributors
     19   1.1     glass  *    may be used to endorse or promote products derived from this software
     20   1.1     glass  *    without specific prior written permission.
     21   1.1     glass  *
     22   1.1     glass  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     23   1.1     glass  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     24   1.1     glass  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     25   1.1     glass  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     26   1.1     glass  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     27   1.1     glass  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     28   1.1     glass  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     29   1.1     glass  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     30   1.1     glass  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     31   1.1     glass  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     32   1.1     glass  * SUCH DAMAGE.
     33   1.1     glass  */
     34   1.1     glass 
     35   1.9    castor #include <machine/cdefs.h>
     36   1.1     glass #include <sys/syscall.h>
     37   1.6  jonathan #include <mips/regnum.h>
     38   1.6  jonathan #include <mips/asm.h>
     39  1.10    castor #include <machine/signal.h>
     40   1.9    castor #include <machine/setjmp.h>
     41   1.1     glass 
     42   1.1     glass #if defined(LIBC_SCCS) && !defined(lint)
     43   1.1     glass 	ASMSTR("from: @(#)setjmp.s	8.1 (Berkeley) 6/4/93")
     44  1.16        he 	ASMSTR("$NetBSD: setjmp.S,v 1.16 2003/11/26 08:36:49 he Exp $")
     45   1.1     glass #endif /* LIBC_SCCS and not lint */
     46   1.1     glass 
     47  1.14   thorpej #ifdef __ABICALLS__
     48   1.6  jonathan 	.abicalls
     49   1.6  jonathan #endif
     50   1.6  jonathan 
     51   1.1     glass /*
     52   1.1     glass  * C library -- setjmp, longjmp
     53   1.1     glass  *
     54   1.1     glass  *	longjmp(a,v)
     55   1.1     glass  * will generate a "return(v)" from
     56   1.1     glass  * the last call to
     57   1.1     glass  *	setjmp(a)
     58   1.1     glass  * by restoring registers from the stack,
     59   1.1     glass  * and a struct sigcontext, see <signal.h>
     60   1.1     glass  */
     61   1.1     glass 
     62  1.10    castor #define SETJMP_FRAME_SIZE	(CALLFRAME_SIZ + 12)
     63   1.1     glass 
     64   1.3   mycroft NON_LEAF(setjmp, SETJMP_FRAME_SIZE, ra)
     65  1.10    castor 	.mask	0x80000000, (CALLFRAME_RA - CALLFRAME_SIZ)
     66  1.14   thorpej #ifdef __ABICALLS__
     67   1.6  jonathan 	.set	noreorder
     68   1.6  jonathan 	.cpload	t9
     69   1.6  jonathan 	.set	reorder
     70   1.6  jonathan #endif
     71   1.1     glass 	subu	sp, sp, SETJMP_FRAME_SIZE	# allocate stack frame
     72  1.14   thorpej #ifdef __ABICALLS__
     73   1.6  jonathan 	.cprestore 16
     74   1.6  jonathan #endif
     75  1.10    castor 	sw	ra, CALLFRAME_RA(sp)		# save state
     76   1.1     glass 	sw	a0, SETJMP_FRAME_SIZE(sp)
     77   1.1     glass 	move	a0, zero			# get current signal mask
     78   1.3   mycroft 	jal	_C_LABEL(sigblock)
     79   1.1     glass 	lw	v1, SETJMP_FRAME_SIZE(sp)	# v1 = jmpbuf
     80   1.1     glass 	sw	v0, (1 * 4)(v1)			# save sc_mask = sigblock(0)
     81   1.1     glass 	move	a0, zero
     82  1.10    castor 	addu	a1, sp, CALLFRAME_SIZ	# pointer to struct sigaltstack
     83   1.7   thorpej 	jal	_C_LABEL(__sigaltstack14)
     84   1.1     glass 	lw	a0, SETJMP_FRAME_SIZE(sp)	# restore jmpbuf
     85  1.10    castor 	lw	v1, CALLFRAME_SIZ+8(sp)	# get old ss_onstack
     86   1.1     glass 	and	v1, v1, 1			# extract onstack flag
     87   1.1     glass 	sw	v1, 0(a0)			# save it in sc_onstack
     88  1.10    castor 	lw	ra, CALLFRAME_RA(sp)
     89   1.1     glass 	addu	sp, sp, SETJMP_FRAME_SIZE
     90   1.1     glass 	blt	v0, zero, botch			# check for sigstack() error
     91   1.9    castor 	REG_PROLOGUE
     92   1.9    castor 	REG_S	ra, (2 * 4)(a0)			# sc_pc = return address
     93   1.9    castor 	REG_LI	v0, 0xACEDBADE			# sigcontext magic number
     94  1.16        he 	REG_S	v0, (_OFFSETOF_SC_REGS + SZREG * _R_ZERO)(a0) # saved in sc_regs[0]
     95  1.16        he 	REG_S	s0, (_OFFSETOF_SC_REGS + SZREG * _R_S0)(a0)
     96  1.16        he 	REG_S	s1, (_OFFSETOF_SC_REGS + SZREG * _R_S1)(a0)
     97  1.16        he 	REG_S	s2, (_OFFSETOF_SC_REGS + SZREG * _R_S2)(a0)
     98  1.16        he 	REG_S	s3, (_OFFSETOF_SC_REGS + SZREG * _R_S3)(a0)
     99  1.16        he 	REG_S	s4, (_OFFSETOF_SC_REGS + SZREG * _R_S4)(a0)
    100  1.16        he 	REG_S	s5, (_OFFSETOF_SC_REGS + SZREG * _R_S5)(a0)
    101  1.16        he 	REG_S	s6, (_OFFSETOF_SC_REGS + SZREG * _R_S6)(a0)
    102  1.16        he 	REG_S	s7, (_OFFSETOF_SC_REGS + SZREG * _R_S7)(a0)
    103  1.16        he 	REG_S	gp, (_OFFSETOF_SC_REGS + SZREG * _R_GP)(a0)
    104  1.16        he 	REG_S	sp, (_OFFSETOF_SC_REGS + SZREG * _R_SP)(a0)
    105  1.16        he 	REG_S	s8, (_OFFSETOF_SC_REGS + SZREG * _R_S8)(a0)
    106   1.1     glass 	li	v0, 1				# be nice if we could tell
    107   1.9    castor 	sw	v0, (_OFFSETOF_SC_REGS + 34 * SZREG)(a0)	# sc_fpused = 1
    108   1.1     glass 	cfc1	v0, $31
    109   1.9    castor 	swc1	$f20, (20 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    110   1.9    castor 	swc1	$f21, (21 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    111   1.9    castor 	swc1	$f22, (22 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    112   1.9    castor 	swc1	$f23, (23 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    113   1.9    castor 	swc1	$f24, (24 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    114   1.9    castor 	swc1	$f25, (25 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    115   1.9    castor 	swc1	$f26, (26 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    116   1.9    castor 	swc1	$f27, (27 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    117   1.9    castor 	swc1	$f28, (28 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    118   1.9    castor 	swc1	$f29, (29 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    119   1.9    castor 	swc1	$f30, (30 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    120   1.9    castor 	swc1	$f31, (31 * 4 + _OFFSETOF_SC_FPREGS)(a0)
    121  1.12      shin 	sw	v0, ((32 * 4) + _OFFSETOF_SC_FPREGS)(a0)
    122   1.9    castor 	REG_EPILOGUE
    123   1.1     glass 	move	v0, zero
    124   1.1     glass 	j	ra
    125   1.3   mycroft END(setjmp)
    126   1.1     glass 
    127   1.3   mycroft LEAF(longjmp)
    128  1.14   thorpej #ifdef __ABICALLS__
    129   1.6  jonathan 	.set	noreorder
    130   1.6  jonathan 	.cpload	t9
    131   1.6  jonathan 	.set	reorder
    132   1.6  jonathan 	subu	sp, sp, 32
    133   1.6  jonathan 	.cprestore 16
    134   1.6  jonathan #endif
    135   1.9    castor 	REG_PROLOGUE
    136  1.16        he 	/* save return value in sc_regs[_R_V0] */
    137  1.16        he 	REG_S	a1, (_OFFSETOF_SC_REGS + _R_V0 * SZREG)(a0)
    138   1.9    castor 	REG_EPILOGUE
    139   1.8  jonathan 	li	v0, SYS_compat_13_sigreturn13
    140   1.1     glass 	syscall
    141   1.1     glass botch:
    142   1.3   mycroft 	jal	_C_LABEL(longjmperror)
    143   1.3   mycroft 	jal	_C_LABEL(abort)
    144   1.3   mycroft END(longjmp)
    145