xref: /illumos-gate/usr/src/lib/libc/amd64/unwind/unwind_frame.S (revision 55fea89dcaa64928bed4327112404dcb3e07b79f)
1*5d9d9091SRichard Lowe/*
2*5d9d9091SRichard Lowe * CDDL HEADER START
3*5d9d9091SRichard Lowe *
4*5d9d9091SRichard Lowe * The contents of this file are subject to the terms of the
5*5d9d9091SRichard Lowe * Common Development and Distribution License (the "License").
6*5d9d9091SRichard Lowe * You may not use this file except in compliance with the License.
7*5d9d9091SRichard Lowe *
8*5d9d9091SRichard Lowe * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*5d9d9091SRichard Lowe * or http://www.opensolaris.org/os/licensing.
10*5d9d9091SRichard Lowe * See the License for the specific language governing permissions
11*5d9d9091SRichard Lowe * and limitations under the License.
12*5d9d9091SRichard Lowe *
13*5d9d9091SRichard Lowe * When distributing Covered Code, include this CDDL HEADER in each
14*5d9d9091SRichard Lowe * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*5d9d9091SRichard Lowe * If applicable, add the following below this CDDL HEADER, with the
16*5d9d9091SRichard Lowe * fields enclosed by brackets "[]" replaced with your own identifying
17*5d9d9091SRichard Lowe * information: Portions Copyright [yyyy] [name of copyright owner]
18*5d9d9091SRichard Lowe *
19*5d9d9091SRichard Lowe * CDDL HEADER END
20*5d9d9091SRichard Lowe */
21*5d9d9091SRichard Lowe/*
22*5d9d9091SRichard Lowe * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
23*5d9d9091SRichard Lowe * Use is subject to license terms.
24*5d9d9091SRichard Lowe */
25*5d9d9091SRichard Lowe
26*5d9d9091SRichard Lowe	.file	"unwind_frame.s"
27*5d9d9091SRichard Lowe
28*5d9d9091SRichard Lowe#ifdef _LIBCRUN_
29*5d9d9091SRichard Lowe#define ENTRY(x) \
30*5d9d9091SRichard Lowe        .text; \
31*5d9d9091SRichard Lowe        .align  8; \
32*5d9d9091SRichard Lowe        .globl  x; \
33*5d9d9091SRichard Lowe        .type   x, @function; \
34*5d9d9091SRichard Lowe	x:
35*5d9d9091SRichard Lowe#define SET_SIZE(x) \
36*5d9d9091SRichard Lowe        .size   x, .-x
37*5d9d9091SRichard Lowe#else
38*5d9d9091SRichard Lowe#include "SYS.h"
39*5d9d9091SRichard Lowe#endif
40*5d9d9091SRichard Lowe
41*5d9d9091SRichard Lowe/*
42*5d9d9091SRichard Lowe * ====================
43*5d9d9091SRichard Lowe * _Unw_capture_regs()
44*5d9d9091SRichard Lowe * --------------------
45*5d9d9091SRichard Lowe *
46*5d9d9091SRichard Lowe *	Given  foo()->ex_throw()->_Unwind_RaiseException()->_Unw_capture_regs()
47*5d9d9091SRichard Lowe *	fills in a register array with FP and the preserved registers
48*5d9d9091SRichard Lowe */
49*5d9d9091SRichard Lowe	ENTRY(_Unw_capture_regs)
50*5d9d9091SRichard Lowe	movq	%rbx,24(%rdi)		/* save preserved registers */
51*5d9d9091SRichard Lowe	movq	%rbp,48(%rdi)
52*5d9d9091SRichard Lowe	movq	%r12,96(%rdi)
53*5d9d9091SRichard Lowe	movq	%r13,104(%rdi)
54*5d9d9091SRichard Lowe	movq	%r14,112(%rdi)
55*5d9d9091SRichard Lowe	movq	%r15,120(%rdi)
56*5d9d9091SRichard Lowe	ret
57*5d9d9091SRichard Lowe	SET_SIZE(_Unw_capture_regs)
58*5d9d9091SRichard Lowe
59*5d9d9091SRichard Lowe/*
60*5d9d9091SRichard Lowe * ====================
61*5d9d9091SRichard Lowe * _Unw_jmp
62*5d9d9091SRichard Lowe * --------------------
63*5d9d9091SRichard Lowe *
64*5d9d9091SRichard Lowe * _Unw_jmp is passed a pc and an array of register values.
65*5d9d9091SRichard Lowe */
66*5d9d9091SRichard Lowe
67*5d9d9091SRichard Lowe	ENTRY(_Unw_jmp)
68*5d9d9091SRichard Lowe	movq	%rdi,%r8		/* save arguments to this func */
69*5d9d9091SRichard Lowe	movq	%rsi,%rax
70*5d9d9091SRichard Lowe	movq	40(%rax),%rdi		/* set handler parameters */
71*5d9d9091SRichard Lowe	movq	32(%rax),%rsi
72*5d9d9091SRichard Lowe	movq	8(%rax),%rdx
73*5d9d9091SRichard Lowe	movq	16(%rax),%rcx
74*5d9d9091SRichard Lowe	movq	24(%rax),%rbx		/* restore preserved registers */
75*5d9d9091SRichard Lowe	movq	96(%rax),%r12
76*5d9d9091SRichard Lowe	movq	104(%rax),%r13
77*5d9d9091SRichard Lowe	movq	112(%rax),%r14
78*5d9d9091SRichard Lowe	movq	120(%rax),%r15
79*5d9d9091SRichard Lowe	movq	48(%rax),%rbp
80*5d9d9091SRichard Lowe	movq	56(%rax),%rsp
81*5d9d9091SRichard Lowe	movq	(%rax),%rax
82*5d9d9091SRichard Lowe	jmp	*%r8			/* branch to handler */
83*5d9d9091SRichard Lowe	SET_SIZE(_Unw_jmp)
84