1/*- 2 * Copyright (c) 2015 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__FBSDID("$FreeBSD$"); 37 38#include <machine/setjmp.h> 39 40ENTRY(setjmp) 41 addi sp, sp, -(2 * 8) 42 sd a0, 0(sp) 43 sd ra, 8(sp) 44 45 /* Store the signal mask */ 46 addi a2, a0, (_JB_SIGMASK * 8) /* oset */ 47 li a1, 0 /* set */ 48 li a0, 1 /* SIG_BLOCK */ 49 jal sigprocmask 50 51 ld a0, 0(sp) 52 ld ra, 8(sp) 53 addi sp, sp, (2 * 8) 54 55 /* Store the magic value and stack pointer */ 56 la t0, .Lmagic 57 ld t0, 0(t0) 58 sd t0, (0 * 8)(a0) 59 sd sp, (1 * 8)(a0) 60 addi a0, a0, (2 * 8) 61 62 /* Store the general purpose registers and ra */ 63 sd s0, (0 * 8)(a0) 64 sd s1, (1 * 8)(a0) 65 sd s2, (2 * 8)(a0) 66 sd s3, (3 * 8)(a0) 67 sd s4, (4 * 8)(a0) 68 sd s5, (5 * 8)(a0) 69 sd s6, (6 * 8)(a0) 70 sd s7, (7 * 8)(a0) 71 sd s8, (8 * 8)(a0) 72 sd s9, (9 * 8)(a0) 73 sd s10, (10 * 8)(a0) 74 sd s11, (11 * 8)(a0) 75 sd ra, (12 * 8)(a0) 76 addi a0, a0, (13 * 8) 77 78#if 0 79 /* RISCVTODO */ 80 /* Store the vfp registers */ 81 fsq fs0, (0 * 16)(a0) 82 fsq fs1, (1 * 16)(a0) 83 fsq fs2, (2 * 16)(a0) 84 fsq fs3, (3 * 16)(a0) 85 fsq fs4, (4 * 16)(a0) 86 fsq fs5, (5 * 16)(a0) 87 fsq fs6, (6 * 16)(a0) 88 fsq fs7, (7 * 16)(a0) 89 fsq fs8, (8 * 16)(a0) 90 fsq fs9, (9 * 16)(a0) 91 fsq fs10, (10 * 16)(a0) 92 fsq fs11, (11 * 16)(a0) 93 addi a0, a0, (12 * 16) 94#endif 95 96 /* Return value */ 97 li a0, 0 98 ret 99 .align 3 100.Lmagic: 101 .quad _JB_MAGIC_SETJMP 102END(setjmp) 103 104ENTRY(longjmp) 105 addi sp, sp, -(4 * 8) 106 sd a0, (0 * 8)(sp) 107 sd ra, (1 * 8)(sp) 108 sd a1, (2 * 8)(sp) 109 110 /* Restore the signal mask */ 111 li a2, 0 /* oset */ 112 addi a1, a0, (_JB_SIGMASK * 8) /* set */ 113 li a0, 3 /* SIG_BLOCK */ 114 jal sigprocmask 115 116 ld a1, (2 * 8)(sp) 117 ld ra, (1 * 8)(sp) 118 ld a0, (0 * 8)(sp) 119 addi sp, sp, (4 * 8) 120 121 /* Check the magic value */ 122 ld t0, 0(a0) 123 la t1, .Lmagic 124 ld t1, 0(t1) 125 bne t0, t1, botch 126 127 /* Restore the stack pointer */ 128 ld t0, 8(a0) 129 mv sp, t0 130 addi a0, a0, (2 * 8) 131 132 /* Restore the general purpose registers and ra */ 133 ld s0, (0 * 8)(a0) 134 ld s1, (1 * 8)(a0) 135 ld s2, (2 * 8)(a0) 136 ld s3, (3 * 8)(a0) 137 ld s4, (4 * 8)(a0) 138 ld s5, (5 * 8)(a0) 139 ld s6, (6 * 8)(a0) 140 ld s7, (7 * 8)(a0) 141 ld s8, (8 * 8)(a0) 142 ld s9, (9 * 8)(a0) 143 ld s10, (10 * 8)(a0) 144 ld s11, (11 * 8)(a0) 145 ld ra, (12 * 8)(a0) 146 addi a0, a0, (13 * 8) 147 148#if 0 149 /* RISCVTODO */ 150 /* Restore the vfp registers */ 151 flq fs0, (0 * 16)(a0) 152 flq fs1, (1 * 16)(a0) 153 flq fs2, (2 * 16)(a0) 154 flq fs3, (3 * 16)(a0) 155 flq fs4, (4 * 16)(a0) 156 flq fs5, (5 * 16)(a0) 157 flq fs6, (6 * 16)(a0) 158 flq fs7, (7 * 16)(a0) 159 flq fs8, (8 * 16)(a0) 160 flq fs9, (9 * 16)(a0) 161 flq fs10, (10 * 16)(a0) 162 flq fs11, (11 * 16)(a0) 163 addi a0, a0, (12 * 16) 164#endif 165 166 /* Load the return value */ 167 mv a0, a1 168 ret 169 170botch: 171 call _C_LABEL(longjmperror) 172 call _C_LABEL(abort) 173END(longjmp) 174