1/*- 2 * Copyright (c) 2003 Peter Wemm <peter@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $FreeBSD$ 27 */ 28 29#include <machine/asmacros.h> 30#include <machine/psl.h> 31#include <machine/pmap.h> 32#include <machine/specialreg.h> 33 34#include "assym.inc" 35 36/* 37 * Compiled KERNBASE location 38 */ 39 .globl kernbase, loc_PTmap, loc_PDmap, loc_PDPmap, dmapbase, dmapend 40 .set kernbase,KERNBASE 41 .set dmapbase,DMAP_MIN_ADDRESS 42 .set dmapend,DMAP_MAX_ADDRESS 43 44 .text 45/********************************************************************** 46 * 47 * This is where the loader trampoline start us, set the ball rolling... 48 * 49 * We are called with the stack looking like this: 50 * 0(%rsp) = 32 bit return address (cannot be used) 51 * 4(%rsp) = 32 bit modulep 52 * 8(%rsp) = 32 bit kernend 53 * 54 * We are already in long mode, on a 64 bit %cs and running at KERNBASE. 55 */ 56NON_GPROF_ENTRY(btext) 57 58 /* Tell the bios to warmboot next time */ 59 movw $0x1234,0x472 60 61 /* Don't trust what the loader gives for rflags. */ 62 pushq $PSL_KERNEL 63 popfq 64 65 /* Find the metadata pointers before we lose them */ 66 movq %rsp, %rbp 67 movl 4(%rbp),%edi /* modulep (arg 1) */ 68 movl 8(%rbp),%esi /* kernend (arg 2) */ 69 70 /* Get onto a stack that we can trust - there is no going back now. */ 71 movq $bootstack,%rsp 72 xorl %ebp, %ebp 73 74 call hammer_time /* set up cpu for unix operation */ 75 movq %rax,%rsp /* set up kstack for mi_startup() */ 76 call mi_startup /* autoconfiguration, mountroot etc */ 770: hlt 78 jmp 0b 79 80/* la57_trampoline(%rdi pml5) */ 81NON_GPROF_ENTRY(la57_trampoline) 82 movq %rsp,%r11 83 movq %rbx,%r10 84 leaq la57_trampoline_end(%rip),%rsp 85 86 movq %cr0,%rdx 87 lgdtq la57_trampoline_gdt_desc(%rip) 88 89 pushq $(2<<3) 90 leaq l1(%rip),%rax 91 leaq l2(%rip),%rbx 92 93 pushq %rax 94 lretq 95 .code32 96 97l1: movl $(3<<3),%eax 98 movl %eax,%ss 99 100 movl %edx,%eax 101 andl $~CR0_PG,%eax 102 movl %eax,%cr0 103 104 movl %cr4,%eax 105 orl $CR4_LA57,%eax 106 movl %eax,%cr4 107 108 movl %edi,%cr3 109 movl %edx,%cr0 110 111 pushl $(1<<3) 112 pushl %ebx 113 lretl 114 .code64 115 116l2: movq %r11,%rsp 117 movq %r10,%rbx 118 retq 119 .p2align 4,0 120NON_GPROF_ENTRY(la57_trampoline_gdt_desc) 121 .word la57_trampoline_end - la57_trampoline_gdt 122 .long 0 /* filled by pmap_bootstrap_la57 */ 123 .p2align 4,0 124NON_GPROF_ENTRY(la57_trampoline_gdt) 125 .long 0x00000000 /* null desc */ 126 .long 0x00000000 127 .long 0x00000000 /* 64bit code */ 128 .long 0x00209800 129 .long 0x0000ffff /* 32bit code */ 130 .long 0x00cf9b00 131 .long 0x0000ffff /* universal data */ 132 .long 0x00cf9300 133 .dcb.l 16,0 134NON_GPROF_ENTRY(la57_trampoline_end) 135 136 .bss 137 ALIGN_DATA /* just to be sure */ 138 .globl bootstack 139 .space 0x1000 /* space for bootstack - temporary stack */ 140bootstack: 141