Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/lib/libc/riscv/gen/setjmp.S
39556 views
1
/*-
2
* Copyright (c) 2015-2016 Ruslan Bukin <[email protected]>
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
38
ENTRY(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
98
END(setjmp)
99
100
ENTRY(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
164
1:
165
ret
166
167
botch:
168
call _C_LABEL(longjmperror)
169
call _C_LABEL(abort)
170
END(longjmp)
171
172