xref: /freebsd/sys/contrib/openzfs/module/lua/setjmp/setjmp_x86_64.S (revision c07d6445eb89d9dd3950361b065b7bd110e3a043)
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#if defined(_KERNEL) && defined(__linux__)
27#include <linux/linkage.h>
28#endif
29
30#ifndef RET
31#define	RET	ret
32#endif
33
34#undef ENTRY
35#define	ENTRY(x) \
36	.text; \
37	.align	8; \
38	.globl	x; \
39	.type	x, @function; \
40x:
41
42#define	SET_SIZE(x) \
43	.size	x, [.-x]
44
45/*
46 * Setjmp and longjmp implement non-local gotos using state vectors
47 * type label_t.
48 */
49#ifdef __x86_64__
50
51	ENTRY(setjmp)
52	movq	%rsp, 0(%rdi)
53	movq	%rbp, 8(%rdi)
54	movq	%rbx, 16(%rdi)
55	movq	%r12, 24(%rdi)
56	movq	%r13, 32(%rdi)
57	movq	%r14, 40(%rdi)
58	movq	%r15, 48(%rdi)
59	movq	0(%rsp), %rdx		/* return address */
60	movq	%rdx, 56(%rdi)		/* rip */
61	xorl	%eax, %eax		/* return 0 */
62	RET
63	SET_SIZE(setjmp)
64
65	ENTRY(longjmp)
66	movq	0(%rdi), %rsp
67	movq	8(%rdi), %rbp
68	movq	16(%rdi), %rbx
69	movq	24(%rdi), %r12
70	movq	32(%rdi), %r13
71	movq	40(%rdi), %r14
72	movq	48(%rdi), %r15
73	movq	56(%rdi), %rdx		/* return address */
74	movq	%rdx, 0(%rsp)
75	xorl	%eax, %eax
76	incl	%eax			/* return 1 */
77	RET
78	SET_SIZE(longjmp)
79
80#ifdef __ELF__
81.section .note.GNU-stack,"",%progbits
82#endif
83
84#endif /* __x86_64__ */
85