1/*- 2 * Copyright (c) 2015-2016 Ruslan Bukin <br@bsdpad.com> 3 * All rights reserved. 4 * 5 * Portions of this software were developed by SRI International and the 6 * University of Cambridge Computer Laboratory under DARPA/AFRL contract 7 * FA8750-10-C-0237 ("CTSRD"), as part of the DARPA CRASH research programme. 8 * 9 * Portions of this software were developed by the University of Cambridge 10 * Computer Laboratory as part of the CTSRD Project, with support from the 11 * UK Higher Education Innovation Fund (HEIF). 12 * 13 * Redistribution and use in source and binary forms, with or without 14 * modification, are permitted provided that the following conditions 15 * are met: 16 * 1. Redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer. 18 * 2. Redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 */ 34 35#include <machine/asm.h> 36#include <machine/setjmp.h> 37 38ENTRY(setjmp) 39 addi sp, sp, -(2 * 8) 40 sd a0, 0(sp) 41 sd ra, 8(sp) 42 43 /* Store the signal mask */ 44 addi a2, a0, (_JB_SIGMASK * 8) /* oset */ 45 li a1, 0 /* set */ 46 li a0, 1 /* SIG_BLOCK */ 47 call _C_LABEL(sigprocmask) 48 49 ld a0, 0(sp) 50 ld ra, 8(sp) 51 addi sp, sp, (2 * 8) 52 53 /* Store the magic value and stack pointer */ 54 ld t0, .Lmagic 55 sd t0, (0 * 8)(a0) 56 sd sp, (1 * 8)(a0) 57 addi a0, a0, (2 * 8) 58 59 /* Store the general purpose registers and ra */ 60 sd s0, (0 * 8)(a0) 61 sd s1, (1 * 8)(a0) 62 sd s2, (2 * 8)(a0) 63 sd s3, (3 * 8)(a0) 64 sd s4, (4 * 8)(a0) 65 sd s5, (5 * 8)(a0) 66 sd s6, (6 * 8)(a0) 67 sd s7, (7 * 8)(a0) 68 sd s8, (8 * 8)(a0) 69 sd s9, (9 * 8)(a0) 70 sd s10, (10 * 8)(a0) 71 sd s11, (11 * 8)(a0) 72 sd ra, (12 * 8)(a0) 73 addi a0, a0, (13 * 8) 74 75#ifdef __riscv_float_abi_double 76 /* Store the fpe registers */ 77 fsd fs0, (0 * 8)(a0) 78 fsd fs1, (1 * 8)(a0) 79 fsd fs2, (2 * 8)(a0) 80 fsd fs3, (3 * 8)(a0) 81 fsd fs4, (4 * 8)(a0) 82 fsd fs5, (5 * 8)(a0) 83 fsd fs6, (6 * 8)(a0) 84 fsd fs7, (7 * 8)(a0) 85 fsd fs8, (8 * 8)(a0) 86 fsd fs9, (9 * 8)(a0) 87 fsd fs10, (10 * 8)(a0) 88 fsd fs11, (11 * 8)(a0) 89 addi a0, a0, (12 * 8) 90#endif 91 92 /* Return value */ 93 li a0, 0 94 ret 95 .align 3 96.Lmagic: 97 .quad _JB_MAGIC_SETJMP 98END(setjmp) 99 100ENTRY(longjmp) 101 /* Check the magic value */ 102 ld t0, 0(a0) 103 ld t1, .Lmagic 104 bne t0, t1, botch 105 106 addi sp, sp, -(4 * 8) 107 sd a0, (0 * 8)(sp) 108 sd ra, (1 * 8)(sp) 109 sd a1, (2 * 8)(sp) 110 111 /* Restore the signal mask */ 112 li a2, 0 /* oset */ 113 addi a1, a0, (_JB_SIGMASK * 8) /* set */ 114 li a0, 3 /* SIG_BLOCK */ 115 call _C_LABEL(sigprocmask) 116 117 ld a1, (2 * 8)(sp) 118 ld ra, (1 * 8)(sp) 119 ld a0, (0 * 8)(sp) 120 addi sp, sp, (4 * 8) 121 122 /* Restore the stack pointer */ 123 ld t0, 8(a0) 124 mv sp, t0 125 addi a0, a0, (2 * 8) 126 127 /* Restore the general purpose registers and ra */ 128 ld s0, (0 * 8)(a0) 129 ld s1, (1 * 8)(a0) 130 ld s2, (2 * 8)(a0) 131 ld s3, (3 * 8)(a0) 132 ld s4, (4 * 8)(a0) 133 ld s5, (5 * 8)(a0) 134 ld s6, (6 * 8)(a0) 135 ld s7, (7 * 8)(a0) 136 ld s8, (8 * 8)(a0) 137 ld s9, (9 * 8)(a0) 138 ld s10, (10 * 8)(a0) 139 ld s11, (11 * 8)(a0) 140 ld ra, (12 * 8)(a0) 141 addi a0, a0, (13 * 8) 142 143#ifdef __riscv_float_abi_double 144 /* Restore the fpe registers */ 145 fld fs0, (0 * 8)(a0) 146 fld fs1, (1 * 8)(a0) 147 fld fs2, (2 * 8)(a0) 148 fld fs3, (3 * 8)(a0) 149 fld fs4, (4 * 8)(a0) 150 fld fs5, (5 * 8)(a0) 151 fld fs6, (6 * 8)(a0) 152 fld fs7, (7 * 8)(a0) 153 fld fs8, (8 * 8)(a0) 154 fld fs9, (9 * 8)(a0) 155 fld fs10, (10 * 8)(a0) 156 fld fs11, (11 * 8)(a0) 157 addi a0, a0, (12 * 8) 158#endif 159 160 /* Load the return value */ 161 mv a0, a1 162 bnez a1, 1f 163 li a0, 1 1641: 165 ret 166 167botch: 168 call _C_LABEL(longjmperror) 169 call _C_LABEL(abort) 170END(longjmp) 171