/* SPDX-License-Identifier: BSD-2-Clause */ /* * Copyright (c) 2023 Andes Technology Corporation * Copyright 2022-2023 NXP */ #include /* int setjmp (jmp_buf) */ FUNC setjmp , : STR s0, REGOFF(0)(a0) STR s1, REGOFF(1)(a0) STR s2, REGOFF(2)(a0) STR s3, REGOFF(3)(a0) STR s4, REGOFF(4)(a0) STR s5, REGOFF(5)(a0) STR s6, REGOFF(6)(a0) STR s7, REGOFF(7)(a0) STR s8, REGOFF(8)(a0) STR s9, REGOFF(9)(a0) STR s10, REGOFF(10)(a0) STR s11, REGOFF(11)(a0) STR ra, REGOFF(12)(a0) STR sp, REGOFF(13)(a0) #ifdef CFG_FTRACE_SUPPORT addi sp, sp, -16 #ifdef RV32 STR ra, REGOFF(3)(sp) STR s0, REGOFF(2)(sp) #else STR ra, REGOFF(1)(sp) STR s0, REGOFF(0)(sp) #endif addi s0, sp, 16 addi a0, a0, REGOFF(14) call ftrace_setjmp #ifdef RV32 LDR s0, REGOFF(2)(sp) LDR ra, REGOFF(3)(sp) #else LDR s0, REGOFF(0)(sp) LDR ra, REGOFF(1)(sp) #endif addi sp, sp, 16 #endif li a0, 0 ret END_FUNC setjmp /* void longjmp (jmp_buf, int) __attribute__ ((noreturn)) */ FUNC longjmp , : #ifdef CFG_FTRACE_SUPPORT addi sp, sp, -REGOFF(4) STR a0, REGOFF(0)(sp) STR a1, REGOFF(1)(sp) STR s0, REGOFF(2)(sp) STR ra, REGOFF(3)(sp) addi s0, sp, REGOFF(4) addi a0, a0, REGOFF(14) call ftrace_longjmp LDR a0, REGOFF(0)(sp) LDR a1, REGOFF(1)(sp) LDR s0, REGOFF(2)(sp) LDR ra, REGOFF(3)(sp) addi sp, sp, REGOFF(4) #endif #if defined(__KERNEL__) && defined(CFG_CORE_SANITIZE_KADDRESS) && \ !defined(CFG_DYN_CONFIG) #error longjmp() stack unpoisoning not implemented for RISC-V with ASAN #endif LDR s0, REGOFF(0)(a0) LDR s1, REGOFF(1)(a0) LDR s2, REGOFF(2)(a0) LDR s3, REGOFF(3)(a0) LDR s4, REGOFF(4)(a0) LDR s5, REGOFF(5)(a0) LDR s6, REGOFF(6)(a0) LDR s7, REGOFF(7)(a0) LDR s8, REGOFF(8)(a0) LDR s9, REGOFF(9)(a0) LDR s10, REGOFF(10)(a0) LDR s11, REGOFF(11)(a0) LDR ra, REGOFF(12)(a0) LDR sp, REGOFF(13)(a0) seqz a0, a1 add a0, a0, a1 ret END_FUNC longjmp