aboutsummaryrefslogtreecommitdiff
path: root/src/arch/x86/boot/boot.S
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/x86/boot/boot.S')
-rw-r--r--src/arch/x86/boot/boot.S126
1 files changed, 126 insertions, 0 deletions
diff --git a/src/arch/x86/boot/boot.S b/src/arch/x86/boot/boot.S
new file mode 100644
index 0000000..02f6e91
--- /dev/null
+++ b/src/arch/x86/boot/boot.S
@@ -0,0 +1,126 @@
+.section .bootstrap_stack, "aw", @nobits
+stack_bottom:
+.skip 16384
+stack_top:
+
+.section .bss, "aw", @nobits
+ .align 4096
+page_directory:
+ .skip 4096
+page_table1:
+ .skip 4096
+page_table2:
+ .skip 4096
+
+
+.set P, 1<<0
+.set RW, 1<<1
+.set FLAGS, P | RW
+.set KERNEL_VM, 0xC0000000
+
+
+.section .multiboot.text, "a"
+.global _start
+.type _start, @function
+_start:
+_start:
+ cli
+ mov $stack_top - KERNEL_VM, %esp
+ pushl %eax
+ pushl %ebx
+
+ movl $page_table1 - KERNEL_VM + FLAGS, page_directory - KERNEL_VM + 0 * 4
+ movl $page_table2 - KERNEL_VM + FLAGS, page_directory - KERNEL_VM + 1 * 4
+ movl $page_table1 - KERNEL_VM + FLAGS, page_directory - KERNEL_VM + 768 * 4
+ movl $page_table2 - KERNEL_VM + FLAGS, page_directory - KERNEL_VM + 769 * 4
+
+ mov $0, %ecx
+not_done:
+ mov $0x1000, %eax
+ mul %ecx
+ orl $FLAGS, %eax
+ mov %eax, %edi
+
+ // page_table1[%ecx] = 0x1000 * %ecx | 0x3
+ mov $4, %eax
+ mul %ecx
+ add $page_table1 - KERNEL_VM, %eax
+ movl %edi, (%eax)
+
+ // page_table2[%ecx] = 0x1000 * %ecx | 0x3
+ mov $4, %eax
+ mul %ecx
+ add $1024 * 0x1000, %edi
+ add $page_table2 - KERNEL_VM, %eax
+ movl %edi, (%eax)
+
+ inc %ecx
+ cmp $1024, %ecx
+ je done
+ jmp not_done
+done:
+
+ movl $(page_directory - KERNEL_VM), %ecx
+ movl %ecx, %cr3
+
+ movl %cr0, %ecx
+ orl $0x80001000, %ecx
+ movl %ecx, %cr0
+
+ lea 7f, %ecx
+ jmp *%ecx
+
+
+.section .boot32.rodata
+
+gdt:
+gdt_null = . - gdt
+ .quad 0
+kernel_code = . - gdt
+ .long 0xFFFF
+ .byte 0
+ .byte 0x9A
+ .byte 0xCF
+ .byte 0
+kernel_data = . - gdt
+ .long 0xFFFF
+ .byte 0
+ .byte 0x92
+ .byte 0xCF
+ .byte 0
+user_code = . - gdt
+ .long 0xFFFF
+ .byte 0
+ .byte 0xFA
+ .byte 0xCF
+ .byte 0
+user_data = . - gdt
+ .long 0xFFFF
+ .byte 0
+ .byte 0xF2
+ .byte 0xCF
+ .byte 0
+
+.global gdtp
+gdtp:
+ .word . - gdt - 1
+ .long gdt
+
+
+.section .text
+
+7:
+ addl $KERNEL_VM, %esp
+ lgdtl gdtp
+ ljmp $0x08, $code
+
+code:
+ movw $0x10, %ax
+ movw %ax, %ds
+ movw %ax, %es
+ movw %ax, %fs
+ movw %ax, %gs
+ movw %ax, %ss
+
+ call kernel_main
+ hlt