1/*- 2 * Copyright (c) 1991, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Ralph Campbell. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. All advertising materials mentioning features or use of this software 17 * must display the following acknowledgement: 18 * This product includes software developed by the University of 19 * California, Berkeley and its contributors. 20 * 4. Neither the name of the University nor the names of its contributors 21 * may be used to endorse or promote products derived from this software 22 * without specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 */ 36 37#include <machine/reg.h> 38#include <machine/machAsmDefs.h> 39 40#if defined(LIBC_SCCS) && !defined(lint) 41 ASMSTR("from: @(#)_setjmp.s 8.1 (Berkeley) 6/4/93") 42 ASMSTR("$Id: _setjmp.S,v 1.3 1994/12/15 17:24:46 mycroft Exp $") 43#endif /* LIBC_SCCS and not lint */ 44 45/* 46 * C library -- _setjmp, _longjmp 47 * 48 * _longjmp(a,v) 49 * will generate a "return(v)" from 50 * the last call to 51 * _setjmp(a) 52 * by restoring registers from the stack, 53 * The previous signal state is NOT restored. 54 */ 55 56 .set noreorder 57 58LEAF(_setjmp) 59 li v0, 0xACEDBADE # sigcontext magic number 60 sw ra, (2 * 4)(a0) # sc_pc = return address 61 sw v0, (3 * 4)(a0) # saved in sc_regs[0] 62 sw s0, ((S0 + 3) * 4)(a0) 63 sw s1, ((S1 + 3) * 4)(a0) 64 sw s2, ((S2 + 3) * 4)(a0) 65 sw s3, ((S3 + 3) * 4)(a0) 66 sw s4, ((S4 + 3) * 4)(a0) 67 sw s5, ((S5 + 3) * 4)(a0) 68 sw s6, ((S6 + 3) * 4)(a0) 69 sw s7, ((S7 + 3) * 4)(a0) 70 sw sp, ((SP + 3) * 4)(a0) 71 sw s8, ((S8 + 3) * 4)(a0) 72 cfc1 v0, $31 # too bad cant check if FP used 73 swc1 $f20, ((20 + 38) * 4)(a0) 74 swc1 $f21, ((21 + 38) * 4)(a0) 75 swc1 $f22, ((22 + 38) * 4)(a0) 76 swc1 $f23, ((23 + 38) * 4)(a0) 77 swc1 $f24, ((24 + 38) * 4)(a0) 78 swc1 $f25, ((25 + 38) * 4)(a0) 79 swc1 $f26, ((26 + 38) * 4)(a0) 80 swc1 $f27, ((27 + 38) * 4)(a0) 81 swc1 $f28, ((28 + 38) * 4)(a0) 82 swc1 $f29, ((29 + 38) * 4)(a0) 83 swc1 $f30, ((30 + 38) * 4)(a0) 84 swc1 $f31, ((31 + 38) * 4)(a0) 85 sw v0, ((32 + 38) * 4)(a0) 86 j ra 87 move v0, zero 88END(_setjmp) 89 90LEAF(_longjmp) 91 lw v0, (3 * 4)(a0) # get magic number 92 lw ra, (2 * 4)(a0) 93 bne v0, 0xACEDBADE, botch # jump if error 94 lw s0, ((S0 + 3) * 4)(a0) 95 lw s1, ((S1 + 3) * 4)(a0) 96 lw s2, ((S2 + 3) * 4)(a0) 97 lw s3, ((S3 + 3) * 4)(a0) 98 lw s4, ((S4 + 3) * 4)(a0) 99 lw s5, ((S5 + 3) * 4)(a0) 100 lw s6, ((S6 + 3) * 4)(a0) 101 lw s7, ((S7 + 3) * 4)(a0) 102 lw v0, ((32 + 38) * 4)(a0) # get fpu status 103 lw sp, ((SP + 3) * 4)(a0) 104 lw s8, ((S8 + 3) * 4)(a0) 105 ctc1 v0, $31 106 lwc1 $f20, ((20 + 38) * 4)(a0) 107 lwc1 $f21, ((21 + 38) * 4)(a0) 108 lwc1 $f22, ((22 + 38) * 4)(a0) 109 lwc1 $f23, ((23 + 38) * 4)(a0) 110 lwc1 $f24, ((24 + 38) * 4)(a0) 111 lwc1 $f25, ((25 + 38) * 4)(a0) 112 lwc1 $f26, ((26 + 38) * 4)(a0) 113 lwc1 $f27, ((27 + 38) * 4)(a0) 114 lwc1 $f28, ((28 + 38) * 4)(a0) 115 lwc1 $f29, ((29 + 38) * 4)(a0) 116 lwc1 $f30, ((30 + 38) * 4)(a0) 117 lwc1 $f31, ((31 + 38) * 4)(a0) 118 j ra 119 move v0, a1 120botch: 121 jal _C_LABEL(longjmperror) 122 nop 123 jal _C_LABEL(abort) 124 nop 125END(_longjmp) 126