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