xref: /freebsd/sys/contrib/openzfs/module/lua/setjmp/setjmp_aarch64.S (revision 61145dc2b94f12f6a47344fb9aac702321880e43)
1// SPDX-License-Identifier: BSD-2-Clause
2/*-
3 * Copyright (c) 2014 Andrew Turner
4 * Copyright (c) 2014-2015 The FreeBSD Foundation
5 * All rights reserved.
6 *
7 * Portions of this software were developed by Andrew Turner
8 * under sponsorship from the FreeBSD Foundation
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 *
31 */
32
33
34#ifdef __aarch64__
35
36#define	ENTRY(sym) \
37	.text; \
38	.globl	sym; \
39	.balign	2; \
40	.type	sym,#function; \
41sym:
42
43#define	END(sym) \
44	.size	sym, . - sym
45
46
47ENTRY(setjmp)
48	/* Store the stack pointer */
49	mov	x8, sp
50	str	x8, [x0], #8
51
52	/* Store the general purpose registers and lr */
53	stp	x19, x20, [x0], #16
54	stp	x21, x22, [x0], #16
55	stp	x23, x24, [x0], #16
56	stp	x25, x26, [x0], #16
57	stp	x27, x28, [x0], #16
58	stp	x29, x30, [x0], #16
59
60	/* Return value */
61	mov	x0, #0
62	ret
63END(setjmp)
64
65ENTRY(longjmp)
66	/* Restore the stack pointer */
67	ldr	x8, [x0], #8
68	mov	sp, x8
69
70	/* Restore the general purpose registers and lr */
71	ldp	x19, x20, [x0], #16
72	ldp	x21, x22, [x0], #16
73	ldp	x23, x24, [x0], #16
74	ldp	x25, x26, [x0], #16
75	ldp	x27, x28, [x0], #16
76	ldp	x29, x30, [x0], #16
77
78	/* Load the return value */
79	mov	x0, x1
80	ret
81END(longjmp)
82
83#ifdef __ELF__
84.section .note.GNU-stack,"",%progbits
85#endif
86
87#endif /* __aarch64__ */
88