1 1.5 skrll /* $NetBSD: __setjmp14.S,v 1.5 2023/10/11 09:12:21 skrll Exp $ */ 2 1.1 matt 3 1.1 matt #include "SYS.h" 4 1.1 matt #include "assym.h" 5 1.1 matt 6 1.1 matt #if defined(LIBC_SCCS) 7 1.5 skrll __RCSID("$NetBSD: __setjmp14.S,v 1.5 2023/10/11 09:12:21 skrll Exp $") 8 1.1 matt #endif 9 1.1 matt 10 1.1 matt /* 11 1.1 matt * C library -- _setjmp, _longjmp 12 1.1 matt * 13 1.1 matt * longjmp(a,v) 14 1.1 matt * will generate a "return(v?v:1)" from the last call to 15 1.1 matt * setjmp(a) 16 1.1 matt * by restoring registers from the stack. 17 1.1 matt * The previous signal state is restored. 18 1.1 matt */ 19 1.1 matt 20 1.1 matt ENTRY(__setjmp14) 21 1.1 matt li a1, 1 22 1.1 matt REG_S a1, JB_MAGIC(a0) /* indicate sigmask */ 23 1.1 matt REG_S ra, JB_RA(a0) /* save return address */ 24 1.2 matt REG_S sp, JB_SP(a0) /* save stack pointer */ 25 1.2 matt REG_S gp, JB_GP(a0) /* save global pointer */ 26 1.2 matt REG_S tp, JB_TP(a0) /* save thread pointer */ 27 1.1 matt REG_S s0, JB_S0(a0) /* save callee saved register */ 28 1.1 matt REG_S s1, JB_S1(a0) /* save callee saved register */ 29 1.1 matt REG_S s2, JB_S2(a0) /* save callee saved register */ 30 1.1 matt REG_S s3, JB_S3(a0) /* save callee saved register */ 31 1.1 matt REG_S s4, JB_S4(a0) /* save callee saved register */ 32 1.1 matt REG_S s5, JB_S5(a0) /* save callee saved register */ 33 1.1 matt REG_S s6, JB_S6(a0) /* save callee saved register */ 34 1.1 matt REG_S s7, JB_S7(a0) /* save callee saved register */ 35 1.1 matt REG_S s8, JB_S8(a0) /* save callee saved register */ 36 1.1 matt REG_S s9, JB_S9(a0) /* save callee saved register */ 37 1.1 matt REG_S s10, JB_S10(a0) /* save callee saved register */ 38 1.1 matt REG_S s11, JB_S11(a0) /* save callee saved register */ 39 1.1 matt #ifndef _SOFT_FLOAT 40 1.1 matt frcsr t2 /* get FSCR */ 41 1.1 matt REG_S t2, JB_FCSR(a0) /* save it */ 42 1.2 matt fsd fs0, JB_FS0(a0) /* save callee saved register */ 43 1.2 matt fsd fs1, JB_FS1(a0) /* save callee saved register */ 44 1.2 matt fsd fs2, JB_FS2(a0) /* save callee saved register */ 45 1.2 matt fsd fs3, JB_FS3(a0) /* save callee saved register */ 46 1.2 matt fsd fs4, JB_FS4(a0) /* save callee saved register */ 47 1.2 matt fsd fs5, JB_FS5(a0) /* save callee saved register */ 48 1.2 matt fsd fs6, JB_FS6(a0) /* save callee saved register */ 49 1.2 matt fsd fs7, JB_FS7(a0) /* save callee saved register */ 50 1.2 matt fsd fs8, JB_FS8(a0) /* save callee saved register */ 51 1.2 matt fsd fs9, JB_FS9(a0) /* save callee saved register */ 52 1.2 matt fsd fs10, JB_FS10(a0) /* save callee saved register */ 53 1.2 matt fsd fs11, JB_FS11(a0) /* save callee saved register */ 54 1.1 matt #endif 55 1.1 matt 56 1.1 matt addi a2, a0, JB_SIGMASK /* &sigmask */ 57 1.5 skrll li a1, 0 /* set = NULL */ 58 1.5 skrll li a0, 0 /* how is ignored */ 59 1.4 skrll SYSTRAP_NOERROR(__sigprocmask14) /* assume no error */ 60 1.2 matt li a0, 0 /* success */ /* indicate success */ 61 1.4 skrll ret /* return */ 62 1.1 matt END(__setjmp14) 63 1.1 matt 64 1.1 matt ENTRY(__longjmp14) 65 1.1 matt REG_L ra, JB_RA(a0) /* restore return address */ 66 1.2 matt REG_L sp, JB_SP(a0) /* restore stack pointer */ 67 1.2 matt REG_L gp, JB_GP(a0) /* restore global pointer */ 68 1.2 matt #REG_L tp, JB_TP(a0) /* restore thread pointer */ 69 1.1 matt REG_L s0, JB_S0(a0) /* restore callee saved register */ 70 1.1 matt REG_L s1, JB_S1(a0) /* restore callee saved register */ 71 1.1 matt REG_L s2, JB_S2(a0) /* restore callee saved register */ 72 1.1 matt REG_L s3, JB_S3(a0) /* restore callee saved register */ 73 1.1 matt REG_L s4, JB_S4(a0) /* restore callee saved register */ 74 1.1 matt REG_L s5, JB_S5(a0) /* restore callee saved register */ 75 1.1 matt REG_L s6, JB_S6(a0) /* restore callee saved register */ 76 1.1 matt REG_L s7, JB_S7(a0) /* restore callee saved register */ 77 1.1 matt REG_L s8, JB_S8(a0) /* restore callee saved register */ 78 1.1 matt REG_L s9, JB_S9(a0) /* restore callee saved register */ 79 1.1 matt REG_L s10, JB_S10(a0) /* restore callee saved register */ 80 1.1 matt REG_L s11, JB_S11(a0) /* restore callee saved register */ 81 1.1 matt #ifndef _SOFT_FLOAT 82 1.1 matt REG_L t2, JB_FCSR(a0) /* get it */ 83 1.1 matt fscsr t2 /* restore FSCR */ 84 1.2 matt fld fs0, JB_FS0(a0) /* restore callee saved register */ 85 1.2 matt fld fs1, JB_FS1(a0) /* restore callee saved register */ 86 1.2 matt fld fs2, JB_FS2(a0) /* restore callee saved register */ 87 1.2 matt fld fs3, JB_FS3(a0) /* restore callee saved register */ 88 1.2 matt fld fs4, JB_FS4(a0) /* restore callee saved register */ 89 1.2 matt fld fs5, JB_FS5(a0) /* restore callee saved register */ 90 1.2 matt fld fs6, JB_FS6(a0) /* restore callee saved register */ 91 1.2 matt fld fs7, JB_FS7(a0) /* restore callee saved register */ 92 1.2 matt fld fs8, JB_FS8(a0) /* restore callee saved register */ 93 1.2 matt fld fs9, JB_FS9(a0) /* restore callee saved register */ 94 1.2 matt fld fs10, JB_FS10(a0) /* restore callee saved register */ 95 1.2 matt fld fs11, JB_FS11(a0) /* restore callee saved register */ 96 1.1 matt #endif 97 1.3 skrll mv t1, a1 /* save return value */ 98 1.1 matt li a2, 0 99 1.1 matt addi a1, a0, JB_SIGMASK /* &sigmask */ 100 1.1 matt li a0, SIG_SETMASK 101 1.4 skrll SYSTRAP_NOERROR(__sigprocmask14) /* assume no error */ 102 1.2 matt li a0, 1 /* success */ /* default return value */ 103 1.1 matt beqz t1, 1f /* test return value */ 104 1.3 skrll mv a0, t1 /* use it if not 0 */ 105 1.1 matt 1: ret 106 1.1 matt END(__longjmp14) 107