1/* SPDX-License-Identifier: GPL-2.0+ */
2/*
3 * (C) 2017 Theobroma Systems Design und Consulting GmbH
4 */
5
6#include <config.h>
7#include <asm/assembler.h>
8#include <linux/linkage.h>
9
10.pushsection .text.setjmp, "ax"
11ENTRY(setjmp)
12	/*
13	 * A subroutine must preserve the contents of the registers
14	 * r4-r8, r10, r11 (v1-v5, v7 and v8) and SP (and r9 in PCS
15	 * variants that designate r9 as v6).
16	 */
17	mov  ip, sp
18	stm  a1, {v1-v8, ip, lr}
19	mov  a1, #0
20	ret  lr
21ENDPROC(setjmp)
22.popsection
23
24.pushsection .text.longjmp, "ax"
25ENTRY(longjmp)
26	ldm  a1, {v1-v8, ip, lr}
27	mov  sp, ip
28	mov  a1, a2
29	/* If we were passed a return value of zero, return one instead */
30	cmp  a1, #0
31	bne  1f
32	mov  a1, #1
331:
34	ret  lr
35ENDPROC(longjmp)
36.popsection
37
38.pushsection .text.initjmp, "ax"
39ENTRY(initjmp)
40	stm  a1, {v1-v8}
41	/* a2: entry point address, a3: stack base, a4: stack size */
42	add  a3, a3, a4
43	str  a3, [a1, #32]  /* where setjmp would save sp */
44	str  a2, [a1, #36]  /* where setjmp would save lr */
45	mov  a1, #0
46	ret  lr
47ENDPROC(initjmp)
48.popsection
49