xref: /optee_os/lib/libutils/isoc/arch/riscv/setjmp_rv.S (revision 9f34db38245c9b3a4e6e7e63eb78a75e23ab2da3)
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	LDR	s0, REGOFF(0)(a0)
67	LDR	s1, REGOFF(1)(a0)
68	LDR	s2, REGOFF(2)(a0)
69	LDR	s3, REGOFF(3)(a0)
70	LDR	s4, REGOFF(4)(a0)
71	LDR	s5, REGOFF(5)(a0)
72	LDR	s6, REGOFF(6)(a0)
73	LDR	s7, REGOFF(7)(a0)
74	LDR	s8, REGOFF(8)(a0)
75	LDR	s9, REGOFF(9)(a0)
76	LDR	s10, REGOFF(10)(a0)
77	LDR	s11, REGOFF(11)(a0)
78	LDR	ra, REGOFF(12)(a0)
79	LDR	sp, REGOFF(13)(a0)
80	seqz	a0, a1
81	add	a0, a0, a1
82	ret
83END_FUNC longjmp
84