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