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