xref: /optee_os/lib/libutils/isoc/arch/arm/setjmp_a64.S (revision 0c81fcd6798bb5fa251f130ec7657e128c17cc46)
1*0c81fcd6SJens Wiklander/*
2*0c81fcd6SJens Wiklander   Copyright (c) 2011, 2012 ARM Ltd
3*0c81fcd6SJens Wiklander   All rights reserved.
4*0c81fcd6SJens Wiklander
5*0c81fcd6SJens Wiklander   Redistribution and use in source and binary forms, with or without
6*0c81fcd6SJens Wiklander   modification, are permitted provided that the following conditions
7*0c81fcd6SJens Wiklander   are met:
8*0c81fcd6SJens Wiklander   1. Redistributions of source code must retain the above copyright
9*0c81fcd6SJens Wiklander      notice, this list of conditions and the following disclaimer.
10*0c81fcd6SJens Wiklander   2. Redistributions in binary form must reproduce the above copyright
11*0c81fcd6SJens Wiklander      notice, this list of conditions and the following disclaimer in the
12*0c81fcd6SJens Wiklander      documentation and/or other materials provided with the distribution.
13*0c81fcd6SJens Wiklander   3. The name of the company may not be used to endorse or promote
14*0c81fcd6SJens Wiklander      products derived from this software without specific prior written
15*0c81fcd6SJens Wiklander      permission.
16*0c81fcd6SJens Wiklander
17*0c81fcd6SJens Wiklander   THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED
18*0c81fcd6SJens Wiklander   WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19*0c81fcd6SJens Wiklander   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20*0c81fcd6SJens Wiklander   IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21*0c81fcd6SJens Wiklander   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
22*0c81fcd6SJens Wiklander   TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23*0c81fcd6SJens Wiklander   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24*0c81fcd6SJens Wiklander   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25*0c81fcd6SJens Wiklander   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26*0c81fcd6SJens Wiklander   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*0c81fcd6SJens Wiklander */
28*0c81fcd6SJens Wiklander
29*0c81fcd6SJens Wiklander#define GPR_LAYOUT			\
30*0c81fcd6SJens Wiklander	REG_PAIR (x19, x20,  0);	\
31*0c81fcd6SJens Wiklander	REG_PAIR (x21, x22, 16);	\
32*0c81fcd6SJens Wiklander	REG_PAIR (x23, x24, 32);	\
33*0c81fcd6SJens Wiklander	REG_PAIR (x25, x26, 48);	\
34*0c81fcd6SJens Wiklander	REG_PAIR (x27, x28, 64);	\
35*0c81fcd6SJens Wiklander	REG_PAIR (x29, x30, 80);	\
36*0c81fcd6SJens Wiklander	REG_ONE (x16,      96)
37*0c81fcd6SJens Wiklander
38*0c81fcd6SJens Wiklander#define FPR_LAYOUT			\
39*0c81fcd6SJens Wiklander	REG_PAIR ( d8,  d9, 112);	\
40*0c81fcd6SJens Wiklander	REG_PAIR (d10, d11, 128);	\
41*0c81fcd6SJens Wiklander	REG_PAIR (d12, d13, 144);	\
42*0c81fcd6SJens Wiklander	REG_PAIR (d14, d15, 160);
43*0c81fcd6SJens Wiklander
44*0c81fcd6SJens Wiklander// int setjmp (jmp_buf)
45*0c81fcd6SJens Wiklander	.global	setjmp
46*0c81fcd6SJens Wiklander	.type	setjmp, %function
47*0c81fcd6SJens Wiklandersetjmp:
48*0c81fcd6SJens Wiklander	mov	x16, sp
49*0c81fcd6SJens Wiklander#define REG_PAIR(REG1, REG2, OFFS)	stp REG1, REG2, [x0, OFFS]
50*0c81fcd6SJens Wiklander#define REG_ONE(REG1, OFFS)		str REG1, [x0, OFFS]
51*0c81fcd6SJens Wiklander	GPR_LAYOUT
52*0c81fcd6SJens Wiklander	FPR_LAYOUT
53*0c81fcd6SJens Wiklander#undef REG_PAIR
54*0c81fcd6SJens Wiklander#undef REG_ONE
55*0c81fcd6SJens Wiklander	mov	w0, #0
56*0c81fcd6SJens Wiklander	ret
57*0c81fcd6SJens Wiklander	.size	setjmp, .-setjmp
58*0c81fcd6SJens Wiklander
59*0c81fcd6SJens Wiklander// void longjmp (jmp_buf, int) __attribute__ ((noreturn))
60*0c81fcd6SJens Wiklander	.global	longjmp
61*0c81fcd6SJens Wiklander	.type	longjmp, %function
62*0c81fcd6SJens Wiklanderlongjmp:
63*0c81fcd6SJens Wiklander#define REG_PAIR(REG1, REG2, OFFS)	ldp REG1, REG2, [x0, OFFS]
64*0c81fcd6SJens Wiklander#define REG_ONE(REG1, OFFS)		ldr REG1, [x0, OFFS]
65*0c81fcd6SJens Wiklander	GPR_LAYOUT
66*0c81fcd6SJens Wiklander	FPR_LAYOUT
67*0c81fcd6SJens Wiklander#undef REG_PAIR
68*0c81fcd6SJens Wiklander#undef REG_ONE
69*0c81fcd6SJens Wiklander	mov	sp, x16
70*0c81fcd6SJens Wiklander	cmp	w1, #0
71*0c81fcd6SJens Wiklander	cinc	w0, w1, eq
72*0c81fcd6SJens Wiklander	// use br not ret, as ret is guaranteed to mispredict
73*0c81fcd6SJens Wiklander	br	x30
74*0c81fcd6SJens Wiklander	.size	longjmp, .-longjmp
75