1405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham/* $OpenBSD: setjmp.S,v 1.5 2005/08/07 16:40:15 espie Exp $ */ 2405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham 3405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham/* 4405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * Copyright (c) 2001-2002 Opsycon AB (www.opsycon.se / www.opsycon.com) 5405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * 6405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * Redistribution and use in source and binary forms, with or without 7405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * modification, are permitted provided that the following conditions 8405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * are met: 9405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * 1. Redistributions of source code must retain the above copyright 10405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * notice, this list of conditions and the following disclaimer. 11405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * 2. Redistributions in binary form must reproduce the above copyright 12405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * notice, this list of conditions and the following disclaimer in the 13405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * documentation and/or other materials provided with the distribution. 14405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * 3. Neither the name of Opsycon AB nor the names of its contributors 15405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * may be used to endorse or promote products derived from this software 16405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * without specific prior written permission. 17405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * 18405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 19405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 22405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * SUCH DAMAGE. 29405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * 30405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham */ 31405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham 32851e68a2402fa414544e66650e09dfdaac813e51Elliott Hughes#include <private/bionic_asm.h> 33405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#include <machine/regnum.h> 34c1b44ecc5385e68e81667068e03b32c2084a85b1David 'Digit' Turner#include <machine/signal.h> 35405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham 36405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham/* 37405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * setjmp, longjmp implementation for libc. this code depends 38405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * on the layout of the struct sigcontext in machine/signal.h. 39405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * 40405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham */ 41405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham 42405b8029a6888f386adf3512113a33546141d1c8Raghu GandhamFRAMESZ= MKFSIZ(2,6) 43405b8029a6888f386adf3512113a33546141d1c8Raghu GandhamA1OFF= FRAMESZ-4*REGSZ 44405b8029a6888f386adf3512113a33546141d1c8Raghu GandhamA0OFF= FRAMESZ-3*REGSZ 45405b8029a6888f386adf3512113a33546141d1c8Raghu GandhamGPOFF= FRAMESZ-2*REGSZ 46405b8029a6888f386adf3512113a33546141d1c8Raghu GandhamRAOFF= FRAMESZ-1*REGSZ 47405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham 48405b8029a6888f386adf3512113a33546141d1c8Raghu GandhamNON_LEAF(setjmp, FRAMESZ, ra) 49405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham .mask 0x80000000, RAOFF 50405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham PTR_SUBU sp, FRAMESZ # allocate stack frame 51405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham SETUP_GP64(GPOFF, setjmp) 52405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham SAVE_GP(GPOFF) 53405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham .set reorder 54405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_S ra, RAOFF(sp) # save state 55405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_S a0, A0OFF(sp) 56405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham 57405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham move a0, zero # get current signal mask 58405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham jal sigblock 59405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham 60405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_L v1, A0OFF(sp) # v1 = jmpbuf 61405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_S v0, SC_MASK(v1) # save sc_mask = sigblock(0) 62405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham 63405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_L a0, A0OFF(sp) # restore jmpbuf 64405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_L ra, RAOFF(sp) 65405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_S ra, SC_PC(a0) # sc_pc = return address 66405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#if defined(__mips64) 67405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham dli v0, 0xACEDBADE # sigcontext magic number 68405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#else 69405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham li v0, 0xACEDBADE # sigcontext magic number 70405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#endif 71405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_S v0, SC_REGS+ZERO*REGSZ(a0) 72405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_S s0, SC_REGS+S0*REGSZ(a0) 73405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_S s1, SC_REGS+S1*REGSZ(a0) 74405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_S s2, SC_REGS+S2*REGSZ(a0) 75405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_S s3, SC_REGS+S3*REGSZ(a0) 76405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_S s4, SC_REGS+S4*REGSZ(a0) 77405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_S s5, SC_REGS+S5*REGSZ(a0) 78405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_S s6, SC_REGS+S6*REGSZ(a0) 79405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_S s7, SC_REGS+S7*REGSZ(a0) 80405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_S s8, SC_REGS+S8*REGSZ(a0) 81405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_L v0, GPOFF(sp) 82405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_S v0, SC_REGS+GP*REGSZ(a0) 83405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham PTR_ADDU v0, sp, FRAMESZ 84405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_S v0, SC_REGS+SP*REGSZ(a0) 85405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham 86405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#if !defined(SOFTFLOAT) 87405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham li v0, 1 # be nice if we could tell 88405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_S v0, SC_FPUSED(a0) # sc_fpused = 1 89405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham cfc1 v0, $31 90c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand s.d $f20, SC_FPREGS+((F20-F0)*REGSZ_FP)(a0) 91c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand s.d $f22, SC_FPREGS+((F22-F0)*REGSZ_FP)(a0) 92c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand s.d $f24, SC_FPREGS+((F24-F0)*REGSZ_FP)(a0) 93c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand s.d $f26, SC_FPREGS+((F26-F0)*REGSZ_FP)(a0) 94c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand s.d $f28, SC_FPREGS+((F28-F0)*REGSZ_FP)(a0) 95c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand s.d $f30, SC_FPREGS+((F30-F0)*REGSZ_FP)(a0) 96405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#if _MIPS_FPSET == 32 97c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand s.d $f21, SC_FPREGS+((F21-F0)*REGSZ_FP)(a0) 98c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand s.d $f23, SC_FPREGS+((F23-F0)*REGSZ_FP)(a0) 99c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand s.d $f25, SC_FPREGS+((F25-F0)*REGSZ_FP)(a0) 100c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand s.d $f27, SC_FPREGS+((F27-F0)*REGSZ_FP)(a0) 101c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand s.d $f29, SC_FPREGS+((F29-F0)*REGSZ_FP)(a0) 102c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand s.d $f31, SC_FPREGS+((F31-F0)*REGSZ_FP)(a0) 103405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#endif 104405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_S v0, SC_FPREGS+((FSR-F0)*REGSZ)(a0) 105405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#endif /* !SOFTFLOAT */ 106405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham move v0, zero 107405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham RESTORE_GP64 108405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham PTR_ADDU sp, FRAMESZ 109405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham j ra 110405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham 111405b8029a6888f386adf3512113a33546141d1c8Raghu Gandhambotch: 112405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham jal longjmperror 113405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham jal abort 114405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham RESTORE_GP64 115405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham PTR_ADDU sp, FRAMESZ 116405b8029a6888f386adf3512113a33546141d1c8Raghu GandhamEND(setjmp) 117405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham 118405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham 119405b8029a6888f386adf3512113a33546141d1c8Raghu GandhamLEAF(longjmp, FRAMESZ) 120405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham PTR_SUBU sp, FRAMESZ 121405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham SETUP_GP64(GPOFF, longjmp) 122405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham SAVE_GP(GPOFF) 123405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham .set reorder 124405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham sw a1, A1OFF(sp) 125405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham sw a0, A0OFF(sp) 126405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham 127405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham lw a0, SC_MASK(a0) 128405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham jal sigsetmask 129405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham 130405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham lw a0, A0OFF(sp) 131405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham lw a1, A1OFF(sp) 132405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham 133851e68a2402fa414544e66650e09dfdaac813e51Elliott Hughes .set noreorder 134405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_L v0, SC_REGS+ZERO*REGSZ(a0) 135405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham bne v0, 0xACEDBADE, botch # jump if error 136405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_L ra, SC_PC(a0) 137405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_L s0, SC_REGS+S0*REGSZ(a0) 138405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_L s1, SC_REGS+S1*REGSZ(a0) 139405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_L s2, SC_REGS+S2*REGSZ(a0) 140405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_L s3, SC_REGS+S3*REGSZ(a0) 141405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_L s4, SC_REGS+S4*REGSZ(a0) 142405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_L s5, SC_REGS+S5*REGSZ(a0) 143405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_L s6, SC_REGS+S6*REGSZ(a0) 144405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_L s7, SC_REGS+S7*REGSZ(a0) 145405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_L s8, SC_REGS+S8*REGSZ(a0) 146405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_L gp, SC_REGS+GP*REGSZ(a0) 147405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham REG_L sp, SC_REGS+SP*REGSZ(a0) 148851e68a2402fa414544e66650e09dfdaac813e51Elliott Hughes 149405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#if !defined(SOFTFLOAT) 150851e68a2402fa414544e66650e09dfdaac813e51Elliott Hughes REG_L v0, SC_FPREGS+((FSR-F0)*REGSZ)(a0) 151405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham ctc1 v0, $31 152c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand l.d $f20, SC_FPREGS+((F20-F0)*REGSZ_FP)(a0) 153c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand l.d $f22, SC_FPREGS+((F22-F0)*REGSZ_FP)(a0) 154c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand l.d $f24, SC_FPREGS+((F24-F0)*REGSZ_FP)(a0) 155c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand l.d $f26, SC_FPREGS+((F26-F0)*REGSZ_FP)(a0) 156c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand l.d $f28, SC_FPREGS+((F28-F0)*REGSZ_FP)(a0) 157c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand l.d $f30, SC_FPREGS+((F30-F0)*REGSZ_FP)(a0) 158405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#if _MIPS_FPSET == 32 159c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand l.d $f21, SC_FPREGS+((F21-F0)*REGSZ_FP)(a0) 160c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand l.d $f23, SC_FPREGS+((F23-F0)*REGSZ_FP)(a0) 161c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand l.d $f25, SC_FPREGS+((F25-F0)*REGSZ_FP)(a0) 162c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand l.d $f27, SC_FPREGS+((F27-F0)*REGSZ_FP)(a0) 163c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand l.d $f29, SC_FPREGS+((F29-F0)*REGSZ_FP)(a0) 164c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand l.d $f31, SC_FPREGS+((F31-F0)*REGSZ_FP)(a0) 165405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#endif 166405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#endif /* !SOFTFLOAT */ 167405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham bne a1, zero, 1f 168405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham nop 169405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham li a1, 1 # never return 0! 170405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham1: 171405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham j ra 172405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham move v0, a1 173405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham 174405b8029a6888f386adf3512113a33546141d1c8Raghu GandhamEND(longjmp) 175