]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - lib/libc/riscv/gen/_setjmp.S
Merge llvm trunk r351319, resolve conflicts, and update FREEBSD-Xlist.
[FreeBSD/FreeBSD.git] / lib / libc / riscv / gen / _setjmp.S
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 __FBSDID("$FreeBSD$");
37
38 #include <machine/setjmp.h>
39
40 ENTRY(_setjmp)
41         /* Store the magic value and stack pointer */
42         la      t0, .Lmagic
43         ld      t0, 0(t0)
44         sd      t0, (0 * 8)(a0)
45         sd      sp, (1 * 8)(a0)
46         addi    a0, a0, (2 * 8)
47
48         /* Store the general purpose registers and ra */
49         sd      s0, (0 * 8)(a0)
50         sd      s1, (1 * 8)(a0)
51         sd      s2, (2 * 8)(a0)
52         sd      s3, (3 * 8)(a0)
53         sd      s4, (4 * 8)(a0)
54         sd      s5, (5 * 8)(a0)
55         sd      s6, (6 * 8)(a0)
56         sd      s7, (7 * 8)(a0)
57         sd      s8, (8 * 8)(a0)
58         sd      s9, (9 * 8)(a0)
59         sd      s10, (10 * 8)(a0)
60         sd      s11, (11 * 8)(a0)
61         sd      ra, (12 * 8)(a0)
62         addi    a0, a0, (13 * 8)
63
64 #if !defined(_STANDALONE) && defined(__riscv_float_abi_double)
65         /* Store the fpe registers */
66         fsd     fs0, (0 * 8)(a0)
67         fsd     fs1, (1 * 8)(a0)
68         fsd     fs2, (2 * 8)(a0)
69         fsd     fs3, (3 * 8)(a0)
70         fsd     fs4, (4 * 8)(a0)
71         fsd     fs5, (5 * 8)(a0)
72         fsd     fs6, (6 * 8)(a0)
73         fsd     fs7, (7 * 8)(a0)
74         fsd     fs8, (8 * 8)(a0)
75         fsd     fs9, (9 * 8)(a0)
76         fsd     fs10, (10 * 8)(a0)
77         fsd     fs11, (11 * 8)(a0)
78         addi    a0, a0, (12 * 8)
79 #endif
80
81         /* Return value */
82         li      a0, 0
83         ret
84         .align  3
85 .Lmagic:
86         .quad   _JB_MAGIC__SETJMP
87 END(_setjmp)
88
89 ENTRY(_longjmp)
90         /* Check the magic value */
91         ld      t0, 0(a0)
92         la      t1, .Lmagic
93         ld      t1, 0(t1)
94         bne     t0, t1, botch
95
96         /* Restore the stack pointer */
97         ld      t0, 8(a0)
98         mv      sp, t0
99         addi    a0, a0, (2 * 8)
100
101         /* Restore the general purpose registers and ra */
102         ld      s0, (0 * 8)(a0)
103         ld      s1, (1 * 8)(a0)
104         ld      s2, (2 * 8)(a0)
105         ld      s3, (3 * 8)(a0)
106         ld      s4, (4 * 8)(a0)
107         ld      s5, (5 * 8)(a0)
108         ld      s6, (6 * 8)(a0)
109         ld      s7, (7 * 8)(a0)
110         ld      s8, (8 * 8)(a0)
111         ld      s9, (9 * 8)(a0)
112         ld      s10, (10 * 8)(a0)
113         ld      s11, (11 * 8)(a0)
114         ld      ra, (12 * 8)(a0)
115         addi    a0, a0, (13 * 8)
116
117 #if !defined(_STANDALONE) && defined(__riscv_float_abi_double)
118         /* Restore the fpe registers */
119         fld     fs0, (0 * 8)(a0)
120         fld     fs1, (1 * 8)(a0)
121         fld     fs2, (2 * 8)(a0)
122         fld     fs3, (3 * 8)(a0)
123         fld     fs4, (4 * 8)(a0)
124         fld     fs5, (5 * 8)(a0)
125         fld     fs6, (6 * 8)(a0)
126         fld     fs7, (7 * 8)(a0)
127         fld     fs8, (8 * 8)(a0)
128         fld     fs9, (9 * 8)(a0)
129         fld     fs10, (10 * 8)(a0)
130         fld     fs11, (11 * 8)(a0)
131         addi    a0, a0, (12 * 8)
132 #endif
133
134         /* Load the return value */
135         mv      a0, a1
136         ret
137
138 botch:
139 #ifdef _STANDALONE
140         j       botch
141 #else
142         call    _C_LABEL(longjmperror)
143         call    _C_LABEL(abort)
144 #endif
145 END(_longjmp)