103f359185804defcb7fab6cff7a7d23ada930ad
[platform/kernel/u-boot.git] / arch / riscv / lib / setjmp.S
1 /*
2  * (C) 2018 Alexander Graf <agraf@suse.de>
3  *
4  * SPDX-License-Identifier:     GPL-2.0+
5  */
6
7 #include <config.h>
8 #include <linux/linkage.h>
9
10 #ifdef CONFIG_CPU_RISCV_64
11 #define STORE_IDX(reg, idx)     sd reg, (idx*8)(a0)
12 #define LOAD_IDX(reg, idx)      ld reg, (idx*8)(a0)
13 #else
14 #define STORE_IDX(reg, idx)     sw reg, (idx*4)(a0)
15 #define LOAD_IDX(reg, idx)      lw reg, (idx*4)(a0)
16 #endif
17
18 .pushsection .text.setjmp, "ax"
19 ENTRY(setjmp)
20         /* Preserve all callee-saved registers and the SP */
21         STORE_IDX(s0, 0)
22         STORE_IDX(s1, 1)
23         STORE_IDX(s2, 2)
24         STORE_IDX(s3, 3)
25         STORE_IDX(s4, 4)
26         STORE_IDX(s5, 5)
27         STORE_IDX(s6, 6)
28         STORE_IDX(s7, 7)
29         STORE_IDX(s8, 8)
30         STORE_IDX(s9, 9)
31         STORE_IDX(s10, 10)
32         STORE_IDX(s11, 11)
33         STORE_IDX(ra, 12)
34         STORE_IDX(sp, 13)
35         li  a0, 0
36         ret
37 ENDPROC(setjmp)
38 .popsection
39
40 .pushsection .text.longjmp, "ax"
41 ENTRY(longjmp)
42         LOAD_IDX(s0, 0)
43         LOAD_IDX(s1, 1)
44         LOAD_IDX(s2, 2)
45         LOAD_IDX(s3, 3)
46         LOAD_IDX(s4, 4)
47         LOAD_IDX(s5, 5)
48         LOAD_IDX(s6, 6)
49         LOAD_IDX(s7, 7)
50         LOAD_IDX(s8, 8)
51         LOAD_IDX(s9, 9)
52         LOAD_IDX(s10, 10)
53         LOAD_IDX(s11, 11)
54         LOAD_IDX(ra, 12)
55         LOAD_IDX(sp, 13)
56
57         /* Move the return value in place, but return 1 if passed 0. */
58         beq a1, zero, longjmp_1
59         mv a0, a1
60         ret
61
62         longjmp_1:
63         li a0, 1
64         ret
65 ENDPROC(longjmp)
66 .popsection