xref: /optee_os/lib/libutils/isoc/arch/riscv/setjmp_rv.S (revision 9324ced761311bd0bd97b2cb80f86f3aa20e3521)
1*9324ced7SMarouene Boubakri/* SPDX-License-Identifier: BSD-2-Clause */
2*9324ced7SMarouene Boubakri/*
3*9324ced7SMarouene Boubakri * Copyright 2022-2023 NXP
4*9324ced7SMarouene Boubakri */
5*9324ced7SMarouene Boubakri#include <asm.S>
6*9324ced7SMarouene Boubakri
7*9324ced7SMarouene Boubakri#ifdef RV32
8*9324ced7SMarouene Boubakri#define STR       sw
9*9324ced7SMarouene Boubakri#define LDR       lw
10*9324ced7SMarouene Boubakri#define REGOFF(x) ((x) * 4)
11*9324ced7SMarouene Boubakri#else
12*9324ced7SMarouene Boubakri#define STR       sd
13*9324ced7SMarouene Boubakri#define LDR       ld
14*9324ced7SMarouene Boubakri#define REGOFF(x) ((x) * 8)
15*9324ced7SMarouene Boubakri#endif /*RV32*/
16*9324ced7SMarouene Boubakri
17*9324ced7SMarouene Boubakri/* int setjmp (jmp_buf) */
18*9324ced7SMarouene BoubakriFUNC setjmp , :
19*9324ced7SMarouene Boubakri	STR	s0, REGOFF(0)(a0)
20*9324ced7SMarouene Boubakri	STR	s1, REGOFF(1)(a0)
21*9324ced7SMarouene Boubakri	STR	s2, REGOFF(2)(a0)
22*9324ced7SMarouene Boubakri	STR	s3, REGOFF(3)(a0)
23*9324ced7SMarouene Boubakri	STR	s4, REGOFF(4)(a0)
24*9324ced7SMarouene Boubakri	STR	s5, REGOFF(5)(a0)
25*9324ced7SMarouene Boubakri	STR	s6, REGOFF(6)(a0)
26*9324ced7SMarouene Boubakri	STR	s7, REGOFF(7)(a0)
27*9324ced7SMarouene Boubakri	STR	s8, REGOFF(8)(a0)
28*9324ced7SMarouene Boubakri	STR	s9, REGOFF(9)(a0)
29*9324ced7SMarouene Boubakri	STR	s10, REGOFF(10)(a0)
30*9324ced7SMarouene Boubakri	STR	s11, REGOFF(11)(a0)
31*9324ced7SMarouene Boubakri	STR	ra, REGOFF(12)(a0)
32*9324ced7SMarouene Boubakri	STR	sp, REGOFF(13)(a0)
33*9324ced7SMarouene Boubakri#ifdef CFG_FTRACE_SUPPORT
34*9324ced7SMarouene Boubakri	addi	sp, sp, -16
35*9324ced7SMarouene Boubakri	STR	ra, (sp)
36*9324ced7SMarouene Boubakri	mov	x29, sp
37*9324ced7SMarouene Boubakri	addi	a0, a0, REGOFF(12)
38*9324ced7SMarouene Boubakri	jal	ftrace_setjmp
39*9324ced7SMarouene Boubakri	LDR	ra, (sp)
40*9324ced7SMarouene Boubakri	addi	sp, sp, 16
41*9324ced7SMarouene Boubakri#endif
42*9324ced7SMarouene Boubakri	li 	a0, 0
43*9324ced7SMarouene Boubakri	ret
44*9324ced7SMarouene BoubakriEND_FUNC setjmp
45*9324ced7SMarouene Boubakri
46*9324ced7SMarouene Boubakri/* void longjmp (jmp_buf, int) __attribute__ ((noreturn)) */
47*9324ced7SMarouene BoubakriFUNC longjmp , :
48*9324ced7SMarouene Boubakri#ifdef CFG_FTRACE_SUPPORT
49*9324ced7SMarouene Boubakri	addi	sp, sp, -16
50*9324ced7SMarouene Boubakri	STR	a0, REGOFF(0)(sp)
51*9324ced7SMarouene Boubakri	STR	a1, REGOFF(1)(sp)
52*9324ced7SMarouene Boubakri	STR	ra, REGOFF(2)(sp)
53*9324ced7SMarouene Boubakri	addi	a0, a0, REGOFF(12)
54*9324ced7SMarouene Boubakri	jal	ftrace_longjmp
55*9324ced7SMarouene Boubakri	LDR	a0, REGOFF(0)(sp)
56*9324ced7SMarouene Boubakri	LDR	a1, REGOFF(1)(sp)
57*9324ced7SMarouene Boubakri	LDR	ra, REGOFF(2)(sp)
58*9324ced7SMarouene Boubakri	addi	sp, sp, 16
59*9324ced7SMarouene Boubakri#endif
60*9324ced7SMarouene Boubakri	LDR	s0, REGOFF(0)(a0)
61*9324ced7SMarouene Boubakri	LDR	s1, REGOFF(1)(a0)
62*9324ced7SMarouene Boubakri	LDR	s2, REGOFF(2)(a0)
63*9324ced7SMarouene Boubakri	LDR	s3, REGOFF(3)(a0)
64*9324ced7SMarouene Boubakri	LDR	s4, REGOFF(4)(a0)
65*9324ced7SMarouene Boubakri	LDR	s5, REGOFF(5)(a0)
66*9324ced7SMarouene Boubakri	LDR	s6, REGOFF(6)(a0)
67*9324ced7SMarouene Boubakri	LDR	s7, REGOFF(7)(a0)
68*9324ced7SMarouene Boubakri	LDR	s8, REGOFF(8)(a0)
69*9324ced7SMarouene Boubakri	LDR	s9, REGOFF(9)(a0)
70*9324ced7SMarouene Boubakri	LDR	s10, REGOFF(10)(a0)
71*9324ced7SMarouene Boubakri	LDR	s11, REGOFF(11)(a0)
72*9324ced7SMarouene Boubakri	LDR	ra, REGOFF(12)(a0)
73*9324ced7SMarouene Boubakri	LDR	sp, REGOFF(13)(a0)
74*9324ced7SMarouene Boubakri	seqz	a0, a1
75*9324ced7SMarouene Boubakri	add	a0, a0, a1
76*9324ced7SMarouene Boubakri	ret
77*9324ced7SMarouene BoubakriEND_FUNC longjmp
78