1/* $OpenBSD: setjmp.S,v 1.3 2021/05/17 15:06:09 deraadt 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(setjmp) 22 RETGUARD_SETUP(setjmp, t6) 23 mv a2, a0 /* save jmpbuf in a2 */ 24 /* Store the signal mask */ 25 26 li a1, 0 27 li a0, 1 28 SYSTRAP(sigprocmask) 29 sw a0, (_JB_SIGMASK * 8)(a2) /* oset */ 30 31 mv a0, a2 32 sd sp, (1 * 8)(a0) 33 34 /* Store the general purpose registers and ra */ 35 sd s0, (2 * 8)(a0) 36 sd s1, (3 * 8)(a0) 37 sd s2, (4 * 8)(a0) 38 sd s3, (5 * 8)(a0) 39 sd s4, (6 * 8)(a0) 40 sd s5, (7 * 8)(a0) 41 sd s6, (8 * 8)(a0) 42 sd s7, (9 * 8)(a0) 43 sd s8, (10 * 8)(a0) 44 sd s9, (11 * 8)(a0) 45 sd s10, (12 * 8)(a0) 46 sd s11, (13 * 8)(a0) 47 sd ra, (14 * 8)(a0) 48 49 /* Store the fp registers */ 50 fsd fs0, (15 * 8)(a0) 51 fsd fs1, (16 * 8)(a0) 52 fsd fs2, (17 * 8)(a0) 53 fsd fs3, (18 * 8)(a0) 54 fsd fs4, (19 * 8)(a0) 55 fsd fs5, (20 * 8)(a0) 56 fsd fs6, (21 * 8)(a0) 57 fsd fs7, (22 * 8)(a0) 58 fsd fs8, (23 * 8)(a0) 59 fsd fs9, (24 * 8)(a0) 60 fsd fs10, (25 * 8)(a0) 61 fsd fs11, (26 * 8)(a0) 62 frcsr t0 63 sd t0, (27 * 8)(a0) 64 65 /* Return value */ 66 li a0, 0 67 RETGUARD_CHECK(setjmp, t6) 68 ret 69 70END_STRONG(setjmp) 71 72ENTRY(longjmp) 73 RETGUARD_SYMBOL(longjmp) 74 RETGUARD_LOAD_RANDOM(longjmp, t6) 75 mv a2, a0 /* move jmpbuf */ 76 mv a3, a1 /* final return value */ 77 78 /* Restore the signal mask */ 79 lw a1, (_JB_SIGMASK * 8)(a2) /* set */ 80 li a0, 3 /* SIG_SETMASK */ 81 SYSTRAP(sigprocmask) 82 83 mv a0, a2 84 mv a1, a3 85 86 /* Restore the stack pointer */ 87 ld t0, (1 * 8)(a0) 88 mv sp, t0 89 90 /* Store the general purpose registers and ra */ 91 ld s0, (2 * 8)(a0) 92 ld s1, (3 * 8)(a0) 93 ld s2, (4 * 8)(a0) 94 ld s3, (5 * 8)(a0) 95 ld s4, (6 * 8)(a0) 96 ld s5, (7 * 8)(a0) 97 ld s6, (8 * 8)(a0) 98 ld s7, (9 * 8)(a0) 99 ld s8, (10 * 8)(a0) 100 ld s9, (11 * 8)(a0) 101 ld s10, (12 * 8)(a0) 102 ld s11, (13 * 8)(a0) 103 ld ra, (14 * 8)(a0) 104 105 /* Store the fp registers */ 106 fld fs0, (15 * 8)(a0) 107 fld fs1, (16 * 8)(a0) 108 fld fs2, (17 * 8)(a0) 109 fld fs3, (18 * 8)(a0) 110 fld fs4, (19 * 8)(a0) 111 fld fs5, (20 * 8)(a0) 112 fld fs6, (21 * 8)(a0) 113 fld fs7, (22 * 8)(a0) 114 fld fs8, (23 * 8)(a0) 115 fld fs9, (24 * 8)(a0) 116 fld fs10, (25 * 8)(a0) 117 fld fs11, (26 * 8)(a0) 118 ld t0, (27 * 8)(a0) 119 fscsr t0 120 121 /* Load the return value */ 122 li a0, 1 123 beqz a1, 1f 124 mv a0, a1 1251: 126 RETGUARD_CHECK(longjmp, t6) 127 ret 128 129END_STRONG(longjmp) 130