/* SPDX-License-Identifier: GPL-2.0+ */ | |
/* | |
* (C) 2017 Theobroma Systems Design und Consulting GmbH | |
*/ | |
#include <config.h> | |
#include <asm/macro.h> | |
#include <linux/linkage.h> | |
.pushsection .text.setjmp, "ax" | |
ENTRY(setjmp) | |
/* Preserve all callee-saved registers and the SP */ | |
stp x19, x20, [x0,#0] | |
stp x21, x22, [x0,#16] | |
stp x23, x24, [x0,#32] | |
stp x25, x26, [x0,#48] | |
stp x27, x28, [x0,#64] | |
stp x29, x30, [x0,#80] | |
mov x2, sp | |
str x2, [x0, #96] | |
mov x0, #0 | |
ret | |
ENDPROC(setjmp) | |
.popsection | |
.pushsection .text.longjmp, "ax" | |
ENTRY(longjmp) | |
ldp x19, x20, [x0,#0] | |
ldp x21, x22, [x0,#16] | |
ldp x23, x24, [x0,#32] | |
ldp x25, x26, [x0,#48] | |
ldp x27, x28, [x0,#64] | |
ldp x29, x30, [x0,#80] | |
ldr x2, [x0,#96] | |
mov sp, x2 | |
/* Move the return value in place, but return 1 if passed 0. */ | |
adds x0, xzr, x1 | |
csinc x0, x0, xzr, ne | |
ret | |
ENDPROC(longjmp) | |
.popsection |