xref: /arm-trusted-firmware/lib/libc/aarch64/setjmp.S (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu/*
2*91f16700Schasinglulu * Copyright (c) 2018-2019, Arm Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu *
4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu */
6*91f16700Schasinglulu
7*91f16700Schasinglulu#include <asm_macros.S>
8*91f16700Schasinglulu#include <assert_macros.S>
9*91f16700Schasinglulu#include <setjmp.h>
10*91f16700Schasinglulu
11*91f16700Schasinglulu	.globl	setjmp
12*91f16700Schasinglulu	.globl	longjmp
13*91f16700Schasinglulu
14*91f16700Schasinglulu/*
15*91f16700Schasinglulu * int setjmp(jmp_buf env);
16*91f16700Schasinglulu */
17*91f16700Schasinglulufunc setjmp
18*91f16700Schasinglulu	mov	x7, sp
19*91f16700Schasinglulu
20*91f16700Schasinglulu	stp	x19, x20, [x0, #JMP_CTX_X19]
21*91f16700Schasinglulu	stp	x21, x22, [x0, #JMP_CTX_X21]
22*91f16700Schasinglulu	stp	x23, x24, [x0, #JMP_CTX_X23]
23*91f16700Schasinglulu	stp	x25, x26, [x0, #JMP_CTX_X25]
24*91f16700Schasinglulu	stp	x27, x28, [x0, #JMP_CTX_X27]
25*91f16700Schasinglulu	stp	x29, x30, [x0, #JMP_CTX_X29]
26*91f16700Schasinglulu	stp	x7, xzr, [x0, #JMP_CTX_SP]
27*91f16700Schasinglulu
28*91f16700Schasinglulu	mov	x0, #0
29*91f16700Schasinglulu	ret
30*91f16700Schasingluluendfunc setjmp
31*91f16700Schasinglulu
32*91f16700Schasinglulu
33*91f16700Schasinglulu/*
34*91f16700Schasinglulu * void longjmp(jmp_buf env, int val);
35*91f16700Schasinglulu */
36*91f16700Schasinglulufunc longjmp
37*91f16700Schasinglulu	ldp	x7, xzr, [x0, #JMP_CTX_SP]
38*91f16700Schasinglulu
39*91f16700Schasinglulu#if ENABLE_ASSERTIONS
40*91f16700Schasinglulu	/*
41*91f16700Schasinglulu	 * Since we're unwinding the stack, assert that the stack being reset to
42*91f16700Schasinglulu	 * is shallower.
43*91f16700Schasinglulu	 */
44*91f16700Schasinglulu	mov	x19, sp
45*91f16700Schasinglulu	cmp	x7, x19
46*91f16700Schasinglulu	ASM_ASSERT(ge)
47*91f16700Schasinglulu#endif
48*91f16700Schasinglulu
49*91f16700Schasinglulu	ldp	x19, x20, [x0, #JMP_CTX_X19]
50*91f16700Schasinglulu	ldp	x21, x22, [x0, #JMP_CTX_X21]
51*91f16700Schasinglulu	ldp	x23, x24, [x0, #JMP_CTX_X23]
52*91f16700Schasinglulu	ldp	x25, x26, [x0, #JMP_CTX_X25]
53*91f16700Schasinglulu	ldp	x27, x28, [x0, #JMP_CTX_X27]
54*91f16700Schasinglulu	ldp	x29, x30, [x0, #JMP_CTX_X29]
55*91f16700Schasinglulu
56*91f16700Schasinglulu	mov	sp, x7
57*91f16700Schasinglulu
58*91f16700Schasinglulu	ands	x0, x1, x1 /* Move val to x0 and set flags */
59*91f16700Schasinglulu	cinc	x0, x0, eq /* If val is 0, return 1 */
60*91f16700Schasinglulu	ret
61*91f16700Schasingluluendfunc longjmp
62