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