xref: /optee_os/lib/libutils/isoc/arch/riscv/setjmp_rv.S (revision 0960b6765c51598643bdb226a3bfaeab1b0e608f)
1/* SPDX-License-Identifier: BSD-2-Clause */
2/*
3 * Copyright (c) 2023 Andes Technology Corporation
4 * Copyright 2022-2023 NXP
5 */
6#include <asm.S>
7
8/* int setjmp (jmp_buf) */
9FUNC setjmp , :
10	STR	s0, REGOFF(0)(a0)
11	STR	s1, REGOFF(1)(a0)
12	STR	s2, REGOFF(2)(a0)
13	STR	s3, REGOFF(3)(a0)
14	STR	s4, REGOFF(4)(a0)
15	STR	s5, REGOFF(5)(a0)
16	STR	s6, REGOFF(6)(a0)
17	STR	s7, REGOFF(7)(a0)
18	STR	s8, REGOFF(8)(a0)
19	STR	s9, REGOFF(9)(a0)
20	STR	s10, REGOFF(10)(a0)
21	STR	s11, REGOFF(11)(a0)
22	STR	ra, REGOFF(12)(a0)
23	STR	sp, REGOFF(13)(a0)
24#ifdef CFG_FTRACE_SUPPORT
25	addi	sp, sp, -16
26#ifdef RV32
27	STR	ra, REGOFF(3)(sp)
28	STR	s0, REGOFF(2)(sp)
29#else
30	STR	ra, REGOFF(1)(sp)
31	STR	s0, REGOFF(0)(sp)
32#endif
33	addi	s0, sp, 16
34	addi	a0, a0, REGOFF(14)
35	call	ftrace_setjmp
36#ifdef RV32
37	LDR	s0, REGOFF(2)(sp)
38	LDR	ra, REGOFF(3)(sp)
39#else
40	LDR	s0, REGOFF(0)(sp)
41	LDR	ra, REGOFF(1)(sp)
42#endif
43	addi	sp, sp, 16
44#endif
45	li 	a0, 0
46	ret
47END_FUNC setjmp
48
49/* void longjmp (jmp_buf, int) __attribute__ ((noreturn)) */
50FUNC longjmp , :
51#ifdef CFG_FTRACE_SUPPORT
52	addi	sp, sp, -REGOFF(4)
53	STR	a0, REGOFF(0)(sp)
54	STR	a1, REGOFF(1)(sp)
55	STR	s0, REGOFF(2)(sp)
56	STR	ra, REGOFF(3)(sp)
57	addi	s0, sp, REGOFF(4)
58	addi	a0, a0, REGOFF(14)
59	call	ftrace_longjmp
60	LDR	a0, REGOFF(0)(sp)
61	LDR	a1, REGOFF(1)(sp)
62	LDR	s0, REGOFF(2)(sp)
63	LDR	ra, REGOFF(3)(sp)
64	addi	sp, sp, REGOFF(4)
65#endif
66#if defined(__KERNEL__) && defined(CFG_CORE_SANITIZE_KADDRESS) && \
67    !defined(CFG_DYN_CONFIG)
68#error longjmp() stack unpoisoning not implemented for RISC-V with ASAN
69#endif
70	LDR	s0, REGOFF(0)(a0)
71	LDR	s1, REGOFF(1)(a0)
72	LDR	s2, REGOFF(2)(a0)
73	LDR	s3, REGOFF(3)(a0)
74	LDR	s4, REGOFF(4)(a0)
75	LDR	s5, REGOFF(5)(a0)
76	LDR	s6, REGOFF(6)(a0)
77	LDR	s7, REGOFF(7)(a0)
78	LDR	s8, REGOFF(8)(a0)
79	LDR	s9, REGOFF(9)(a0)
80	LDR	s10, REGOFF(10)(a0)
81	LDR	s11, REGOFF(11)(a0)
82	LDR	ra, REGOFF(12)(a0)
83	LDR	sp, REGOFF(13)(a0)
84	seqz	a0, a1
85	add	a0, a0, a1
86	ret
87END_FUNC longjmp
88