xref: /titanic_52/usr/src/uts/i86pc/dboot/dboot_xen.s (revision 843e19887f64dde75055cf8842fc4db2171eff45)
1*843e1988Sjohnlev/*
2*843e1988Sjohnlev * CDDL HEADER START
3*843e1988Sjohnlev *
4*843e1988Sjohnlev * The contents of this file are subject to the terms of the
5*843e1988Sjohnlev * Common Development and Distribution License (the "License").
6*843e1988Sjohnlev * You may not use this file except in compliance with the License.
7*843e1988Sjohnlev *
8*843e1988Sjohnlev * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*843e1988Sjohnlev * or http://www.opensolaris.org/os/licensing.
10*843e1988Sjohnlev * See the License for the specific language governing permissions
11*843e1988Sjohnlev * and limitations under the License.
12*843e1988Sjohnlev *
13*843e1988Sjohnlev * When distributing Covered Code, include this CDDL HEADER in each
14*843e1988Sjohnlev * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*843e1988Sjohnlev * If applicable, add the following below this CDDL HEADER, with the
16*843e1988Sjohnlev * fields enclosed by brackets "[]" replaced with your own identifying
17*843e1988Sjohnlev * information: Portions Copyright [yyyy] [name of copyright owner]
18*843e1988Sjohnlev *
19*843e1988Sjohnlev * CDDL HEADER END
20*843e1988Sjohnlev */
21*843e1988Sjohnlev
22*843e1988Sjohnlev/*
23*843e1988Sjohnlev * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24*843e1988Sjohnlev * Use is subject to license terms.
25*843e1988Sjohnlev */
26*843e1988Sjohnlev
27*843e1988Sjohnlev#pragma ident	"%Z%%M%	%I%	%E% SMI"
28*843e1988Sjohnlev
29*843e1988Sjohnlev#include <sys/asm_linkage.h>
30*843e1988Sjohnlev#include <sys/asm_misc.h>
31*843e1988Sjohnlev#include "dboot_xboot.h"
32*843e1988Sjohnlev
33*843e1988Sjohnlev#if defined(__lint)
34*843e1988Sjohnlev
35*843e1988Sjohnlev#else /* __lint */
36*843e1988Sjohnlev
37*843e1988Sjohnlev#if defined(__amd64)
38*843e1988Sjohnlev
39*843e1988Sjohnlev	ENTRY_NP(_start)
40*843e1988Sjohnlev	/*
41*843e1988Sjohnlev	 * At entry we are passed a (start_info_t *) in %rsi.
42*843e1988Sjohnlev	 */
43*843e1988Sjohnlev	movq	%rsi, xen_info(%rip)
44*843e1988Sjohnlev
45*843e1988Sjohnlev	/*
46*843e1988Sjohnlev	 * make sure we have sane processor state
47*843e1988Sjohnlev	 */
48*843e1988Sjohnlev	xorw	%ax, %ax
49*843e1988Sjohnlev	movw	%ax, %fs
50*843e1988Sjohnlev	movw	%ax, %gs
51*843e1988Sjohnlev	pushq	$0
52*843e1988Sjohnlev	popfq
53*843e1988Sjohnlev	pushq	$0
54*843e1988Sjohnlev
55*843e1988Sjohnlev	/*
56*843e1988Sjohnlev	 * go off and unpack the kernel bits, adjust page tables, etc.
57*843e1988Sjohnlev	 */
58*843e1988Sjohnlev	call	startup_kernel
59*843e1988Sjohnlev
60*843e1988Sjohnlev	/*
61*843e1988Sjohnlev	 * we can only setup a stack after startup_kernel().
62*843e1988Sjohnlev	 * Its in the lower part of memroy.
63*843e1988Sjohnlev	 */
64*843e1988Sjohnlev	leaq	stack_space(%rip), %rsp
65*843e1988Sjohnlev	addq	$STACK_SIZE, %rsp
66*843e1988Sjohnlev	andl	$0xfffffff0, %esp
67*843e1988Sjohnlev
68*843e1988Sjohnlev	pushq	$0x0			/* push a dead-end frame */
69*843e1988Sjohnlev	pushq	$0x0
70*843e1988Sjohnlev	movq	%rsp, %rbp
71*843e1988Sjohnlev
72*843e1988Sjohnlev	/*
73*843e1988Sjohnlev	 * when we get back, load the kernel entry point and jump to it
74*843e1988Sjohnlev	 * The address of the xboot_info is the kernel's only argument.
75*843e1988Sjohnlev	 */
76*843e1988Sjohnlev	movl	entry_addr_low, %esi
77*843e1988Sjohnlev	movq	$0xffffffff00000000,%rdx
78*843e1988Sjohnlev	orq	%rdx, %rsi		/* set upper bits of entry addr */
79*843e1988Sjohnlev
80*843e1988Sjohnlev        movl    bi, %edi
81*843e1988Sjohnlev	call	*%rsi
82*843e1988Sjohnlev	SET_SIZE(_start)
83*843e1988Sjohnlev
84*843e1988Sjohnlev#elif defined(__i386)
85*843e1988Sjohnlev
86*843e1988Sjohnlev	ENTRY_NP(_start)
87*843e1988Sjohnlev	/*
88*843e1988Sjohnlev	 * At entry we are passed a (start_info_t *) in %esi.
89*843e1988Sjohnlev	 */
90*843e1988Sjohnlev	movl	%esi, xen_info
91*843e1988Sjohnlev
92*843e1988Sjohnlev	/*
93*843e1988Sjohnlev	 * make sure we have sane processor state
94*843e1988Sjohnlev	 */
95*843e1988Sjohnlev	cld
96*843e1988Sjohnlev	xorw	%ax, %ax
97*843e1988Sjohnlev	movw	%ax, %fs
98*843e1988Sjohnlev	movw	%ax, %gs
99*843e1988Sjohnlev
100*843e1988Sjohnlev
101*843e1988Sjohnlev	/*
102*843e1988Sjohnlev	 * go off and unpack the kernel bits, adjust page tables, etc.
103*843e1988Sjohnlev	 */
104*843e1988Sjohnlev	call	startup_kernel
105*843e1988Sjohnlev
106*843e1988Sjohnlev	/*
107*843e1988Sjohnlev	 * we can only setup a stack after startup_kernel().
108*843e1988Sjohnlev	 */
109*843e1988Sjohnlev	movl	$stack_space, %esp	/* load my stack pointer */
110*843e1988Sjohnlev	addl	$STACK_SIZE, %esp
111*843e1988Sjohnlev
112*843e1988Sjohnlev	pushl	$0x0			/* push a dead-end frame */
113*843e1988Sjohnlev	pushl	$0x0
114*843e1988Sjohnlev	movl	%esp, %ebp
115*843e1988Sjohnlev
116*843e1988Sjohnlev	/*
117*843e1988Sjohnlev	 * when we get back, load the kernel entry point and jump to it
118*843e1988Sjohnlev	 * The address of the xboot_info is the kernel's only argument.
119*843e1988Sjohnlev	 */
120*843e1988Sjohnlev	movl	entry_addr_low, %esi
121*843e1988Sjohnlev	movl	bi, %eax
122*843e1988Sjohnlev	pushl	%eax
123*843e1988Sjohnlev	call	*%esi
124*843e1988Sjohnlev	SET_SIZE(_start)
125*843e1988Sjohnlev
126*843e1988Sjohnlev#endif	/* __i386 */
127*843e1988Sjohnlev
128*843e1988Sjohnlev#endif /* __lint */
129