xref: /rk3399_rockchip-uboot/arch/arm/lib/setjmp.S (revision c1da286a086ecbd7b2ee6837047dcc5707cf985f)
1*c1da286aSPhilipp Tomsich/*
2*c1da286aSPhilipp Tomsich * (C) 2017 Theobroma Systems Design und Consulting GmbH
3*c1da286aSPhilipp Tomsich *
4*c1da286aSPhilipp Tomsich * SPDX-License-Identifier:	GPL-2.0+
5*c1da286aSPhilipp Tomsich */
6*c1da286aSPhilipp Tomsich
7*c1da286aSPhilipp Tomsich#include <config.h>
8*c1da286aSPhilipp Tomsich#include <asm/assembler.h>
9*c1da286aSPhilipp Tomsich#include <linux/linkage.h>
10*c1da286aSPhilipp Tomsich
11*c1da286aSPhilipp Tomsich.pushsection .text.setjmp, "ax"
12*c1da286aSPhilipp TomsichENTRY(setjmp)
13*c1da286aSPhilipp Tomsich	/*
14*c1da286aSPhilipp Tomsich	 * A subroutine must preserve the contents of the registers
15*c1da286aSPhilipp Tomsich	 * r4-r8, r10, r11 (v1-v5, v7 and v8) and SP (and r9 in PCS
16*c1da286aSPhilipp Tomsich	 * variants that designate r9 as v6).
17*c1da286aSPhilipp Tomsich	 */
18*c1da286aSPhilipp Tomsich	mov  ip, sp
19*c1da286aSPhilipp Tomsich	stm  a1, {v1-v8, ip, lr}
20*c1da286aSPhilipp Tomsich	mov  a1, #0
21*c1da286aSPhilipp Tomsich	bx   lr
22*c1da286aSPhilipp TomsichENDPROC(setjmp)
23*c1da286aSPhilipp Tomsich.popsection
24*c1da286aSPhilipp Tomsich
25*c1da286aSPhilipp Tomsich.pushsection .text.longjmp, "ax"
26*c1da286aSPhilipp TomsichENTRY(longjmp)
27*c1da286aSPhilipp Tomsich	ldm  a1, {v1-v8, ip, lr}
28*c1da286aSPhilipp Tomsich	mov  sp, ip
29*c1da286aSPhilipp Tomsich	mov  a1, a2
30*c1da286aSPhilipp Tomsich	/* If we were passed a return value of zero, return one instead */
31*c1da286aSPhilipp Tomsich	cmp  a1, #0
32*c1da286aSPhilipp Tomsich	bne  1f
33*c1da286aSPhilipp Tomsich	mov  a1, #1
34*c1da286aSPhilipp Tomsich1:
35*c1da286aSPhilipp Tomsich	bx   lr
36*c1da286aSPhilipp TomsichENDPROC(longjmp)
37*c1da286aSPhilipp Tomsich.popsection
38