1*70b0f278SAntonio Nino Diaz/* 2*70b0f278SAntonio Nino Diaz * Copyright (c) 2018-2019, ARM Limited and Contributors. All rights reserved. 3*70b0f278SAntonio Nino Diaz * 4*70b0f278SAntonio Nino Diaz * SPDX-License-Identifier: BSD-3-Clause 5*70b0f278SAntonio Nino Diaz */ 6*70b0f278SAntonio Nino Diaz 7*70b0f278SAntonio Nino Diaz#include <asm_macros.S> 8*70b0f278SAntonio Nino Diaz#include <assert_macros.S> 9*70b0f278SAntonio Nino Diaz#include <setjmp.h> 10*70b0f278SAntonio Nino Diaz 11*70b0f278SAntonio Nino Diaz .globl setjmp 12*70b0f278SAntonio Nino Diaz .globl longjmp 13*70b0f278SAntonio Nino Diaz 14*70b0f278SAntonio Nino Diaz/* 15*70b0f278SAntonio Nino Diaz * int setjmp(jmp_buf env); 16*70b0f278SAntonio Nino Diaz */ 17*70b0f278SAntonio Nino Diazfunc setjmp 18*70b0f278SAntonio Nino Diaz mov x7, sp 19*70b0f278SAntonio Nino Diaz 20*70b0f278SAntonio Nino Diaz stp x19, x20, [x0, #JMP_CTX_X19] 21*70b0f278SAntonio Nino Diaz stp x21, x22, [x0, #JMP_CTX_X21] 22*70b0f278SAntonio Nino Diaz stp x23, x24, [x0, #JMP_CTX_X23] 23*70b0f278SAntonio Nino Diaz stp x25, x26, [x0, #JMP_CTX_X25] 24*70b0f278SAntonio Nino Diaz stp x27, x28, [x0, #JMP_CTX_X27] 25*70b0f278SAntonio Nino Diaz stp x29, x30, [x0, #JMP_CTX_X29] 26*70b0f278SAntonio Nino Diaz stp x7, xzr, [x0, #JMP_CTX_SP] 27*70b0f278SAntonio Nino Diaz 28*70b0f278SAntonio Nino Diaz mov x0, #0 29*70b0f278SAntonio Nino Diaz ret 30*70b0f278SAntonio Nino Diazendfunc setjmp 31*70b0f278SAntonio Nino Diaz 32*70b0f278SAntonio Nino Diaz 33*70b0f278SAntonio Nino Diaz/* 34*70b0f278SAntonio Nino Diaz * void longjmp(jmp_buf env, int val); 35*70b0f278SAntonio Nino Diaz */ 36*70b0f278SAntonio Nino Diazfunc longjmp 37*70b0f278SAntonio Nino Diaz ldp x7, xzr, [x0, #JMP_CTX_SP] 38*70b0f278SAntonio Nino Diaz 39*70b0f278SAntonio Nino Diaz#if ENABLE_ASSERTIONS 40*70b0f278SAntonio Nino Diaz /* 41*70b0f278SAntonio Nino Diaz * Since we're unwinding the stack, assert that the stack being reset to 42*70b0f278SAntonio Nino Diaz * is shallower. 43*70b0f278SAntonio Nino Diaz */ 44*70b0f278SAntonio Nino Diaz mov x19, sp 45*70b0f278SAntonio Nino Diaz cmp x7, x19 46*70b0f278SAntonio Nino Diaz ASM_ASSERT(ge) 47*70b0f278SAntonio Nino Diaz#endif 48*70b0f278SAntonio Nino Diaz 49*70b0f278SAntonio Nino Diaz ldp x19, x20, [x0, #JMP_CTX_X19] 50*70b0f278SAntonio Nino Diaz ldp x21, x22, [x0, #JMP_CTX_X21] 51*70b0f278SAntonio Nino Diaz ldp x23, x24, [x0, #JMP_CTX_X23] 52*70b0f278SAntonio Nino Diaz ldp x25, x26, [x0, #JMP_CTX_X25] 53*70b0f278SAntonio Nino Diaz ldp x27, x28, [x0, #JMP_CTX_X27] 54*70b0f278SAntonio Nino Diaz ldp x29, x30, [x0, #JMP_CTX_X29] 55*70b0f278SAntonio Nino Diaz 56*70b0f278SAntonio Nino Diaz mov sp, x7 57*70b0f278SAntonio Nino Diaz 58*70b0f278SAntonio Nino Diaz ands x0, x1, x1 /* Move val to x0 and set flags */ 59*70b0f278SAntonio Nino Diaz cinc x0, x0, eq /* If val is 0, return 1 */ 60*70b0f278SAntonio Nino Diaz ret 61*70b0f278SAntonio Nino Diazendfunc longjmp 62