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