| /* 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 |