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