xref: /freebsd/stand/libsa/amd64/_setjmp.S (revision 6e28a6bc2e83d56a5d2d5ee4f5da72d798de2d07)
1ca987d46SWarner Losh/*-
2ca987d46SWarner Losh * Copyright (c) 1990 The Regents of the University of California.
3ca987d46SWarner Losh * All rights reserved.
4ca987d46SWarner Losh *
5ca987d46SWarner Losh * This code is derived from software contributed to Berkeley by
6ca987d46SWarner Losh * William Jolitz.
7ca987d46SWarner Losh *
8ca987d46SWarner Losh * Redistribution and use in source and binary forms, with or without
9ca987d46SWarner Losh * modification, are permitted provided that the following conditions
10ca987d46SWarner Losh * are met:
11ca987d46SWarner Losh * 1. Redistributions of source code must retain the above copyright
12ca987d46SWarner Losh *    notice, this list of conditions and the following disclaimer.
13ca987d46SWarner Losh * 2. Redistributions in binary form must reproduce the above copyright
14ca987d46SWarner Losh *    notice, this list of conditions and the following disclaimer in the
15ca987d46SWarner Losh *    documentation and/or other materials provided with the distribution.
16ca987d46SWarner Losh * 3. Neither the name of the University nor the names of its contributors
17ca987d46SWarner Losh *    may be used to endorse or promote products derived from this software
18ca987d46SWarner Losh *    without specific prior written permission.
19ca987d46SWarner Losh *
20ca987d46SWarner Losh * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21ca987d46SWarner Losh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22ca987d46SWarner Losh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23ca987d46SWarner Losh * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24ca987d46SWarner Losh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25ca987d46SWarner Losh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26ca987d46SWarner Losh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27ca987d46SWarner Losh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28ca987d46SWarner Losh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29ca987d46SWarner Losh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30ca987d46SWarner Losh * SUCH DAMAGE.
31ca987d46SWarner Losh */
32ca987d46SWarner Losh
33ca987d46SWarner Losh#include <machine/asm.h>
34ca987d46SWarner Losh/*
35ca987d46SWarner Losh * C library -- _setjmp, _longjmp
36ca987d46SWarner Losh *
37ca987d46SWarner Losh *	_longjmp(a,v)
38ca987d46SWarner Losh * will generate a "return(v)" from the last call to
39ca987d46SWarner Losh *	_setjmp(a)
40ca987d46SWarner Losh * by restoring registers from the environment 'a'.
41ca987d46SWarner Losh * The previous signal state is NOT restored.
42ca987d46SWarner Losh */
43ca987d46SWarner Losh
44ca987d46SWarner LoshENTRY(_setjmp)
45ca987d46SWarner Losh	movq	%rdi,%rax
46ca987d46SWarner Losh	movq	0(%rsp),%rdx		/* retval */
47ca987d46SWarner Losh	movq	%rdx, 0(%rax)		/* 0; retval */
48ca987d46SWarner Losh	movq	%rbx, 8(%rax)		/* 1; rbx */
49ca987d46SWarner Losh	movq	%rsp,16(%rax)		/* 2; rsp */
50ca987d46SWarner Losh	movq	%rbp,24(%rax)		/* 3; rbp */
51ca987d46SWarner Losh	movq	%r12,32(%rax)		/* 4; r12 */
52ca987d46SWarner Losh	movq	%r13,40(%rax)		/* 5; r13 */
53ca987d46SWarner Losh	movq	%r14,48(%rax)		/* 6; r14 */
54ca987d46SWarner Losh	movq	%r15,56(%rax)		/* 7; r15 */
55ca987d46SWarner Losh	fnstcw	64(%rax)		/* 8; fpu cw */
56ca987d46SWarner Losh	stmxcsr	68(%rax)		/*    and mxcsr */
57ca987d46SWarner Losh	xorq	%rax,%rax
58ca987d46SWarner Losh	ret
59ca987d46SWarner LoshEND(_setjmp)
60ca987d46SWarner Losh
61ca987d46SWarner LoshENTRY(_longjmp)
62ca987d46SWarner Losh	movq	%rdi,%rdx
63ca987d46SWarner Losh	/* Restore the mxcsr, but leave exception flags intact. */
64ca987d46SWarner Losh	stmxcsr	-4(%rsp)
65ca987d46SWarner Losh	movl	68(%rdx),%eax
66ca987d46SWarner Losh	andl	$0xffffffc0,%eax
67ca987d46SWarner Losh	movl	-4(%rsp),%edi
68ca987d46SWarner Losh	andl	$0x3f,%edi
69ca987d46SWarner Losh	xorl	%eax,%edi
70ca987d46SWarner Losh	movl	%edi,-4(%rsp)
71ca987d46SWarner Losh	ldmxcsr -4(%rsp)
72ca987d46SWarner Losh	movq	%rsi,%rax		/* retval */
73ca987d46SWarner Losh	movq	0(%rdx),%rcx
74ca987d46SWarner Losh	movq	8(%rdx),%rbx
75ca987d46SWarner Losh	movq	16(%rdx),%rsp
76ca987d46SWarner Losh	movq	24(%rdx),%rbp
77ca987d46SWarner Losh	movq	32(%rdx),%r12
78ca987d46SWarner Losh	movq	40(%rdx),%r13
79ca987d46SWarner Losh	movq	48(%rdx),%r14
80ca987d46SWarner Losh	movq	56(%rdx),%r15
81ca987d46SWarner Losh	fldcw	64(%rdx)
82ca987d46SWarner Losh	testq	%rax,%rax
83ca987d46SWarner Losh	jnz	1f
84ca987d46SWarner Losh	incq	%rax
85ca987d46SWarner Losh1:	movq	%rcx,0(%rsp)
86ca987d46SWarner Losh	ret
87ca987d46SWarner LoshEND(_longjmp)
88*69f6399cSJohn Baldwin
89*69f6399cSJohn Baldwin	.section .note.GNU-stack,"",%progbits
90