1/* $OpenBSD: sigsetjmp.S,v 1.4 2021/06/20 20:43:50 kettenis Exp $ */ 2/* 3 * Copyright (c) 2020 Dale Rahn <drahn@openbsd.org> 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18#include "SYS.h" 19#include <machine/setjmp.h> 20 21ENTRY(sigsetjmp) 22 RETGUARD_SETUP(setjmp, t6) 23 mv a2, a0 /* save jmpbuf in a2 */ 24 sw a1, (0 * 8)(a2) 25 beqz a1, 1f 26 /* Store the signal mask */ 27 li a0, 1 /* SIG_BLOCK */ 28 li a1, 0 29 SYSTRAP(sigprocmask) 30 sw a0, (_JB_SIGMASK * 8)(a2) /* oset */ 311: 32 mv a0, a2 33 sd sp, (1 * 8)(a0) 34 35 /* Store the general purpose registers and ra */ 36 sd s0, (2 * 8)(a0) 37 sd s1, (3 * 8)(a0) 38 sd s2, (4 * 8)(a0) 39 sd s3, (5 * 8)(a0) 40 sd s4, (6 * 8)(a0) 41 sd s5, (7 * 8)(a0) 42 sd s6, (8 * 8)(a0) 43 sd s7, (9 * 8)(a0) 44 sd s8, (10 * 8)(a0) 45 sd s9, (11 * 8)(a0) 46 sd s10, (12 * 8)(a0) 47 sd s11, (13 * 8)(a0) 48 sd ra, (14 * 8)(a0) 49 50 /* Store the fp registers */ 51 fsd fs0, (15 * 8)(a0) 52 fsd fs1, (16 * 8)(a0) 53 fsd fs2, (17 * 8)(a0) 54 fsd fs3, (18 * 8)(a0) 55 fsd fs4, (19 * 8)(a0) 56 fsd fs5, (20 * 8)(a0) 57 fsd fs6, (21 * 8)(a0) 58 fsd fs7, (22 * 8)(a0) 59 fsd fs8, (23 * 8)(a0) 60 fsd fs9, (24 * 8)(a0) 61 fsd fs10, (25 * 8)(a0) 62 fsd fs11, (26 * 8)(a0) 63 frcsr t0 64 sd t0, (27 * 8)(a0) 65 66 /* Return value */ 67 li a0, 0 68 RETGUARD_CHECK(setjmp, t6) 69 ret 70 71END_STRONG(sigsetjmp) 72 73ENTRY(siglongjmp) 74 RETGUARD_SYMBOL(longjmp) 75 RETGUARD_LOAD_RANDOM(longjmp, t6) 76 mv a2, a0 /* move jmpbuf */ 77 mv a3, a1 /* final return value */ 78 lw a1, (0 * 8)(a2) 79 beqz a1, 1f 80 81 /* Restore the signal mask */ 82 li a0, 3 /* SIG_SETMASK */ 83 lw a1, (_JB_SIGMASK * 8)(a2) /* set */ 84 SYSTRAP(sigprocmask) 851: 86 87 mv a0, a2 88 mv a1, a3 89 90 /* Restore the stack pointer */ 91 ld t0, (1 * 8)(a0) 92 mv sp, t0 93 94 /* Store the general purpose registers and ra */ 95 ld s0, (2 * 8)(a0) 96 ld s1, (3 * 8)(a0) 97 ld s2, (4 * 8)(a0) 98 ld s3, (5 * 8)(a0) 99 ld s4, (6 * 8)(a0) 100 ld s5, (7 * 8)(a0) 101 ld s6, (8 * 8)(a0) 102 ld s7, (9 * 8)(a0) 103 ld s8, (10 * 8)(a0) 104 ld s9, (11 * 8)(a0) 105 ld s10, (12 * 8)(a0) 106 ld s11, (13 * 8)(a0) 107 ld ra, (14 * 8)(a0) 108 109 /* Store the fp registers */ 110 fld fs0, (15 * 8)(a0) 111 fld fs1, (16 * 8)(a0) 112 fld fs2, (17 * 8)(a0) 113 fld fs3, (18 * 8)(a0) 114 fld fs4, (19 * 8)(a0) 115 fld fs5, (20 * 8)(a0) 116 fld fs6, (21 * 8)(a0) 117 fld fs7, (22 * 8)(a0) 118 fld fs8, (23 * 8)(a0) 119 fld fs9, (24 * 8)(a0) 120 fld fs10, (25 * 8)(a0) 121 fld fs11, (26 * 8)(a0) 122 ld t0, (27 * 8)(a0) 123 fscsr t0 124 125 /* Load the return value */ 126 li a0, 1 127 beqz a1, 1f 128 mv a0, a1 1291: 130 RETGUARD_CHECK(longjmp, t6) 131 ret 132 133END_STRONG(siglongjmp) 134