X-Git-Url: http://git.dujemihanovic.xyz/%7B%7B?a=blobdiff_plain;f=kernel%2Fentry.s;h=d6490a1159587a81cda63257b3ee3e9028fdaf68;hb=da4e7bf5dd2b9448b638255a20ee503b0641e495;hp=10c95e8985955184b0b8f0afde73f5c99c692d13;hpb=94770e6354578485b2aed68dcc3064e5d6862645;p=nameless-os.git diff --git a/kernel/entry.s b/kernel/entry.s index 10c95e8..d6490a1 100644 --- a/kernel/entry.s +++ b/kernel/entry.s @@ -2,10 +2,31 @@ bits 32 extern kmain extern __STACK_BOTTOM__ +section .text global _start _start: + ; Here, the stack will look like: + ; return address, map pointer, map size. + + ; Skip the return address. + add esp, 4 + ; Save the kernel arguments. + ; Can this be done without the global variables? + pop dword [e820_map] + pop dword [e820_map_size] + sub esp, 12 + ; Do the stack switch. mov ebp, __STACK_BOTTOM__ mov esp, ebp + ; Restore the kernel arguments. + push dword [e820_map_size] + push dword [e820_map] + ; Call the actual kernel. call kmain hlt jmp $-1 + +; Temporarily save arguments here to survive the upcoming stack switch. +section .bss +e820_map: resd 1 +e820_map_size: resd 1