Home | History | Annotate | Line # | Download | only in gen
setjmp.S revision 1.6
      1  1.6  jonathan /*	$NetBSD: setjmp.S,v 1.6 1996/09/17 01:32:27 jonathan 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.1     glass #include <sys/syscall.h>
     40  1.6  jonathan #include <mips/regnum.h>
     41  1.6  jonathan #include <mips/asm.h>
     42  1.1     glass 
     43  1.1     glass #if defined(LIBC_SCCS) && !defined(lint)
     44  1.1     glass 	ASMSTR("from: @(#)setjmp.s	8.1 (Berkeley) 6/4/93")
     45  1.6  jonathan 	ASMSTR("$NetBSD: setjmp.S,v 1.6 1996/09/17 01:32:27 jonathan Exp $")
     46  1.1     glass #endif /* LIBC_SCCS and not lint */
     47  1.1     glass 
     48  1.6  jonathan #ifdef ABICALLS
     49  1.6  jonathan 	.abicalls
     50  1.6  jonathan #endif
     51  1.6  jonathan 
     52  1.1     glass /*
     53  1.1     glass  * C library -- setjmp, longjmp
     54  1.1     glass  *
     55  1.1     glass  *	longjmp(a,v)
     56  1.1     glass  * will generate a "return(v)" from
     57  1.1     glass  * the last call to
     58  1.1     glass  *	setjmp(a)
     59  1.1     glass  * by restoring registers from the stack,
     60  1.1     glass  * and a struct sigcontext, see <signal.h>
     61  1.1     glass  */
     62  1.1     glass 
     63  1.1     glass #define SETJMP_FRAME_SIZE	(STAND_FRAME_SIZE + 12)
     64  1.1     glass 
     65  1.3   mycroft NON_LEAF(setjmp, SETJMP_FRAME_SIZE, ra)
     66  1.6  jonathan 	.mask	0x80000000, (STAND_RA_OFFSET - STAND_FRAME_SIZE)
     67  1.6  jonathan #ifdef ABICALLS
     68  1.6  jonathan 	.set	noreorder
     69  1.6  jonathan 	.cpload	t9
     70  1.6  jonathan 	.set	reorder
     71  1.6  jonathan #endif
     72  1.1     glass 	subu	sp, sp, SETJMP_FRAME_SIZE	# allocate stack frame
     73  1.6  jonathan #ifdef ABICALLS
     74  1.6  jonathan 	.cprestore 16
     75  1.6  jonathan #endif
     76  1.1     glass 	sw	ra, STAND_RA_OFFSET(sp)		# save state
     77  1.1     glass 	sw	a0, SETJMP_FRAME_SIZE(sp)
     78  1.1     glass 	move	a0, zero			# get current signal mask
     79  1.3   mycroft 	jal	_C_LABEL(sigblock)
     80  1.1     glass 	lw	v1, SETJMP_FRAME_SIZE(sp)	# v1 = jmpbuf
     81  1.1     glass 	sw	v0, (1 * 4)(v1)			# save sc_mask = sigblock(0)
     82  1.1     glass 	move	a0, zero
     83  1.1     glass 	addu	a1, sp, STAND_FRAME_SIZE	# pointer to struct sigaltstack
     84  1.3   mycroft 	jal	_C_LABEL(sigaltstack)
     85  1.1     glass 	lw	a0, SETJMP_FRAME_SIZE(sp)	# restore jmpbuf
     86  1.1     glass 	lw	v1, STAND_FRAME_SIZE+8(sp)	# get old ss_onstack
     87  1.1     glass 	and	v1, v1, 1			# extract onstack flag
     88  1.1     glass 	sw	v1, 0(a0)			# save it in sc_onstack
     89  1.1     glass 	lw	ra, STAND_RA_OFFSET(sp)
     90  1.1     glass 	addu	sp, sp, SETJMP_FRAME_SIZE
     91  1.1     glass 	blt	v0, zero, botch			# check for sigstack() error
     92  1.1     glass 	sw	ra, (2 * 4)(a0)			# sc_pc = return address
     93  1.1     glass 	li	v0, 0xACEDBADE			# sigcontext magic number
     94  1.1     glass 	sw	v0, ((ZERO + 3) * 4)(a0)	#   saved in sc_regs[0]
     95  1.1     glass 	sw	s0, ((S0 + 3) * 4)(a0)
     96  1.1     glass 	sw	s1, ((S1 + 3) * 4)(a0)
     97  1.1     glass 	sw	s2, ((S2 + 3) * 4)(a0)
     98  1.1     glass 	sw	s3, ((S3 + 3) * 4)(a0)
     99  1.1     glass 	sw	s4, ((S4 + 3) * 4)(a0)
    100  1.1     glass 	sw	s5, ((S5 + 3) * 4)(a0)
    101  1.1     glass 	sw	s6, ((S6 + 3) * 4)(a0)
    102  1.1     glass 	sw	s7, ((S7 + 3) * 4)(a0)
    103  1.1     glass 	sw	gp, ((GP + 3) * 4)(a0)
    104  1.1     glass 	sw	sp, ((SP + 3) * 4)(a0)
    105  1.1     glass 	sw	s8, ((S8 + 3) * 4)(a0)
    106  1.1     glass 	li	v0, 1				# be nice if we could tell
    107  1.1     glass 	sw	v0, (37 * 4)(a0)		# sc_fpused = 1
    108  1.1     glass 	cfc1	v0, $31
    109  1.1     glass 	swc1	$f20, ((20 + 38) * 4)(a0)
    110  1.1     glass 	swc1	$f21, ((21 + 38) * 4)(a0)
    111  1.1     glass 	swc1	$f22, ((22 + 38) * 4)(a0)
    112  1.1     glass 	swc1	$f23, ((23 + 38) * 4)(a0)
    113  1.1     glass 	swc1	$f24, ((24 + 38) * 4)(a0)
    114  1.1     glass 	swc1	$f25, ((25 + 38) * 4)(a0)
    115  1.1     glass 	swc1	$f26, ((26 + 38) * 4)(a0)
    116  1.1     glass 	swc1	$f27, ((27 + 38) * 4)(a0)
    117  1.1     glass 	swc1	$f28, ((28 + 38) * 4)(a0)
    118  1.1     glass 	swc1	$f29, ((29 + 38) * 4)(a0)
    119  1.1     glass 	swc1	$f30, ((30 + 38) * 4)(a0)
    120  1.1     glass 	swc1	$f31, ((31 + 38) * 4)(a0)
    121  1.1     glass 	sw	v0, ((32 + 38) * 4)(a0)
    122  1.1     glass 	move	v0, zero
    123  1.1     glass 	j	ra
    124  1.3   mycroft END(setjmp)
    125  1.1     glass 
    126  1.3   mycroft LEAF(longjmp)
    127  1.6  jonathan #ifdef ABICALLS
    128  1.6  jonathan 	.set	noreorder
    129  1.6  jonathan 	.cpload	t9
    130  1.6  jonathan 	.set	reorder
    131  1.6  jonathan 	subu	sp, sp, 32
    132  1.6  jonathan 	.cprestore 16
    133  1.6  jonathan #endif
    134  1.1     glass 	sw	a1, ((V0 + 3) * 4)(a0)	# save return value in sc_regs[V0]
    135  1.1     glass 	li	v0, SYS_sigreturn
    136  1.1     glass 	syscall
    137  1.1     glass botch:
    138  1.3   mycroft 	jal	_C_LABEL(longjmperror)
    139  1.3   mycroft 	jal	_C_LABEL(abort)
    140  1.3   mycroft END(longjmp)
    141