170b0f278SAntonio Nino Diaz/* 2*4c700c15SGovindraj Raja * Copyright (c) 2018-2019, Arm Limited and Contributors. All rights reserved. 370b0f278SAntonio Nino Diaz * 470b0f278SAntonio Nino Diaz * SPDX-License-Identifier: BSD-3-Clause 570b0f278SAntonio Nino Diaz */ 670b0f278SAntonio Nino Diaz 770b0f278SAntonio Nino Diaz#include <asm_macros.S> 870b0f278SAntonio Nino Diaz#include <assert_macros.S> 970b0f278SAntonio Nino Diaz#include <setjmp.h> 1070b0f278SAntonio Nino Diaz 1170b0f278SAntonio Nino Diaz .globl setjmp 1270b0f278SAntonio Nino Diaz .globl longjmp 1370b0f278SAntonio Nino Diaz 1470b0f278SAntonio Nino Diaz/* 1570b0f278SAntonio Nino Diaz * int setjmp(jmp_buf env); 1670b0f278SAntonio Nino Diaz */ 1770b0f278SAntonio Nino Diazfunc setjmp 1870b0f278SAntonio Nino Diaz mov x7, sp 1970b0f278SAntonio Nino Diaz 2070b0f278SAntonio Nino Diaz stp x19, x20, [x0, #JMP_CTX_X19] 2170b0f278SAntonio Nino Diaz stp x21, x22, [x0, #JMP_CTX_X21] 2270b0f278SAntonio Nino Diaz stp x23, x24, [x0, #JMP_CTX_X23] 2370b0f278SAntonio Nino Diaz stp x25, x26, [x0, #JMP_CTX_X25] 2470b0f278SAntonio Nino Diaz stp x27, x28, [x0, #JMP_CTX_X27] 2570b0f278SAntonio Nino Diaz stp x29, x30, [x0, #JMP_CTX_X29] 2670b0f278SAntonio Nino Diaz stp x7, xzr, [x0, #JMP_CTX_SP] 2770b0f278SAntonio Nino Diaz 2870b0f278SAntonio Nino Diaz mov x0, #0 2970b0f278SAntonio Nino Diaz ret 3070b0f278SAntonio Nino Diazendfunc setjmp 3170b0f278SAntonio Nino Diaz 3270b0f278SAntonio Nino Diaz 3370b0f278SAntonio Nino Diaz/* 3470b0f278SAntonio Nino Diaz * void longjmp(jmp_buf env, int val); 3570b0f278SAntonio Nino Diaz */ 3670b0f278SAntonio Nino Diazfunc longjmp 3770b0f278SAntonio Nino Diaz ldp x7, xzr, [x0, #JMP_CTX_SP] 3870b0f278SAntonio Nino Diaz 3970b0f278SAntonio Nino Diaz#if ENABLE_ASSERTIONS 4070b0f278SAntonio Nino Diaz /* 4170b0f278SAntonio Nino Diaz * Since we're unwinding the stack, assert that the stack being reset to 4270b0f278SAntonio Nino Diaz * is shallower. 4370b0f278SAntonio Nino Diaz */ 4470b0f278SAntonio Nino Diaz mov x19, sp 4570b0f278SAntonio Nino Diaz cmp x7, x19 4670b0f278SAntonio Nino Diaz ASM_ASSERT(ge) 4770b0f278SAntonio Nino Diaz#endif 4870b0f278SAntonio Nino Diaz 4970b0f278SAntonio Nino Diaz ldp x19, x20, [x0, #JMP_CTX_X19] 5070b0f278SAntonio Nino Diaz ldp x21, x22, [x0, #JMP_CTX_X21] 5170b0f278SAntonio Nino Diaz ldp x23, x24, [x0, #JMP_CTX_X23] 5270b0f278SAntonio Nino Diaz ldp x25, x26, [x0, #JMP_CTX_X25] 5370b0f278SAntonio Nino Diaz ldp x27, x28, [x0, #JMP_CTX_X27] 5470b0f278SAntonio Nino Diaz ldp x29, x30, [x0, #JMP_CTX_X29] 5570b0f278SAntonio Nino Diaz 5670b0f278SAntonio Nino Diaz mov sp, x7 5770b0f278SAntonio Nino Diaz 5870b0f278SAntonio Nino Diaz ands x0, x1, x1 /* Move val to x0 and set flags */ 5970b0f278SAntonio Nino Diaz cinc x0, x0, eq /* If val is 0, return 1 */ 6070b0f278SAntonio Nino Diaz ret 6170b0f278SAntonio Nino Diazendfunc longjmp 62