xref: /DragonStub/lib/riscv64/setjmp.S (revision f1de0317e130286d7363f30f4f92961ab62fe191)
1// SPDX-License-Identifier: GPL-2.0+ OR BSD-2-Clause
2/*
3 * Copyright Heinrich Schuchardt <xypron.glpk@gmx.de>
4 */
5
6	.text
7	.p2align 3
8
9#define GREG_LIST \
10	REG_ONE(s0, 0); \
11	REG_ONE(s1, 8); \
12	REG_ONE(s2, 16); \
13	REG_ONE(s3, 24); \
14	REG_ONE(s4, 32); \
15	REG_ONE(s5, 40); \
16	REG_ONE(s6, 48); \
17	REG_ONE(s7, 56); \
18	REG_ONE(s8, 64); \
19	REG_ONE(s9, 72); \
20	REG_ONE(s10, 80); \
21	REG_ONE(s11, 88); \
22	REG_ONE(sp, 96); \
23	REG_ONE(ra, 104);
24
25#define FREG_LIST \
26	FREG_ONE(fs0,  112); \
27	FREG_ONE(fs1,  120); \
28	FREG_ONE(fs2,  128); \
29	FREG_ONE(fs3,  136); \
30	FREG_ONE(fs4,  144); \
31	FREG_ONE(fs5,  152); \
32	FREG_ONE(fs6,  160); \
33	FREG_ONE(fs7,  168); \
34	FREG_ONE(fs8,  176); \
35	FREG_ONE(fs9,  184); \
36	FREG_ONE(fs10, 192); \
37	FREG_ONE(fs11, 200);
38
39#define REG_ONE(R, P) sd R, P(a0)
40#define FREG_ONE(R, P) fsd R, P(a0)
41
42	.globl setjmp
43	.type setjmp, @function
44
45setjmp:
46	GREG_LIST
47#ifndef __riscv_float_abi_soft
48	FREG_LIST
49#endif
50	li a0, 0
51	ret
52
53#undef REG_ONE
54#undef FREG_ONE
55
56#define REG_ONE(R, P) ld R, P(a0)
57#define FREG_ONE(R, P) fld R, P(a0)
58
59	.globl longjmp
60	.type longjmp, @function
61
62longjmp:
63	GREG_LIST
64#ifndef __riscv_float_abi_soft
65	FREG_LIST
66#endif
67	seqz a0, a1
68	add a0, a0, a1
69	ret
70
71#if defined(__ELF__) && defined(__linux__)
72	.section .note.GNU-stack,"",%progbits
73#endif
74