199767f8919635c4928607450d9e0abb932109ceToomas Soome/*-
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Copyright (c) 1990 The Regents of the University of California.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * All rights reserved.
199767f8919635c4928607450d9e0abb932109ceToomas Soome *
199767f8919635c4928607450d9e0abb932109ceToomas Soome * This code is derived from software contributed to Berkeley by
199767f8919635c4928607450d9e0abb932109ceToomas Soome * William Jolitz.
199767f8919635c4928607450d9e0abb932109ceToomas Soome *
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Redistribution and use in source and binary forms, with or without
199767f8919635c4928607450d9e0abb932109ceToomas Soome * modification, are permitted provided that the following conditions
199767f8919635c4928607450d9e0abb932109ceToomas Soome * are met:
199767f8919635c4928607450d9e0abb932109ceToomas Soome * 1. Redistributions of source code must retain the above copyright
199767f8919635c4928607450d9e0abb932109ceToomas Soome * notice, this list of conditions and the following disclaimer.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * 2. Redistributions in binary form must reproduce the above copyright
199767f8919635c4928607450d9e0abb932109ceToomas Soome * notice, this list of conditions and the following disclaimer in the
199767f8919635c4928607450d9e0abb932109ceToomas Soome * documentation and/or other materials provided with the distribution.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * 4. Neither the name of the University nor the names of its contributors
199767f8919635c4928607450d9e0abb932109ceToomas Soome * may be used to endorse or promote products derived from this software
199767f8919635c4928607450d9e0abb932109ceToomas Soome * without specific prior written permission.
199767f8919635c4928607450d9e0abb932109ceToomas Soome *
199767f8919635c4928607450d9e0abb932109ceToomas Soome * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
199767f8919635c4928607450d9e0abb932109ceToomas Soome * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
199767f8919635c4928607450d9e0abb932109ceToomas Soome * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
199767f8919635c4928607450d9e0abb932109ceToomas Soome * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
199767f8919635c4928607450d9e0abb932109ceToomas Soome * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
199767f8919635c4928607450d9e0abb932109ceToomas Soome * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
199767f8919635c4928607450d9e0abb932109ceToomas Soome * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
199767f8919635c4928607450d9e0abb932109ceToomas Soome * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
199767f8919635c4928607450d9e0abb932109ceToomas Soome * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
199767f8919635c4928607450d9e0abb932109ceToomas Soome * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
199767f8919635c4928607450d9e0abb932109ceToomas Soome * SUCH DAMAGE.
199767f8919635c4928607450d9e0abb932109ceToomas Soome */
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome#if defined(LIBC_SCCS) && !defined(lint)
199767f8919635c4928607450d9e0abb932109ceToomas Soome .asciz "@(#)_setjmp.s 5.1 (Berkeley) 4/23/90"
199767f8919635c4928607450d9e0abb932109ceToomas Soome#endif /* LIBC_SCCS and not lint */
199767f8919635c4928607450d9e0abb932109ceToomas Soome#include <machine/asm.h>
199767f8919635c4928607450d9e0abb932109ceToomas Soome__FBSDID("$FreeBSD$");
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome/*
199767f8919635c4928607450d9e0abb932109ceToomas Soome * C library -- _setjmp, _longjmp
199767f8919635c4928607450d9e0abb932109ceToomas Soome *
199767f8919635c4928607450d9e0abb932109ceToomas Soome * _longjmp(a,v)
199767f8919635c4928607450d9e0abb932109ceToomas Soome * will generate a "return(v)" from the last call to
199767f8919635c4928607450d9e0abb932109ceToomas Soome * _setjmp(a)
199767f8919635c4928607450d9e0abb932109ceToomas Soome * by restoring registers from the environment 'a'.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * The previous signal state is NOT restored.
199767f8919635c4928607450d9e0abb932109ceToomas Soome */
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas SoomeENTRY(_setjmp)
199767f8919635c4928607450d9e0abb932109ceToomas Soome movq %rdi,%rax
199767f8919635c4928607450d9e0abb932109ceToomas Soome movq 0(%rsp),%rdx /* retval */
199767f8919635c4928607450d9e0abb932109ceToomas Soome movq %rdx, 0(%rax) /* 0; retval */
199767f8919635c4928607450d9e0abb932109ceToomas Soome movq %rbx, 8(%rax) /* 1; rbx */
199767f8919635c4928607450d9e0abb932109ceToomas Soome movq %rsp,16(%rax) /* 2; rsp */
199767f8919635c4928607450d9e0abb932109ceToomas Soome movq %rbp,24(%rax) /* 3; rbp */
199767f8919635c4928607450d9e0abb932109ceToomas Soome movq %r12,32(%rax) /* 4; r12 */
199767f8919635c4928607450d9e0abb932109ceToomas Soome movq %r13,40(%rax) /* 5; r13 */
199767f8919635c4928607450d9e0abb932109ceToomas Soome movq %r14,48(%rax) /* 6; r14 */
199767f8919635c4928607450d9e0abb932109ceToomas Soome movq %r15,56(%rax) /* 7; r15 */
199767f8919635c4928607450d9e0abb932109ceToomas Soome fnstcw 64(%rax) /* 8; fpu cw */
199767f8919635c4928607450d9e0abb932109ceToomas Soome stmxcsr 68(%rax) /* and mxcsr */
199767f8919635c4928607450d9e0abb932109ceToomas Soome xorq %rax,%rax
199767f8919635c4928607450d9e0abb932109ceToomas Soome ret
199767f8919635c4928607450d9e0abb932109ceToomas SoomeEND(_setjmp)
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome .weak CNAME(_longjmp)
199767f8919635c4928607450d9e0abb932109ceToomas SoomeENTRY(_longjmp)
199767f8919635c4928607450d9e0abb932109ceToomas Soome movq %rdi,%rdx
199767f8919635c4928607450d9e0abb932109ceToomas Soome /* Restore the mxcsr, but leave exception flags intact. */
199767f8919635c4928607450d9e0abb932109ceToomas Soome stmxcsr -4(%rsp)
199767f8919635c4928607450d9e0abb932109ceToomas Soome movl 68(%rdx),%eax
199767f8919635c4928607450d9e0abb932109ceToomas Soome andl $0xffffffc0,%eax
199767f8919635c4928607450d9e0abb932109ceToomas Soome movl -4(%rsp),%edi
199767f8919635c4928607450d9e0abb932109ceToomas Soome andl $0x3f,%edi
199767f8919635c4928607450d9e0abb932109ceToomas Soome xorl %eax,%edi
199767f8919635c4928607450d9e0abb932109ceToomas Soome movl %edi,-4(%rsp)
199767f8919635c4928607450d9e0abb932109ceToomas Soome ldmxcsr -4(%rsp)
199767f8919635c4928607450d9e0abb932109ceToomas Soome movq %rsi,%rax /* retval */
199767f8919635c4928607450d9e0abb932109ceToomas Soome movq 0(%rdx),%rcx
199767f8919635c4928607450d9e0abb932109ceToomas Soome movq 8(%rdx),%rbx
199767f8919635c4928607450d9e0abb932109ceToomas Soome movq 16(%rdx),%rsp
199767f8919635c4928607450d9e0abb932109ceToomas Soome movq 24(%rdx),%rbp
199767f8919635c4928607450d9e0abb932109ceToomas Soome movq 32(%rdx),%r12
199767f8919635c4928607450d9e0abb932109ceToomas Soome movq 40(%rdx),%r13
199767f8919635c4928607450d9e0abb932109ceToomas Soome movq 48(%rdx),%r14
199767f8919635c4928607450d9e0abb932109ceToomas Soome movq 56(%rdx),%r15
199767f8919635c4928607450d9e0abb932109ceToomas Soome fldcw 64(%rdx)
199767f8919635c4928607450d9e0abb932109ceToomas Soome testq %rax,%rax
199767f8919635c4928607450d9e0abb932109ceToomas Soome jnz 1f
199767f8919635c4928607450d9e0abb932109ceToomas Soome incq %rax
199767f8919635c4928607450d9e0abb932109ceToomas Soome1: movq %rcx,0(%rsp)
199767f8919635c4928607450d9e0abb932109ceToomas Soome ret
199767f8919635c4928607450d9e0abb932109ceToomas SoomeEND(_longjmp)