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