summaryrefslogtreecommitdiff
path: root/kernel/src/arch/i686/start.asm
diff options
context:
space:
mode:
authorTyler Murphy <=>2023-07-17 19:34:52 -0400
committerTyler Murphy <=>2023-07-17 19:34:52 -0400
commit7a912d1b668ab86ffe088eca3ac7e6f78a04a0c5 (patch)
tree4e86ff20e73171285156631db043e12aaf63bf04 /kernel/src/arch/i686/start.asm
parentpaging (diff)
downloadfinix-7a912d1b668ab86ffe088eca3ac7e6f78a04a0c5.tar.gz
finix-7a912d1b668ab86ffe088eca3ac7e6f78a04a0c5.tar.bz2
finix-7a912d1b668ab86ffe088eca3ac7e6f78a04a0c5.zip
refactoring
Diffstat (limited to 'kernel/src/arch/i686/start.asm')
-rw-r--r--kernel/src/arch/i686/start.asm82
1 files changed, 82 insertions, 0 deletions
diff --git a/kernel/src/arch/i686/start.asm b/kernel/src/arch/i686/start.asm
new file mode 100644
index 0000000..2151b51
--- /dev/null
+++ b/kernel/src/arch/i686/start.asm
@@ -0,0 +1,82 @@
+global start
+bits 32
+
+
+; create the multiboot header
+section .bootstrap.data
+align 8
+mb_start:
+dd 0xe85250d6
+dd 0
+dd mb_end - mb_start
+dd -(0xe85250d6 + (mb_end - mb_start))
+dw 0
+dw 0
+dd 8
+mb_end:
+
+
+; create the stack for bootstrapping
+section .bootstrap.stack
+align 16
+bootstrap_stack_start:
+resb 1024 ; 1 KiB
+bootstrap_stack_end:
+
+
+; create the stack for the kernel
+section .stack
+align 16
+stack_start:
+resb 16384 ; 16 KiB
+stack_end:
+
+
+; load the kernel into the higher half
+section .bootstrap.text
+align 8
+start:
+ ; init bootstrap stack
+ mov esp, bootstrap_stack_end
+ mov ebp, bootstrap_stack_end
+
+ ; load kernel into higher half and init paging
+ extern paging_init
+ call paging_init
+
+ jmp near load_kernel
+
+; initalize kernel after it has been loaded in higher half
+section .text
+align 8
+load_kernel:
+ ; init stack
+ mov esp, stack_end
+ mov ebp, stack_end
+
+ ; load global descripter table
+ extern load_gdt
+ call load_gdt
+
+ ; unmap kernel at page 0
+ extern paging_finish
+ call paging_finish
+
+ ; initalize the FPU
+ finit
+
+ ; push multiboot header
+ extern KERNEL_MAPPING
+ add ebx, KERNEL_MAPPING
+ push ebx
+
+ ; start kernel
+ sti
+ call kernel_main
+ extern kernel_main
+
+ ; hlt forever if kernel quits (it should never)
+ cli
+halt:
+ hlt
+ jmp halt