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