[f761f1eb] | 1 | #
|
---|
| 2 | # Copyright (C) 2001-2004 Jakub Jermar
|
---|
| 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 | #
|
---|
| 9 | # - Redistributions of source code must retain the above copyright
|
---|
| 10 | # notice, this list of conditions and the following disclaimer.
|
---|
| 11 | # - Redistributions in binary form must reproduce the above copyright
|
---|
| 12 | # notice, this list of conditions and the following disclaimer in the
|
---|
| 13 | # documentation and/or other materials provided with the distribution.
|
---|
| 14 | # - The name of the author may not be used to endorse or promote products
|
---|
| 15 | # derived from this software without specific prior written permission.
|
---|
| 16 | #
|
---|
| 17 | # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
---|
| 18 | # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
---|
| 19 | # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
---|
| 20 | # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
---|
| 21 | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
---|
| 22 | # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
---|
| 23 | # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
---|
| 24 | # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
---|
| 25 | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
---|
| 26 | # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
---|
| 27 | #
|
---|
| 28 |
|
---|
[f9447155] | 29 | #include <arch/boot/boot.h>
|
---|
| 30 |
|
---|
[f761f1eb] | 31 | .section K_TEXT_START
|
---|
| 32 | .global kernel_image_start
|
---|
| 33 |
|
---|
| 34 | .code16
|
---|
| 35 | #
|
---|
| 36 | # This is where we require any SPARTAN-kernel-compatible boot loader
|
---|
| 37 | # to pass control in real mode.
|
---|
| 38 | #
|
---|
| 39 | # Protected mode tables are statically initialised during compile
|
---|
| 40 | # time. So we can just load the respective table registers and
|
---|
| 41 | # switch to protected mode.
|
---|
| 42 | #
|
---|
| 43 | kernel_image_start:
|
---|
[5d721f0] | 44 | cli
|
---|
[5dce48b9] | 45 | xorw %ax, %ax
|
---|
| 46 | movw %ax, %ds
|
---|
| 47 | movw %ax, %ss # initialize stack segment register
|
---|
| 48 | movl $0x7c00, %esp # initialize stack pointer
|
---|
[229d5fc1] | 49 |
|
---|
| 50 | call memmap_arch_init
|
---|
| 51 |
|
---|
[b52da8d7] | 52 | lgdt gdtr # initialize Global Descriptor Table register
|
---|
| 53 |
|
---|
[5dce48b9] | 54 | movl %cr0, %eax
|
---|
| 55 | orl $0x1, %eax
|
---|
| 56 | movl %eax, %cr0 # switch to protected mode
|
---|
| 57 |
|
---|
| 58 | jmpl $8, $boot_image_start
|
---|
| 59 |
|
---|
[b0bf501] | 60 | .code32
|
---|
[f9447155] | 61 | .align 4
|
---|
| 62 | multiboot_header:
|
---|
| 63 | .long MULTIBOOT_HEADER_MAGIC
|
---|
| 64 | .long MULTIBOOT_HEADER_FLAGS
|
---|
| 65 | .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) # checksum
|
---|
[5dce48b9] | 66 | .long multiboot_header + BOOT_OFFSET
|
---|
| 67 | .long unmapped_ktext_start + BOOT_OFFSET
|
---|
[f9447155] | 68 | .long 0
|
---|
| 69 | .long 0
|
---|
[5dce48b9] | 70 | .long multiboot_image_start + BOOT_OFFSET
|
---|
| 71 |
|
---|
| 72 | boot_image_start:
|
---|
| 73 | movw $16, %ax
|
---|
| 74 | movw %ax, %es
|
---|
| 75 | movw %ax, %gs
|
---|
| 76 | movw %ax, %fs
|
---|
| 77 | movw %ax, %ds # kernel data + stack
|
---|
| 78 | movw %ax, %ss
|
---|
| 79 |
|
---|
| 80 | call map_kernel # map kernel and turn paging on
|
---|
| 81 |
|
---|
| 82 | movb $0xd1, %al # enable A20 using the keyboard controller
|
---|
| 83 | outb %al, $0x64
|
---|
| 84 | movb $0xdf, %al
|
---|
| 85 | outb %al, $0x60
|
---|
| 86 |
|
---|
| 87 | movl $0x8000, %esi
|
---|
| 88 | movl $0x8000 + BOOT_OFFSET, %edi
|
---|
| 89 | movl $_hardcoded_kernel_size, %ecx
|
---|
| 90 | cld
|
---|
| 91 | rep movsb
|
---|
| 92 |
|
---|
| 93 | jmp protected
|
---|
[f9447155] | 94 |
|
---|
| 95 | multiboot_image_start:
|
---|
| 96 | movl $0x7c00, %esp # initialize stack pointer
|
---|
| 97 |
|
---|
| 98 | lgdt gdtr
|
---|
[b0bf501] | 99 |
|
---|
[5dce48b9] | 100 | movw $16, %ax
|
---|
| 101 | movw %ax, %es
|
---|
| 102 | movw %ax, %gs
|
---|
| 103 | movw %ax, %fs
|
---|
| 104 | movw %ax, %ds # kernel data + stack
|
---|
| 105 | movw %ax, %ss
|
---|
| 106 |
|
---|
[b52da8d7] | 107 | call map_kernel # map kernel and turn paging on
|
---|
[5dce48b9] | 108 |
|
---|
| 109 | protected:
|
---|
[d47f0e1] | 110 | call main_bsp # never returns
|
---|
| 111 |
|
---|
| 112 | cli
|
---|
| 113 | hlt
|
---|
| 114 |
|
---|
| 115 | .global map_kernel
|
---|
| 116 | map_kernel:
|
---|
[dcbc8be] | 117 | #
|
---|
| 118 | # Here we setup mapping for both the unmapped and mapped sections of the kernel.
|
---|
| 119 | # For simplicity, we set only one 4M page for 0x00000000 and one for 0x80000000.
|
---|
| 120 | #
|
---|
| 121 | movl %cr4, %ecx
|
---|
| 122 | orl $(1<<4), %ecx
|
---|
| 123 | movl %ecx, %cr4 # turn PSE on
|
---|
| 124 |
|
---|
| 125 | movl $((1<<7)|(1<<0)), %eax
|
---|
| 126 | movl %eax, page_directory # mapping 0x00000000 => 0x00000000
|
---|
| 127 |
|
---|
| 128 | movl $(page_directory+(4096/2)), %edx
|
---|
| 129 | movl %eax, (%edx) # mapping 0x80000000 => 0x00000000
|
---|
| 130 |
|
---|
| 131 | leal page_directory, %eax
|
---|
| 132 | movl %eax, %cr3
|
---|
[f761f1eb] | 133 |
|
---|
[b52da8d7] | 134 | # turn paging on
|
---|
[dcbc8be] | 135 | movl %cr0, %ebx
|
---|
| 136 | orl $(1<<31), %ebx
|
---|
| 137 | movl %ebx, %cr0
|
---|
[d47f0e1] | 138 | ret
|
---|
[dcbc8be] | 139 |
|
---|
| 140 |
|
---|
| 141 | .section K_DATA_START
|
---|
| 142 |
|
---|
| 143 | .align 4096
|
---|
| 144 | page_directory:
|
---|
| 145 | .space 4096, 0
|
---|