xref: /freebsd/sys/contrib/openzfs/module/lua/setjmp/setjmp_x86_64.S (revision b197d4b893974c9eb4d7b38704c6d5c486235d6f)
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or https://opensource.org/licenses/CDDL-1.0.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 * Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
24 */
25
26
27#define	ENTRY(x) \
28	.text; \
29	.align	8; \
30	.globl	x; \
31	.type	x, @function; \
32x:
33
34#define	SET_SIZE(x) \
35	.size	x, [.-x]
36
37
38#if defined(__linux__) && defined(CONFIG_SLS)
39#define	RET	ret; int3
40#else
41#define	RET	ret
42#endif
43
44/*
45 * Setjmp and longjmp implement non-local gotos using state vectors
46 * type label_t.
47 */
48#ifdef __x86_64__
49
50	ENTRY(setjmp)
51	movq	%rsp, 0(%rdi)
52	movq	%rbp, 8(%rdi)
53	movq	%rbx, 16(%rdi)
54	movq	%r12, 24(%rdi)
55	movq	%r13, 32(%rdi)
56	movq	%r14, 40(%rdi)
57	movq	%r15, 48(%rdi)
58	movq	0(%rsp), %rdx		/* return address */
59	movq	%rdx, 56(%rdi)		/* rip */
60	xorl	%eax, %eax		/* return 0 */
61	RET
62	SET_SIZE(setjmp)
63
64	ENTRY(longjmp)
65	movq	0(%rdi), %rsp
66	movq	8(%rdi), %rbp
67	movq	16(%rdi), %rbx
68	movq	24(%rdi), %r12
69	movq	32(%rdi), %r13
70	movq	40(%rdi), %r14
71	movq	48(%rdi), %r15
72	movq	56(%rdi), %rdx		/* return address */
73	movq	%rdx, 0(%rsp)
74	xorl	%eax, %eax
75	incl	%eax			/* return 1 */
76	RET
77	SET_SIZE(longjmp)
78
79#ifdef __ELF__
80.section .note.GNU-stack,"",%progbits
81#endif
82
83#endif /* __x86_64__ */
84