xref: /rk3399_ARM-atf/lib/libc/aarch64/setjmp.S (revision 4c700c1563aff7b51df95f17e952e050b9b4e37f)
170b0f278SAntonio Nino Diaz/*
2*4c700c15SGovindraj Raja * Copyright (c) 2018-2019, Arm Limited and Contributors. All rights reserved.
370b0f278SAntonio Nino Diaz *
470b0f278SAntonio Nino Diaz * SPDX-License-Identifier: BSD-3-Clause
570b0f278SAntonio Nino Diaz */
670b0f278SAntonio Nino Diaz
770b0f278SAntonio Nino Diaz#include <asm_macros.S>
870b0f278SAntonio Nino Diaz#include <assert_macros.S>
970b0f278SAntonio Nino Diaz#include <setjmp.h>
1070b0f278SAntonio Nino Diaz
1170b0f278SAntonio Nino Diaz	.globl	setjmp
1270b0f278SAntonio Nino Diaz	.globl	longjmp
1370b0f278SAntonio Nino Diaz
1470b0f278SAntonio Nino Diaz/*
1570b0f278SAntonio Nino Diaz * int setjmp(jmp_buf env);
1670b0f278SAntonio Nino Diaz */
1770b0f278SAntonio Nino Diazfunc setjmp
1870b0f278SAntonio Nino Diaz	mov	x7, sp
1970b0f278SAntonio Nino Diaz
2070b0f278SAntonio Nino Diaz	stp	x19, x20, [x0, #JMP_CTX_X19]
2170b0f278SAntonio Nino Diaz	stp	x21, x22, [x0, #JMP_CTX_X21]
2270b0f278SAntonio Nino Diaz	stp	x23, x24, [x0, #JMP_CTX_X23]
2370b0f278SAntonio Nino Diaz	stp	x25, x26, [x0, #JMP_CTX_X25]
2470b0f278SAntonio Nino Diaz	stp	x27, x28, [x0, #JMP_CTX_X27]
2570b0f278SAntonio Nino Diaz	stp	x29, x30, [x0, #JMP_CTX_X29]
2670b0f278SAntonio Nino Diaz	stp	x7, xzr, [x0, #JMP_CTX_SP]
2770b0f278SAntonio Nino Diaz
2870b0f278SAntonio Nino Diaz	mov	x0, #0
2970b0f278SAntonio Nino Diaz	ret
3070b0f278SAntonio Nino Diazendfunc setjmp
3170b0f278SAntonio Nino Diaz
3270b0f278SAntonio Nino Diaz
3370b0f278SAntonio Nino Diaz/*
3470b0f278SAntonio Nino Diaz * void longjmp(jmp_buf env, int val);
3570b0f278SAntonio Nino Diaz */
3670b0f278SAntonio Nino Diazfunc longjmp
3770b0f278SAntonio Nino Diaz	ldp	x7, xzr, [x0, #JMP_CTX_SP]
3870b0f278SAntonio Nino Diaz
3970b0f278SAntonio Nino Diaz#if ENABLE_ASSERTIONS
4070b0f278SAntonio Nino Diaz	/*
4170b0f278SAntonio Nino Diaz	 * Since we're unwinding the stack, assert that the stack being reset to
4270b0f278SAntonio Nino Diaz	 * is shallower.
4370b0f278SAntonio Nino Diaz	 */
4470b0f278SAntonio Nino Diaz	mov	x19, sp
4570b0f278SAntonio Nino Diaz	cmp	x7, x19
4670b0f278SAntonio Nino Diaz	ASM_ASSERT(ge)
4770b0f278SAntonio Nino Diaz#endif
4870b0f278SAntonio Nino Diaz
4970b0f278SAntonio Nino Diaz	ldp	x19, x20, [x0, #JMP_CTX_X19]
5070b0f278SAntonio Nino Diaz	ldp	x21, x22, [x0, #JMP_CTX_X21]
5170b0f278SAntonio Nino Diaz	ldp	x23, x24, [x0, #JMP_CTX_X23]
5270b0f278SAntonio Nino Diaz	ldp	x25, x26, [x0, #JMP_CTX_X25]
5370b0f278SAntonio Nino Diaz	ldp	x27, x28, [x0, #JMP_CTX_X27]
5470b0f278SAntonio Nino Diaz	ldp	x29, x30, [x0, #JMP_CTX_X29]
5570b0f278SAntonio Nino Diaz
5670b0f278SAntonio Nino Diaz	mov	sp, x7
5770b0f278SAntonio Nino Diaz
5870b0f278SAntonio Nino Diaz	ands	x0, x1, x1 /* Move val to x0 and set flags */
5970b0f278SAntonio Nino Diaz	cinc	x0, x0, eq /* If val is 0, return 1 */
6070b0f278SAntonio Nino Diaz	ret
6170b0f278SAntonio Nino Diazendfunc longjmp
62