xref: /optee_os/lib/libutils/isoc/arch/arm/setjmp_a64.S (revision 7ad2713dc97199fc5eab04702b20b18e6f56ad5d)
11bb92983SJerome Forissier/* SPDX-License-Identifier: BSD-3-Clause */
20c81fcd6SJens Wiklander/*
30c81fcd6SJens Wiklander   Copyright (c) 2011, 2012 ARM Ltd
40c81fcd6SJens Wiklander   All rights reserved.
50c81fcd6SJens Wiklander
60c81fcd6SJens Wiklander   Redistribution and use in source and binary forms, with or without
70c81fcd6SJens Wiklander   modification, are permitted provided that the following conditions
80c81fcd6SJens Wiklander   are met:
90c81fcd6SJens Wiklander   1. Redistributions of source code must retain the above copyright
100c81fcd6SJens Wiklander      notice, this list of conditions and the following disclaimer.
110c81fcd6SJens Wiklander   2. Redistributions in binary form must reproduce the above copyright
120c81fcd6SJens Wiklander      notice, this list of conditions and the following disclaimer in the
130c81fcd6SJens Wiklander      documentation and/or other materials provided with the distribution.
140c81fcd6SJens Wiklander   3. The name of the company may not be used to endorse or promote
150c81fcd6SJens Wiklander      products derived from this software without specific prior written
160c81fcd6SJens Wiklander      permission.
170c81fcd6SJens Wiklander
180c81fcd6SJens Wiklander   THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED
190c81fcd6SJens Wiklander   WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
200c81fcd6SJens Wiklander   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
210c81fcd6SJens Wiklander   IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
220c81fcd6SJens Wiklander   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
230c81fcd6SJens Wiklander   TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
240c81fcd6SJens Wiklander   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
250c81fcd6SJens Wiklander   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
260c81fcd6SJens Wiklander   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
270c81fcd6SJens Wiklander   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
280c81fcd6SJens Wiklander */
290c81fcd6SJens Wiklander
30*7ad2713dSRuchika Gupta#include <asm.S>
31*7ad2713dSRuchika Gupta
320c81fcd6SJens Wiklander#define GPR_LAYOUT			\
330c81fcd6SJens Wiklander	REG_PAIR (x19, x20,  0);	\
340c81fcd6SJens Wiklander	REG_PAIR (x21, x22, 16);	\
350c81fcd6SJens Wiklander	REG_PAIR (x23, x24, 32);	\
360c81fcd6SJens Wiklander	REG_PAIR (x25, x26, 48);	\
370c81fcd6SJens Wiklander	REG_PAIR (x27, x28, 64);	\
380c81fcd6SJens Wiklander	REG_PAIR (x29, x30, 80);	\
390c81fcd6SJens Wiklander	REG_ONE (x16,      96)
400c81fcd6SJens Wiklander
410c81fcd6SJens Wiklander#define FPR_LAYOUT			\
420c81fcd6SJens Wiklander	REG_PAIR ( d8,  d9, 112);	\
430c81fcd6SJens Wiklander	REG_PAIR (d10, d11, 128);	\
440c81fcd6SJens Wiklander	REG_PAIR (d12, d13, 144);	\
450c81fcd6SJens Wiklander	REG_PAIR (d14, d15, 160);
460c81fcd6SJens Wiklander
470c81fcd6SJens Wiklander// int setjmp (jmp_buf)
480c81fcd6SJens Wiklander	.global	setjmp
490c81fcd6SJens Wiklander	.type	setjmp, %function
500c81fcd6SJens Wiklandersetjmp:
51*7ad2713dSRuchika GuptaBTI(	bti	c)
520c81fcd6SJens Wiklander	mov	x16, sp
530c81fcd6SJens Wiklander#define REG_PAIR(REG1, REG2, OFFS)	stp REG1, REG2, [x0, OFFS]
540c81fcd6SJens Wiklander#define REG_ONE(REG1, OFFS)		str REG1, [x0, OFFS]
550c81fcd6SJens Wiklander	GPR_LAYOUT
560c81fcd6SJens Wiklander	FPR_LAYOUT
57099918f6SSumit Garg#ifdef CFG_FTRACE_SUPPORT
589d6ac097SSumit Garg	stp	x29, x30, [sp, #-16]!
599d6ac097SSumit Garg	mov	x29, sp
609d6ac097SSumit Garg	add	x0, x0, #104
619d6ac097SSumit Garg	bl	ftrace_setjmp
629d6ac097SSumit Garg	ldp	x29, x30, [sp], #16
639d6ac097SSumit Garg#endif
640c81fcd6SJens Wiklander#undef REG_PAIR
650c81fcd6SJens Wiklander#undef REG_ONE
660c81fcd6SJens Wiklander	mov	w0, #0
670c81fcd6SJens Wiklander	ret
680c81fcd6SJens Wiklander	.size	setjmp, .-setjmp
690c81fcd6SJens Wiklander
700c81fcd6SJens Wiklander// void longjmp (jmp_buf, int) __attribute__ ((noreturn))
710c81fcd6SJens Wiklander	.global	longjmp
720c81fcd6SJens Wiklander	.type	longjmp, %function
730c81fcd6SJens Wiklanderlongjmp:
74*7ad2713dSRuchika GuptaBTI(	bti	c)
750c81fcd6SJens Wiklander#define REG_PAIR(REG1, REG2, OFFS)	ldp REG1, REG2, [x0, OFFS]
760c81fcd6SJens Wiklander#define REG_ONE(REG1, OFFS)		ldr REG1, [x0, OFFS]
77099918f6SSumit Garg#ifdef CFG_FTRACE_SUPPORT
789d6ac097SSumit Garg	stp	x0, x1, [sp, #-16]!
799d6ac097SSumit Garg	stp	x29, x30, [sp, #-16]!
809d6ac097SSumit Garg	mov	x29, sp
819d6ac097SSumit Garg	add	x0, x0, #104
829d6ac097SSumit Garg	bl	ftrace_longjmp
839d6ac097SSumit Garg	ldp	x29, x30, [sp], #16
849d6ac097SSumit Garg	ldp	x0, x1, [sp], #16
859d6ac097SSumit Garg#endif
860c81fcd6SJens Wiklander	GPR_LAYOUT
870c81fcd6SJens Wiklander	FPR_LAYOUT
880c81fcd6SJens Wiklander#undef REG_PAIR
890c81fcd6SJens Wiklander#undef REG_ONE
900c81fcd6SJens Wiklander	mov	sp, x16
910c81fcd6SJens Wiklander	cmp	w1, #0
920c81fcd6SJens Wiklander	cinc	w0, w1, eq
930c81fcd6SJens Wiklander	// use br not ret, as ret is guaranteed to mispredict
940c81fcd6SJens Wiklander	br	x30
950c81fcd6SJens Wiklander	.size	longjmp, .-longjmp
96