xref: /optee_os/lib/libutils/isoc/arch/riscv/setjmp_rv.S (revision 7749dda24cf2b1f0a04d1de529cde03b6ca79867)
19324ced7SMarouene Boubakri/* SPDX-License-Identifier: BSD-2-Clause */
29324ced7SMarouene Boubakri/*
3bc12b0e9SAlvin 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
26bc12b0e9SAlvin Chang#ifdef RV32
27bc12b0e9SAlvin Chang	STR	ra, REGOFF(3)(sp)
28bc12b0e9SAlvin Chang	STR	s0, REGOFF(2)(sp)
29bc12b0e9SAlvin Chang#else
30bc12b0e9SAlvin Chang	STR	ra, REGOFF(1)(sp)
31bc12b0e9SAlvin Chang	STR	s0, REGOFF(0)(sp)
32bc12b0e9SAlvin Chang#endif
33bc12b0e9SAlvin Chang	addi	s0, sp, 16
34bc12b0e9SAlvin Chang	addi	a0, a0, REGOFF(14)
35bc12b0e9SAlvin Chang	call	ftrace_setjmp
36bc12b0e9SAlvin Chang#ifdef RV32
37bc12b0e9SAlvin Chang	LDR	s0, REGOFF(2)(sp)
38bc12b0e9SAlvin Chang	LDR	ra, REGOFF(3)(sp)
39bc12b0e9SAlvin Chang#else
40bc12b0e9SAlvin Chang	LDR	s0, REGOFF(0)(sp)
41bc12b0e9SAlvin Chang	LDR	ra, REGOFF(1)(sp)
42bc12b0e9SAlvin 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
52bc12b0e9SAlvin Chang	addi	sp, sp, -REGOFF(4)
539324ced7SMarouene Boubakri	STR	a0, REGOFF(0)(sp)
549324ced7SMarouene Boubakri	STR	a1, REGOFF(1)(sp)
55bc12b0e9SAlvin Chang	STR	s0, REGOFF(2)(sp)
56bc12b0e9SAlvin Chang	STR	ra, REGOFF(3)(sp)
57bc12b0e9SAlvin Chang	addi	s0, sp, REGOFF(4)
58bc12b0e9SAlvin Chang	addi	a0, a0, REGOFF(14)
59bc12b0e9SAlvin Chang	call	ftrace_longjmp
609324ced7SMarouene Boubakri	LDR	a0, REGOFF(0)(sp)
619324ced7SMarouene Boubakri	LDR	a1, REGOFF(1)(sp)
62bc12b0e9SAlvin Chang	LDR	s0, REGOFF(2)(sp)
63bc12b0e9SAlvin Chang	LDR	ra, REGOFF(3)(sp)
64bc12b0e9SAlvin Chang	addi	sp, sp, REGOFF(4)
659324ced7SMarouene Boubakri#endif
66*7749dda2SAleksandr Iashchenko#if defined(__KERNEL__) && defined(CFG_CORE_SANITIZE_KADDRESS) && \
67*7749dda2SAleksandr Iashchenko    !defined(CFG_DYN_CONFIG)
68*7749dda2SAleksandr Iashchenko#error longjmp() stack unpoisoning not implemented for RISC-V with ASAN
69*7749dda2SAleksandr Iashchenko#endif
709324ced7SMarouene Boubakri	LDR	s0, REGOFF(0)(a0)
719324ced7SMarouene Boubakri	LDR	s1, REGOFF(1)(a0)
729324ced7SMarouene Boubakri	LDR	s2, REGOFF(2)(a0)
739324ced7SMarouene Boubakri	LDR	s3, REGOFF(3)(a0)
749324ced7SMarouene Boubakri	LDR	s4, REGOFF(4)(a0)
759324ced7SMarouene Boubakri	LDR	s5, REGOFF(5)(a0)
769324ced7SMarouene Boubakri	LDR	s6, REGOFF(6)(a0)
779324ced7SMarouene Boubakri	LDR	s7, REGOFF(7)(a0)
789324ced7SMarouene Boubakri	LDR	s8, REGOFF(8)(a0)
799324ced7SMarouene Boubakri	LDR	s9, REGOFF(9)(a0)
809324ced7SMarouene Boubakri	LDR	s10, REGOFF(10)(a0)
819324ced7SMarouene Boubakri	LDR	s11, REGOFF(11)(a0)
829324ced7SMarouene Boubakri	LDR	ra, REGOFF(12)(a0)
839324ced7SMarouene Boubakri	LDR	sp, REGOFF(13)(a0)
849324ced7SMarouene Boubakri	seqz	a0, a1
859324ced7SMarouene Boubakri	add	a0, a0, a1
869324ced7SMarouene Boubakri	ret
879324ced7SMarouene BoubakriEND_FUNC longjmp
88