1 1.27 riastrad /* $NetBSD: _setjmp.S,v 1.27 2025/04/22 17:01:31 riastradh 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.17 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.10 castor #include <machine/cdefs.h> 36 1.6 jonathan #include <mips/regnum.h> 37 1.6 jonathan #include <mips/asm.h> 38 1.10 castor #include <machine/setjmp.h> 39 1.11 jonathan #include <machine/signal.h> /* XXX */ 40 1.1 glass 41 1.21 matt #include "assym.h" 42 1.21 matt 43 1.21 matt #include "SYS.h" 44 1.21 matt 45 1.1 glass #if defined(LIBC_SCCS) && !defined(lint) 46 1.21 matt #if 0 47 1.21 matt RCSID("from: @(#)_setjmp.s 8.1 (Berkeley) 6/4/93") 48 1.21 matt #else 49 1.27 riastrad RCSID("$NetBSD: _setjmp.S,v 1.27 2025/04/22 17:01:31 riastradh Exp $") 50 1.21 matt #endif 51 1.1 glass #endif /* LIBC_SCCS and not lint */ 52 1.1 glass 53 1.1 glass /* 54 1.1 glass * C library -- _setjmp, _longjmp 55 1.1 glass * 56 1.1 glass * _longjmp(a,v) 57 1.1 glass * will generate a "return(v)" from 58 1.1 glass * the last call to 59 1.1 glass * _setjmp(a) 60 1.1 glass * by restoring registers from the stack, 61 1.1 glass * The previous signal state is NOT restored. 62 1.1 glass */ 63 1.1 glass 64 1.1 glass .set noreorder 65 1.1 glass 66 1.3 mycroft LEAF(_setjmp) 67 1.10 castor REG_PROLOGUE 68 1.10 castor REG_LI v0, 0xACEDBADE # sigcontext magic number 69 1.26 skrll REG_S ra, _SC_PC(a0) # sc_pc = return address 70 1.26 skrll REG_S v0, _SC_REGS(a0) # saved in sc_regs[0] 71 1.26 skrll REG_S s0, _SC_REGS_S0(a0) 72 1.26 skrll REG_S s1, _SC_REGS_S1(a0) 73 1.26 skrll REG_S s2, _SC_REGS_S2(a0) 74 1.26 skrll REG_S s3, _SC_REGS_S3(a0) 75 1.26 skrll REG_S s4, _SC_REGS_S4(a0) 76 1.26 skrll REG_S s5, _SC_REGS_S5(a0) 77 1.26 skrll REG_S s6, _SC_REGS_S6(a0) 78 1.26 skrll REG_S s7, _SC_REGS_S7(a0) 79 1.26 skrll REG_S sp, _SC_REGS_SP(a0) 80 1.26 skrll REG_S s8, _SC_REGS_S8(a0) 81 1.21 matt #if defined(__mips_n32) || defined(__mips_n64) 82 1.26 skrll REG_S gp, _SC_REGS_GP(a0) # newabi gp is callee-saved 83 1.21 matt #endif 84 1.21 matt /* 85 1.21 matt * In N32, FP registers F20, F22, F24, F26, F28, F30 are callee-saved. 86 1.21 matt * In N64, FP registers F23 .. F31 are callee-saved. 87 1.21 matt * In O32, FP registers F20 .. F23 are callee-saved. 88 1.21 matt */ 89 1.21 matt #ifndef SOFTFLOAT_FOR_GCC 90 1.22 matt cfc1 v0, $31 # too bad cant check if FP used 91 1.21 matt #if defined(__mips_n64) || defined(__mips_n32) 92 1.26 skrll FP_S $f30, _SC_FPREGS_F30(a0) 93 1.26 skrll FP_S $f28, _SC_FPREGS_F28(a0) 94 1.26 skrll FP_S $f26, _SC_FPREGS_F26(a0) 95 1.26 skrll FP_S $f24, _SC_FPREGS_F24(a0) 96 1.21 matt #endif 97 1.21 matt #if defined(__mips_n32) || defined(__mips_o32) || defined(__mips_o64) 98 1.26 skrll FP_S $f22, _SC_FPREGS_F22(a0) 99 1.26 skrll FP_S $f20, _SC_FPREGS_F20(a0) 100 1.21 matt #endif 101 1.21 matt #if defined(__mips_o32) || defined(__mips_o64) 102 1.26 skrll FP_S $f21, _SC_FPREGS_F21(a0) 103 1.26 skrll FP_S $f23, _SC_FPREGS_F23(a0) 104 1.21 matt #endif 105 1.21 matt #if defined(__mips_n64) 106 1.26 skrll FP_S $f25, _SC_FPREGS_F25(a0) 107 1.26 skrll FP_S $f27, _SC_FPREGS_F27(a0) 108 1.26 skrll FP_S $f29, _SC_FPREGS_F29(a0) 109 1.26 skrll FP_S $f31, _SC_FPREGS_F31(a0) 110 1.21 matt #endif 111 1.26 skrll INT_S v0, _SC_FPREGS_FCSR(a0) 112 1.21 matt #endif /* SOFTFLOAT_FOR_GCC */ 113 1.10 castor REG_EPILOGUE 114 1.21 matt 115 1.1 glass j ra 116 1.24 matt move v0, zero 117 1.3 mycroft END(_setjmp) 118 1.1 glass 119 1.3 mycroft LEAF(_longjmp) 120 1.21 matt PIC_PROLOGUE(_longjmp) 121 1.21 matt PTR_SUBU sp, sp, CALLFRAME_SIZ 122 1.21 matt SAVE_GP(CALLFRAME_GP) 123 1.21 matt 124 1.10 castor REG_PROLOGUE 125 1.26 skrll REG_L v0, _SC_REGS(a0) # get magic number 126 1.26 skrll REG_L ra, _SC_PC(a0) 127 1.21 matt REG_LI t0, 0xACEDBADE 128 1.21 matt bne v0, t0, botch # jump if error 129 1.21 matt PTR_ADDU sp, sp, CALLFRAME_SIZ # does not matter, sanity 130 1.27 riastrad beqz a1, 2f # make sure val is nonzero 131 1.27 riastrad 1: REG_S a1, _SC_REGS_V0(a0) # save return value 132 1.26 skrll REG_L s0, _SC_REGS_S0(a0) 133 1.26 skrll REG_L s1, _SC_REGS_S1(a0) 134 1.26 skrll REG_L s2, _SC_REGS_S2(a0) 135 1.26 skrll REG_L s3, _SC_REGS_S3(a0) 136 1.26 skrll REG_L s4, _SC_REGS_S4(a0) 137 1.26 skrll REG_L s5, _SC_REGS_S5(a0) 138 1.26 skrll REG_L s6, _SC_REGS_S6(a0) 139 1.26 skrll REG_L s7, _SC_REGS_S7(a0) 140 1.21 matt #if defined(__mips_n32) || defined(__mips_n64) 141 1.26 skrll REG_L gp, _SC_REGS_GP(a0) 142 1.21 matt #endif 143 1.23 tsutsui #ifndef SOFTFLOAT_FOR_GCC 144 1.21 matt # get fpu status 145 1.26 skrll INT_L v0, _SC_FPREGS_FCSR(a0) 146 1.23 tsutsui #endif 147 1.26 skrll REG_L sp, _SC_REGS_SP(a0) 148 1.26 skrll REG_L s8, _SC_REGS_S8(a0) 149 1.22 matt #ifndef SOFTFLOAT_FOR_GCC 150 1.21 matt ctc1 v0, $31 151 1.21 matt /* 152 1.21 matt * In N32, FP registers F20, F22, F24, F26, F28, F30 are callee-saved. 153 1.21 matt * In N64, FP registers F23 .. F31 are callee-saved. 154 1.21 matt * In O32, FP registers F20 .. F23 are callee-saved. 155 1.21 matt */ 156 1.21 matt #if defined(__mips_n64) || defined(__mips_n32) 157 1.26 skrll FP_L $f30, _SC_FPREGS_F30(a0) 158 1.26 skrll FP_L $f28, _SC_FPREGS_F28(a0) 159 1.26 skrll FP_L $f26, _SC_FPREGS_F26(a0) 160 1.26 skrll FP_L $f24, _SC_FPREGS_F24(a0) 161 1.21 matt #endif 162 1.21 matt #if defined(__mips_n32) || defined(__mips_o32) || defined(__mips_o64) 163 1.26 skrll FP_L $f22, _SC_FPREGS_F22(a0) 164 1.26 skrll FP_L $f20, _SC_FPREGS_F20(a0) 165 1.21 matt #endif 166 1.21 matt #if defined(__mips_o32) || defined(__mips_o64) 167 1.26 skrll FP_L $f21, _SC_FPREGS_F21(a0) 168 1.26 skrll FP_L $f23, _SC_FPREGS_F23(a0) 169 1.21 matt #endif 170 1.21 matt #if defined(__mips_n64) 171 1.26 skrll FP_L $f25, _SC_FPREGS_F25(a0) 172 1.26 skrll FP_L $f27, _SC_FPREGS_F27(a0) 173 1.26 skrll FP_L $f29, _SC_FPREGS_F29(a0) 174 1.26 skrll FP_L $f31, _SC_FPREGS_F31(a0) 175 1.21 matt #endif 176 1.21 matt #endif /* SOFTFLOAT_FOR_GCC */ 177 1.6 jonathan 178 1.21 matt REG_EPILOGUE 179 1.1 glass j ra 180 1.24 matt move v0, a1 # get return value in 1st arg 181 1.21 matt 182 1.27 riastrad 2: b 1b # replace value 0 by value 1 183 1.27 riastrad li a1, 1 184 1.27 riastrad 185 1.1 glass botch: 186 1.21 matt /* 187 1.21 matt * We know we aren't returning so we don't care about restoring 188 1.21 matt * our caller's GP. 189 1.21 matt */ 190 1.3 mycroft jal _C_LABEL(longjmperror) 191 1.23 tsutsui nop 192 1.25 skrll 193 1.21 matt PIC_TAILCALL(abort) 194 1.23 tsutsui nop 195 1.3 mycroft END(_longjmp) 196