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