summaryrefslogtreecommitdiff
path: root/arch/i386/boot/boot.s
diff options
context:
space:
mode:
Diffstat (limited to 'arch/i386/boot/boot.s')
-rw-r--r--arch/i386/boot/boot.s55
1 files changed, 49 insertions, 6 deletions
diff --git a/arch/i386/boot/boot.s b/arch/i386/boot/boot.s
index 56ac227..792a790 100644
--- a/arch/i386/boot/boot.s
+++ b/arch/i386/boot/boot.s
@@ -4,29 +4,72 @@
.set MAGIC, 0x1BADB002
.set CHECKSUM, -(MAGIC + FLAGS)
-.section .multiboot
+.section .multiboot.data, "aw"
.align 4
.long MAGIC
.long FLAGS
.long CHECKSUM
-.section .bss
-.align 16
+.section .bootstrap_stack, "aw", @nobits
stack_bottom:
.skip 16384
stack_top:
-.section .text
+.section .bss, "aw", @nobits
+ .align 4096
+boot_page_directory:
+ .skip 4096
+boot_page_table0:
+ .skip 4096
+
+.section .multiboot.text, "a"
.global _start
.type _start, @function
_start:
+ movl $(boot_page_table0 - 0xC0000000), %edi
+ movl $0, %esi
+ movl $1023, %ecx
+
+1: cmpl $_kernel_start, %esi
+ jl 2f
+ cmpl $(_kernel_end - 0xC0000000), %esi
+ jge 3f
+
+ movl %esi, %edx
+ orl $0x003, %edx
+ movl %edx, (%edi)
+
+2: addl $4096, %esi
+ addl $4, %edi
+ loop 1b
+
+3: movl $(0x000B8000 | 0x003), boot_page_table0 - 0xC0000000 + 1023 * 4
+
+ movl $(boot_page_table0 - 0xC0000000 + 0x003), boot_page_directory - 0xC0000000
+ movl $(boot_page_table0 - 0xC0000000 + 0x003), boot_page_directory - 0xC0000000 + 768 * 4
+
+ movl $(boot_page_directory - 0xC0000000), %ecx
+ movl %ecx, %cr3
+
+ movl %cr0, %ecx
+ orl $0x80010000, %ecx
+ movl %ecx, %cr0
+
+ lea 4f, %ecx
+ jmp *%ecx
+
+.section .text
+
+4: movl $0, boot_page_directory + 0
+
+ movl %cr3, %ecx
+ movl %ecx, %cr3
+
movl $stack_top, %esp
- call _init
call kernel_main
cli
1: hlt
jmp 1b
-.size _start, . - _start