blob: 99d6195827e4fc9ae590a8528dcc207b420f5f98 [file] [log] [blame]
Rick Chen9dbb9732018-05-29 14:10:06 +08001/* SPDX-License-Identifier: GPL-2.0+ */
Alexander Graf3bb8f012018-04-23 07:59:43 +02002/*
3 * (C) 2018 Alexander Graf <agraf@suse.de>
Alexander Graf3bb8f012018-04-23 07:59:43 +02004 */
5
6#include <config.h>
7#include <linux/linkage.h>
8
Lukas Auer54ebfe72018-11-22 11:26:12 +01009#ifdef CONFIG_ARCH_RV64I
Alexander Graf3bb8f012018-04-23 07:59:43 +020010#define STORE_IDX(reg, idx) sd reg, (idx*8)(a0)
11#define LOAD_IDX(reg, idx) ld reg, (idx*8)(a0)
12#else
13#define STORE_IDX(reg, idx) sw reg, (idx*4)(a0)
14#define LOAD_IDX(reg, idx) lw reg, (idx*4)(a0)
15#endif
16
17.pushsection .text.setjmp, "ax"
18ENTRY(setjmp)
19 /* Preserve all callee-saved registers and the SP */
20 STORE_IDX(s0, 0)
21 STORE_IDX(s1, 1)
22 STORE_IDX(s2, 2)
23 STORE_IDX(s3, 3)
24 STORE_IDX(s4, 4)
25 STORE_IDX(s5, 5)
26 STORE_IDX(s6, 6)
27 STORE_IDX(s7, 7)
28 STORE_IDX(s8, 8)
29 STORE_IDX(s9, 9)
30 STORE_IDX(s10, 10)
31 STORE_IDX(s11, 11)
32 STORE_IDX(ra, 12)
33 STORE_IDX(sp, 13)
34 li a0, 0
35 ret
36ENDPROC(setjmp)
37.popsection
38
39.pushsection .text.longjmp, "ax"
40ENTRY(longjmp)
41 LOAD_IDX(s0, 0)
42 LOAD_IDX(s1, 1)
43 LOAD_IDX(s2, 2)
44 LOAD_IDX(s3, 3)
45 LOAD_IDX(s4, 4)
46 LOAD_IDX(s5, 5)
47 LOAD_IDX(s6, 6)
48 LOAD_IDX(s7, 7)
49 LOAD_IDX(s8, 8)
50 LOAD_IDX(s9, 9)
51 LOAD_IDX(s10, 10)
52 LOAD_IDX(s11, 11)
53 LOAD_IDX(ra, 12)
54 LOAD_IDX(sp, 13)
55
56 /* Move the return value in place, but return 1 if passed 0. */
Heinrich Schuchardt76eb6482021-03-23 19:11:26 +010057 seqz a0, a1
58 add a0, a0, a1
Alexander Graf3bb8f012018-04-23 07:59:43 +020059 ret
60ENDPROC(longjmp)
61.popsection