Home | History | Annotate | Line # | Download | only in gen
_setjmp.S revision 1.8
      1  1.8  jonathan /*	$NetBSD: _setjmp.S,v 1.8 1997/07/07 00:13:56 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.6  jonathan #include <mips/regnum.h>
     40  1.6  jonathan #include <mips/asm.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.8  jonathan 	ASMSTR("$NetBSD: _setjmp.S,v 1.8 1997/07/07 00:13:56 jonathan Exp $")
     45  1.1     glass #endif /* LIBC_SCCS and not lint */
     46  1.1     glass 
     47  1.6  jonathan #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  * The previous signal state is NOT restored.
     60  1.1     glass  */
     61  1.1     glass 
     62  1.1     glass 	.set	noreorder
     63  1.1     glass 
     64  1.3   mycroft LEAF(_setjmp)
     65  1.6  jonathan #ifdef ABICALLS
     66  1.8  jonathan 	#.set noreorder
     67  1.6  jonathan 	.cpload t9
     68  1.8  jonathan 	#.set reorder
     69  1.7  jonathan #endif
     70  1.7  jonathan 
     71  1.1     glass 	li	v0, 0xACEDBADE			# sigcontext magic number
     72  1.1     glass 	sw	ra, (2 * 4)(a0)			# sc_pc = return address
     73  1.1     glass 	sw	v0, (3 * 4)(a0)			#   saved in sc_regs[0]
     74  1.1     glass 	sw	s0, ((S0 + 3) * 4)(a0)
     75  1.1     glass 	sw	s1, ((S1 + 3) * 4)(a0)
     76  1.1     glass 	sw	s2, ((S2 + 3) * 4)(a0)
     77  1.1     glass 	sw	s3, ((S3 + 3) * 4)(a0)
     78  1.1     glass 	sw	s4, ((S4 + 3) * 4)(a0)
     79  1.1     glass 	sw	s5, ((S5 + 3) * 4)(a0)
     80  1.1     glass 	sw	s6, ((S6 + 3) * 4)(a0)
     81  1.1     glass 	sw	s7, ((S7 + 3) * 4)(a0)
     82  1.1     glass 	sw	sp, ((SP + 3) * 4)(a0)
     83  1.1     glass 	sw	s8, ((S8 + 3) * 4)(a0)
     84  1.1     glass 	cfc1	v0, $31				# too bad cant check if FP used
     85  1.1     glass 	swc1	$f20, ((20 + 38) * 4)(a0)
     86  1.1     glass 	swc1	$f21, ((21 + 38) * 4)(a0)
     87  1.1     glass 	swc1	$f22, ((22 + 38) * 4)(a0)
     88  1.1     glass 	swc1	$f23, ((23 + 38) * 4)(a0)
     89  1.1     glass 	swc1	$f24, ((24 + 38) * 4)(a0)
     90  1.1     glass 	swc1	$f25, ((25 + 38) * 4)(a0)
     91  1.1     glass 	swc1	$f26, ((26 + 38) * 4)(a0)
     92  1.1     glass 	swc1	$f27, ((27 + 38) * 4)(a0)
     93  1.1     glass 	swc1	$f28, ((28 + 38) * 4)(a0)
     94  1.1     glass 	swc1	$f29, ((29 + 38) * 4)(a0)
     95  1.1     glass 	swc1	$f30, ((30 + 38) * 4)(a0)
     96  1.1     glass 	swc1	$f31, ((31 + 38) * 4)(a0)
     97  1.1     glass 	sw	v0, ((32 + 38) * 4)(a0)
     98  1.1     glass 	j	ra
     99  1.1     glass 	move	v0, zero
    100  1.3   mycroft END(_setjmp)
    101  1.1     glass 
    102  1.3   mycroft LEAF(_longjmp)
    103  1.6  jonathan #ifdef ABICALLS
    104  1.6  jonathan 	.set    noreorder
    105  1.6  jonathan 	.cpload t9
    106  1.6  jonathan 	.set    reorder
    107  1.6  jonathan 	subu	sp, sp, 32
    108  1.6  jonathan 	.cprestore 16
    109  1.6  jonathan 	.set    noreorder
    110  1.6  jonathan #endif
    111  1.1     glass 	lw	v0, (3 * 4)(a0)			# get magic number
    112  1.1     glass 	lw	ra, (2 * 4)(a0)
    113  1.1     glass 	bne	v0, 0xACEDBADE, botch		# jump if error
    114  1.6  jonathan 
    115  1.6  jonathan 	addu	sp, sp, 32			# don't matter, sanity
    116  1.1     glass 	lw	s0, ((S0 + 3) * 4)(a0)
    117  1.1     glass 	lw	s1, ((S1 + 3) * 4)(a0)
    118  1.1     glass 	lw	s2, ((S2 + 3) * 4)(a0)
    119  1.1     glass 	lw	s3, ((S3 + 3) * 4)(a0)
    120  1.1     glass 	lw	s4, ((S4 + 3) * 4)(a0)
    121  1.1     glass 	lw	s5, ((S5 + 3) * 4)(a0)
    122  1.1     glass 	lw	s6, ((S6 + 3) * 4)(a0)
    123  1.1     glass 	lw	s7, ((S7 + 3) * 4)(a0)
    124  1.1     glass 	lw	v0, ((32 + 38) * 4)(a0)		# get fpu status
    125  1.1     glass 	lw	sp, ((SP + 3) * 4)(a0)
    126  1.1     glass 	lw	s8, ((S8 + 3) * 4)(a0)
    127  1.1     glass 	ctc1	v0, $31
    128  1.1     glass 	lwc1	$f20, ((20 + 38) * 4)(a0)
    129  1.1     glass 	lwc1	$f21, ((21 + 38) * 4)(a0)
    130  1.1     glass 	lwc1	$f22, ((22 + 38) * 4)(a0)
    131  1.1     glass 	lwc1	$f23, ((23 + 38) * 4)(a0)
    132  1.1     glass 	lwc1	$f24, ((24 + 38) * 4)(a0)
    133  1.1     glass 	lwc1	$f25, ((25 + 38) * 4)(a0)
    134  1.1     glass 	lwc1	$f26, ((26 + 38) * 4)(a0)
    135  1.1     glass 	lwc1	$f27, ((27 + 38) * 4)(a0)
    136  1.1     glass 	lwc1	$f28, ((28 + 38) * 4)(a0)
    137  1.1     glass 	lwc1	$f29, ((29 + 38) * 4)(a0)
    138  1.1     glass 	lwc1	$f30, ((30 + 38) * 4)(a0)
    139  1.1     glass 	lwc1	$f31, ((31 + 38) * 4)(a0)
    140  1.6  jonathan 
    141  1.1     glass 	j	ra
    142  1.1     glass 	move	v0, a1
    143  1.1     glass botch:
    144  1.3   mycroft 	jal	_C_LABEL(longjmperror)
    145  1.1     glass 	nop
    146  1.3   mycroft 	jal	_C_LABEL(abort)
    147  1.1     glass 	nop
    148  1.3   mycroft END(_longjmp)
    149