1*4882a593Smuzhiyun/* 2*4882a593Smuzhiyun * (C) 2017 Theobroma Systems Design und Consulting GmbH 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun#include <config.h> 8*4882a593Smuzhiyun#include <asm/macro.h> 9*4882a593Smuzhiyun#include <linux/linkage.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun.pushsection .text.setjmp, "ax" 12*4882a593SmuzhiyunENTRY(setjmp) 13*4882a593Smuzhiyun /* Preserve all callee-saved registers and the SP */ 14*4882a593Smuzhiyun stp x19, x20, [x0,#0] 15*4882a593Smuzhiyun stp x21, x22, [x0,#16] 16*4882a593Smuzhiyun stp x23, x24, [x0,#32] 17*4882a593Smuzhiyun stp x25, x26, [x0,#48] 18*4882a593Smuzhiyun stp x27, x28, [x0,#64] 19*4882a593Smuzhiyun stp x29, x30, [x0,#80] 20*4882a593Smuzhiyun mov x2, sp 21*4882a593Smuzhiyun str x2, [x0, #96] 22*4882a593Smuzhiyun mov x0, #0 23*4882a593Smuzhiyun ret 24*4882a593SmuzhiyunENDPROC(setjmp) 25*4882a593Smuzhiyun.popsection 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun.pushsection .text.longjmp, "ax" 28*4882a593SmuzhiyunENTRY(longjmp) 29*4882a593Smuzhiyun ldp x19, x20, [x0,#0] 30*4882a593Smuzhiyun ldp x21, x22, [x0,#16] 31*4882a593Smuzhiyun ldp x23, x24, [x0,#32] 32*4882a593Smuzhiyun ldp x25, x26, [x0,#48] 33*4882a593Smuzhiyun ldp x27, x28, [x0,#64] 34*4882a593Smuzhiyun ldp x29, x30, [x0,#80] 35*4882a593Smuzhiyun ldr x2, [x0,#96] 36*4882a593Smuzhiyun mov sp, x2 37*4882a593Smuzhiyun /* Move the return value in place, but return 1 if passed 0. */ 38*4882a593Smuzhiyun adds x0, xzr, x1 39*4882a593Smuzhiyun csinc x0, x0, xzr, ne 40*4882a593Smuzhiyun /* invalid icache for cortex a35 */ 41*4882a593Smuzhiyunbranch_if_a35_core x1, __asm_invalidate_icache_all 42*4882a593Smuzhiyun ret 43*4882a593SmuzhiyunENDPROC(longjmp) 44*4882a593Smuzhiyun.popsection 45