/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
.file "unwind_frame.s"
#ifdef _LIBCRUN_
#define ENTRY(x) \
.text; \
.align 8; \
.globl x; \
.type x, @function; \
x:
#define SET_SIZE(x) \
.size x, .-x
#else
#include "SYS.h"
#endif
/*
* ====================
* _Unw_capture_regs()
* --------------------
*
* Given foo()->ex_throw()->_Unwind_RaiseException()->_Unw_capture_regs()
* fills in a register array with FP and the preserved registers
*/
ENTRY(_Unw_capture_regs)
movq %rbx,24(%rdi) /* save preserved registers */
movq %rbp,48(%rdi)
movq %r12,96(%rdi)
movq %r13,104(%rdi)
movq %r14,112(%rdi)
movq %r15,120(%rdi)
ret
SET_SIZE(_Unw_capture_regs)
/*
* ====================
* _Unw_jmp
* --------------------
*
* _Unw_jmp is passed a pc and an array of register values.
*/
ENTRY(_Unw_jmp)
movq %rdi,%r8 /* save arguments to this func */
movq %rsi,%rax
movq 40(%rax),%rdi /* set handler parameters */
movq 32(%rax),%rsi
movq 8(%rax),%rdx
movq 16(%rax),%rcx
movq 24(%rax),%rbx /* restore preserved registers */
movq 96(%rax),%r12
movq 104(%rax),%r13
movq 112(%rax),%r14
movq 120(%rax),%r15
movq 48(%rax),%rbp
movq 56(%rax),%rsp
movq (%rax),%rax
jmp *%r8 /* branch to handler */
SET_SIZE(_Unw_jmp)