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