xref: /freebsd/sys/contrib/openzfs/module/lua/setjmp/setjmp_x86_64.S (revision c66ec88fed842fbaad62c30d510644ceb7bd2d71)
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 http://www.opensolaris.org/os/licensing.
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/*
39 * Setjmp and longjmp implement non-local gotos using state vectors
40 * type label_t.
41 */
42#ifdef __x86_64__
43
44	ENTRY(setjmp)
45	movq	%rsp, 0(%rdi)
46	movq	%rbp, 8(%rdi)
47	movq	%rbx, 16(%rdi)
48	movq	%r12, 24(%rdi)
49	movq	%r13, 32(%rdi)
50	movq	%r14, 40(%rdi)
51	movq	%r15, 48(%rdi)
52	movq	0(%rsp), %rdx		/* return address */
53	movq	%rdx, 56(%rdi)		/* rip */
54	xorl	%eax, %eax		/* return 0 */
55	ret
56	SET_SIZE(setjmp)
57
58	ENTRY(longjmp)
59	movq	0(%rdi), %rsp
60	movq	8(%rdi), %rbp
61	movq	16(%rdi), %rbx
62	movq	24(%rdi), %r12
63	movq	32(%rdi), %r13
64	movq	40(%rdi), %r14
65	movq	48(%rdi), %r15
66	movq	56(%rdi), %rdx		/* return address */
67	movq	%rdx, 0(%rsp)
68	xorl	%eax, %eax
69	incl	%eax			/* return 1 */
70	ret
71	SET_SIZE(longjmp)
72
73#ifdef __ELF__
74.section .note.GNU-stack,"",%progbits
75#endif
76
77#endif /* __x86_64__ */
78