1 1.7 riastrad /* $NetBSD: compat_setjmp.S,v 1.7 2025/04/24 01:43:20 riastradh 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 <sys/syscall.h> 36 1.1 tsutsui #include <mips/asm.h> 37 1.2 matt 38 1.2 matt #include "assym.h" 39 1.1 tsutsui 40 1.1 tsutsui #if defined(LIBC_SCCS) && !defined(lint) 41 1.2 matt #if 0 42 1.2 matt RCSID("from: @(#)setjmp.s 8.1 (Berkeley) 6/4/93") 43 1.2 matt #else 44 1.7 riastrad RCSID("$NetBSD: compat_setjmp.S,v 1.7 2025/04/24 01:43:20 riastradh Exp $") 45 1.2 matt #endif 46 1.1 tsutsui #endif /* LIBC_SCCS and not lint */ 47 1.1 tsutsui 48 1.1 tsutsui /* 49 1.1 tsutsui * C library -- setjmp, longjmp 50 1.1 tsutsui * 51 1.1 tsutsui * longjmp(a,v) 52 1.1 tsutsui * will generate a "return(v)" from 53 1.1 tsutsui * the last call to 54 1.1 tsutsui * setjmp(a) 55 1.1 tsutsui * by restoring registers from the stack, 56 1.1 tsutsui * and a struct sigcontext, see <signal.h> 57 1.1 tsutsui */ 58 1.1 tsutsui 59 1.2 matt #define SETJMP_FRAME_SIZE (CALLFRAME_SIZ + STACK_T_SIZE) 60 1.1 tsutsui 61 1.1 tsutsui NON_LEAF(setjmp, SETJMP_FRAME_SIZE, ra) 62 1.2 matt .mask 0x80010000, (CALLFRAME_RA - CALLFRAME_SIZ) 63 1.2 matt SETUP_GP 64 1.2 matt PTR_SUBU sp, sp, SETJMP_FRAME_SIZE # allocate stack frame 65 1.2 matt SAVE_GP(CALLFRAME_GP) 66 1.2 matt SETUP_GP64(CALLFRAME_GP, setjmp) 67 1.2 matt 68 1.2 matt REG_S ra, CALLFRAME_RA(sp) # save RA 69 1.2 matt REG_S s0, CALLFRAME_S0(sp) # save S0 70 1.2 matt move s0, a0 # save sigcontext 71 1.2 matt 72 1.2 matt /* Get the signal mask. */ 73 1.2 matt move a0, zero # get current sigmask 74 1.2 matt jal _C_LABEL(sigblock) 75 1.2 matt nop 76 1.5 skrll INT_S v0, _SC_MASK13(s0) # save sc_mask13 77 1.2 matt 78 1.2 matt /* Get the signal stack. */ 79 1.2 matt move a0, zero 80 1.2 matt PTR_ADDU a1, sp, CALLFRAME_SIZ # pointer to stack_t 81 1.2 matt jal _C_LABEL(__sigaltstack14) 82 1.2 matt 83 1.2 matt move a0, s0 # restore jmpbuf 84 1.5 skrll INT_L v1, CALLFRAME_SIZ+_STACK_T_FLAGS(sp) 85 1.2 matt # get old ss_onstack 86 1.2 matt and v1, v1, SS_ONSTACK # extract onstack flag 87 1.5 skrll INT_S v1, _SC_ONSTACK(a0) # save it in sc_onstack 88 1.2 matt 89 1.2 matt REG_L s0, CALLFRAME_S0(sp) # restore S0 90 1.2 matt REG_L ra, CALLFRAME_RA(sp) # restore RA 91 1.5 skrll blt v0, zero, botch # check for sigaltstack() error 92 1.2 matt nop 93 1.2 matt /* 94 1.2 matt * We know we won't need this routine's GP anymore. 95 1.2 matt */ 96 1.2 matt RESTORE_GP64 97 1.2 matt PTR_ADDU sp, sp, SETJMP_FRAME_SIZE # pop stack frame 98 1.2 matt 99 1.1 tsutsui REG_PROLOGUE 100 1.5 skrll REG_S ra, _SC_PC(a0) # sc_pc = return address 101 1.5 skrll REG_LI v0, 0xACEDBADE # sigcontext magic number 102 1.5 skrll REG_S v0, _SC_REGS(a0) # saved in sc_regs[0] 103 1.5 skrll REG_S s0, _SC_REGS_S0(a0) 104 1.5 skrll REG_S s1, _SC_REGS_S1(a0) 105 1.5 skrll REG_S s2, _SC_REGS_S2(a0) 106 1.5 skrll REG_S s3, _SC_REGS_S3(a0) 107 1.5 skrll REG_S s4, _SC_REGS_S4(a0) 108 1.5 skrll REG_S s5, _SC_REGS_S5(a0) 109 1.5 skrll REG_S s6, _SC_REGS_S6(a0) 110 1.5 skrll REG_S s7, _SC_REGS_S7(a0) 111 1.5 skrll REG_S gp, _SC_REGS_GP(a0) 112 1.5 skrll REG_S sp, _SC_REGS_SP(a0) 113 1.5 skrll REG_S s8, _SC_REGS_S8(a0) 114 1.4 skrll #ifdef SOFTFLOAT_FOR_GCC 115 1.5 skrll INT_S zero, _SC_FPUSED(a0) # sc_fpused = 0 116 1.3 martin #else 117 1.5 skrll li v0, 1 # be nice if we could tell 118 1.5 skrll INT_S v0, _SC_FPUSED(a0) # sc_fpused = 1 119 1.1 tsutsui cfc1 v0, $31 120 1.5 skrll INT_S v0, _SC_FPREGS_FCSR(a0) 121 1.2 matt #if defined(__mips_o32) || defined(__mips_o64) || defined(__mips_n32) 122 1.5 skrll FP_S $f20, _SC_FPREGS_F20(a0) 123 1.5 skrll FP_S $f22, _SC_FPREGS_F22(a0) 124 1.2 matt #endif 125 1.2 matt #if defined(__mips_o32) || defined(__mips_o64) 126 1.5 skrll FP_S $f21, _SC_FPREGS_F21(a0) 127 1.5 skrll FP_S $f23, _SC_FPREGS_F23(a0) 128 1.2 matt #endif 129 1.2 matt #if defined(__mips_n32) || defined(__mips_n64) 130 1.5 skrll FP_S $f24, _SC_FPREGS_F24(a0) 131 1.5 skrll FP_S $f26, _SC_FPREGS_F26(a0) 132 1.5 skrll FP_S $f28, _SC_FPREGS_F28(a0) 133 1.5 skrll FP_S $f30, _SC_FPREGS_F30(a0) 134 1.2 matt #endif 135 1.2 matt #if defined(__mips_n64) 136 1.5 skrll FP_S $f25, _SC_FPREGS_F25(a0) 137 1.5 skrll FP_S $f27, _SC_FPREGS_F27(a0) 138 1.5 skrll FP_S $f29, _SC_FPREGS_F29(a0) 139 1.5 skrll FP_S $f31, _SC_FPREGS_F31(a0) 140 1.2 matt #endif 141 1.3 martin #endif /* SOFTFLOAT_FOR_GCC */ 142 1.1 tsutsui REG_EPILOGUE 143 1.6 riastrad move v0, zero 144 1.2 matt j ra 145 1.2 matt 146 1.2 matt botch: 147 1.2 matt jal _C_LABEL(abort) 148 1.1 tsutsui END(setjmp) 149 1.1 tsutsui 150 1.1 tsutsui LEAF(longjmp) 151 1.2 matt SETUP_GP 152 1.2 matt PTR_SUBU sp, sp, CALLFRAME_SIZ 153 1.2 matt SAVE_GP(CALLFRAME_S0) 154 1.2 matt SETUP_GP64(s0, longjmp) 155 1.2 matt 156 1.7 riastrad beqz a1, 2f /* map val 0 -> 1 */ 157 1.7 riastrad 1: 158 1.1 tsutsui REG_PROLOGUE 159 1.1 tsutsui /* save return value in sc_regs[_R_V0] */ 160 1.5 skrll REG_S a1, _SC_REGS_V0(a0) 161 1.1 tsutsui REG_EPILOGUE 162 1.2 matt 163 1.2 matt li v0, SYS_compat_13_sigreturn13 164 1.1 tsutsui syscall 165 1.2 matt 166 1.2 matt jal _C_LABEL(longjmperror) 167 1.2 matt jal _C_LABEL(abort) 168 1.7 riastrad 169 1.7 riastrad 2: li a1, 1 170 1.7 riastrad b 1b 171 1.1 tsutsui END(longjmp) 172