xref: /optee_os/lib/libutils/isoc/arch/riscv/setjmp_rv.S (revision bc12b0e95e3c63f46850c1e69c79cd6879c68543)
19324ced7SMarouene Boubakri/* SPDX-License-Identifier: BSD-2-Clause */
29324ced7SMarouene Boubakri/*
3*bc12b0e9SAlvin Chang * Copyright (c) 2023 Andes Technology Corporation
49324ced7SMarouene Boubakri * Copyright 2022-2023 NXP
59324ced7SMarouene Boubakri */
69324ced7SMarouene Boubakri#include <asm.S>
79324ced7SMarouene Boubakri
89324ced7SMarouene Boubakri/* int setjmp (jmp_buf) */
99324ced7SMarouene BoubakriFUNC setjmp , :
109324ced7SMarouene Boubakri	STR	s0, REGOFF(0)(a0)
119324ced7SMarouene Boubakri	STR	s1, REGOFF(1)(a0)
129324ced7SMarouene Boubakri	STR	s2, REGOFF(2)(a0)
139324ced7SMarouene Boubakri	STR	s3, REGOFF(3)(a0)
149324ced7SMarouene Boubakri	STR	s4, REGOFF(4)(a0)
159324ced7SMarouene Boubakri	STR	s5, REGOFF(5)(a0)
169324ced7SMarouene Boubakri	STR	s6, REGOFF(6)(a0)
179324ced7SMarouene Boubakri	STR	s7, REGOFF(7)(a0)
189324ced7SMarouene Boubakri	STR	s8, REGOFF(8)(a0)
199324ced7SMarouene Boubakri	STR	s9, REGOFF(9)(a0)
209324ced7SMarouene Boubakri	STR	s10, REGOFF(10)(a0)
219324ced7SMarouene Boubakri	STR	s11, REGOFF(11)(a0)
229324ced7SMarouene Boubakri	STR	ra, REGOFF(12)(a0)
239324ced7SMarouene Boubakri	STR	sp, REGOFF(13)(a0)
249324ced7SMarouene Boubakri#ifdef CFG_FTRACE_SUPPORT
259324ced7SMarouene Boubakri	addi	sp, sp, -16
26*bc12b0e9SAlvin Chang#ifdef RV32
27*bc12b0e9SAlvin Chang	STR	ra, REGOFF(3)(sp)
28*bc12b0e9SAlvin Chang	STR	s0, REGOFF(2)(sp)
29*bc12b0e9SAlvin Chang#else
30*bc12b0e9SAlvin Chang	STR	ra, REGOFF(1)(sp)
31*bc12b0e9SAlvin Chang	STR	s0, REGOFF(0)(sp)
32*bc12b0e9SAlvin Chang#endif
33*bc12b0e9SAlvin Chang	addi	s0, sp, 16
34*bc12b0e9SAlvin Chang	addi	a0, a0, REGOFF(14)
35*bc12b0e9SAlvin Chang	call	ftrace_setjmp
36*bc12b0e9SAlvin Chang#ifdef RV32
37*bc12b0e9SAlvin Chang	LDR	s0, REGOFF(2)(sp)
38*bc12b0e9SAlvin Chang	LDR	ra, REGOFF(3)(sp)
39*bc12b0e9SAlvin Chang#else
40*bc12b0e9SAlvin Chang	LDR	s0, REGOFF(0)(sp)
41*bc12b0e9SAlvin Chang	LDR	ra, REGOFF(1)(sp)
42*bc12b0e9SAlvin Chang#endif
439324ced7SMarouene Boubakri	addi	sp, sp, 16
449324ced7SMarouene Boubakri#endif
459324ced7SMarouene Boubakri	li 	a0, 0
469324ced7SMarouene Boubakri	ret
479324ced7SMarouene BoubakriEND_FUNC setjmp
489324ced7SMarouene Boubakri
499324ced7SMarouene Boubakri/* void longjmp (jmp_buf, int) __attribute__ ((noreturn)) */
509324ced7SMarouene BoubakriFUNC longjmp , :
519324ced7SMarouene Boubakri#ifdef CFG_FTRACE_SUPPORT
52*bc12b0e9SAlvin Chang	addi	sp, sp, -REGOFF(4)
539324ced7SMarouene Boubakri	STR	a0, REGOFF(0)(sp)
549324ced7SMarouene Boubakri	STR	a1, REGOFF(1)(sp)
55*bc12b0e9SAlvin Chang	STR	s0, REGOFF(2)(sp)
56*bc12b0e9SAlvin Chang	STR	ra, REGOFF(3)(sp)
57*bc12b0e9SAlvin Chang	addi	s0, sp, REGOFF(4)
58*bc12b0e9SAlvin Chang	addi	a0, a0, REGOFF(14)
59*bc12b0e9SAlvin Chang	call	ftrace_longjmp
609324ced7SMarouene Boubakri	LDR	a0, REGOFF(0)(sp)
619324ced7SMarouene Boubakri	LDR	a1, REGOFF(1)(sp)
62*bc12b0e9SAlvin Chang	LDR	s0, REGOFF(2)(sp)
63*bc12b0e9SAlvin Chang	LDR	ra, REGOFF(3)(sp)
64*bc12b0e9SAlvin Chang	addi	sp, sp, REGOFF(4)
659324ced7SMarouene Boubakri#endif
669324ced7SMarouene Boubakri	LDR	s0, REGOFF(0)(a0)
679324ced7SMarouene Boubakri	LDR	s1, REGOFF(1)(a0)
689324ced7SMarouene Boubakri	LDR	s2, REGOFF(2)(a0)
699324ced7SMarouene Boubakri	LDR	s3, REGOFF(3)(a0)
709324ced7SMarouene Boubakri	LDR	s4, REGOFF(4)(a0)
719324ced7SMarouene Boubakri	LDR	s5, REGOFF(5)(a0)
729324ced7SMarouene Boubakri	LDR	s6, REGOFF(6)(a0)
739324ced7SMarouene Boubakri	LDR	s7, REGOFF(7)(a0)
749324ced7SMarouene Boubakri	LDR	s8, REGOFF(8)(a0)
759324ced7SMarouene Boubakri	LDR	s9, REGOFF(9)(a0)
769324ced7SMarouene Boubakri	LDR	s10, REGOFF(10)(a0)
779324ced7SMarouene Boubakri	LDR	s11, REGOFF(11)(a0)
789324ced7SMarouene Boubakri	LDR	ra, REGOFF(12)(a0)
799324ced7SMarouene Boubakri	LDR	sp, REGOFF(13)(a0)
809324ced7SMarouene Boubakri	seqz	a0, a1
819324ced7SMarouene Boubakri	add	a0, a0, a1
829324ced7SMarouene Boubakri	ret
839324ced7SMarouene BoubakriEND_FUNC longjmp
84