843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * CDDL HEADER START
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * The contents of this file are subject to the terms of the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Common Development and Distribution License (the "License").
843e19887f64dde75055cf8842fc4db2171eff45johnlev * You may not use this file except in compliance with the License.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
843e19887f64dde75055cf8842fc4db2171eff45johnlev * or http://www.opensolaris.org/os/licensing.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * See the License for the specific language governing permissions
843e19887f64dde75055cf8842fc4db2171eff45johnlev * and limitations under the License.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * When distributing Covered Code, include this CDDL HEADER in each
843e19887f64dde75055cf8842fc4db2171eff45johnlev * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * If applicable, add the following below this CDDL HEADER, with the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * fields enclosed by brackets "[]" replaced with your own identifying
843e19887f64dde75055cf8842fc4db2171eff45johnlev * information: Portions Copyright [yyyy] [name of copyright owner]
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * CDDL HEADER END
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Use is subject to license terms.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#pragma ident "%Z%%M% %I% %E% SMI"
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/asm_linkage.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/asm_misc.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include "dboot_xboot.h"
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#if defined(__lint)
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#else /* __lint */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#if defined(__amd64)
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev ENTRY_NP(_start)
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * At entry we are passed a (start_info_t *) in %rsi.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev movq %rsi, xen_info(%rip)
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * make sure we have sane processor state
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev xorw %ax, %ax
843e19887f64dde75055cf8842fc4db2171eff45johnlev movw %ax, %fs
843e19887f64dde75055cf8842fc4db2171eff45johnlev movw %ax, %gs
843e19887f64dde75055cf8842fc4db2171eff45johnlev pushq $0
843e19887f64dde75055cf8842fc4db2171eff45johnlev popfq
843e19887f64dde75055cf8842fc4db2171eff45johnlev pushq $0
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * go off and unpack the kernel bits, adjust page tables, etc.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev call startup_kernel
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * we can only setup a stack after startup_kernel().
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Its in the lower part of memroy.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev leaq stack_space(%rip), %rsp
843e19887f64dde75055cf8842fc4db2171eff45johnlev addq $STACK_SIZE, %rsp
843e19887f64dde75055cf8842fc4db2171eff45johnlev andl $0xfffffff0, %esp
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev pushq $0x0 /* push a dead-end frame */
843e19887f64dde75055cf8842fc4db2171eff45johnlev pushq $0x0
843e19887f64dde75055cf8842fc4db2171eff45johnlev movq %rsp, %rbp
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * when we get back, load the kernel entry point and jump to it
843e19887f64dde75055cf8842fc4db2171eff45johnlev * The address of the xboot_info is the kernel's only argument.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev movl entry_addr_low, %esi
843e19887f64dde75055cf8842fc4db2171eff45johnlev movq $0xffffffff00000000,%rdx
843e19887f64dde75055cf8842fc4db2171eff45johnlev orq %rdx, %rsi /* set upper bits of entry addr */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev movl bi, %edi
843e19887f64dde75055cf8842fc4db2171eff45johnlev call *%rsi
843e19887f64dde75055cf8842fc4db2171eff45johnlev SET_SIZE(_start)
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#elif defined(__i386)
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev ENTRY_NP(_start)
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * At entry we are passed a (start_info_t *) in %esi.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev movl %esi, xen_info
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * make sure we have sane processor state
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev cld
843e19887f64dde75055cf8842fc4db2171eff45johnlev xorw %ax, %ax
843e19887f64dde75055cf8842fc4db2171eff45johnlev movw %ax, %fs
843e19887f64dde75055cf8842fc4db2171eff45johnlev movw %ax, %gs
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * go off and unpack the kernel bits, adjust page tables, etc.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev call startup_kernel
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * we can only setup a stack after startup_kernel().
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev movl $stack_space, %esp /* load my stack pointer */
843e19887f64dde75055cf8842fc4db2171eff45johnlev addl $STACK_SIZE, %esp
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev pushl $0x0 /* push a dead-end frame */
843e19887f64dde75055cf8842fc4db2171eff45johnlev pushl $0x0
843e19887f64dde75055cf8842fc4db2171eff45johnlev movl %esp, %ebp
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * when we get back, load the kernel entry point and jump to it
843e19887f64dde75055cf8842fc4db2171eff45johnlev * The address of the xboot_info is the kernel's only argument.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev movl entry_addr_low, %esi
843e19887f64dde75055cf8842fc4db2171eff45johnlev movl bi, %eax
843e19887f64dde75055cf8842fc4db2171eff45johnlev pushl %eax
843e19887f64dde75055cf8842fc4db2171eff45johnlev call *%esi
843e19887f64dde75055cf8842fc4db2171eff45johnlev SET_SIZE(_start)
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif /* __i386 */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif /* __lint */