]> git.dujemihanovic.xyz Git - nameless-os.git/blobdiff - boot/x86/stage3/loader.s
Load ELF kernel instead of flat binary
[nameless-os.git] / boot / x86 / stage3 / loader.s
index b67d33894099660760e7c63fc4d471c8090f3507..87598f4b0c93a6d95cbb1aa21dcf6a87723ff1da 100644 (file)
@@ -1,7 +1,9 @@
 bits 16
 cpu 686
 bits 16
 cpu 686
-org 0x1800
 
 
+extern run_kernel
+
+section .text
 %include "../fat32/fat32-structs.s"
 
 %macro print 1
 %include "../fat32/fat32-structs.s"
 
 %macro print 1
@@ -11,14 +13,20 @@ org 0x1800
        pop si
 %endmacro
 
        pop si
 %endmacro
 
+extern __STACK_BOTTOM__
+
+global _start
 _start:
 _start:
+       mov sp, __STACK_BOTTOM__
        mov [BOOT_DRIVE], dl
        call enable_unreal
        mov [BOOT_DRIVE], dl
        call enable_unreal
+       print begin
        call check_a20
        jc .a20_enabled
        call enable_a20
        jnc .a20_enable_fail
 .a20_enabled:
        call check_a20
        jc .a20_enabled
        call enable_a20
        jnc .a20_enable_fail
 .a20_enabled:
+       print a20_enabled
        call get_1st_data_sec
        mov ax, 0x1000
        mov es, ax
        call get_1st_data_sec
        mov ax, 0x1000
        mov es, ax
@@ -52,12 +60,25 @@ _start:
 .kernel_found:
        pop si
        pop cx
 .kernel_found:
        pop si
        pop cx
+       print kernel_found
+       mov eax, [es:di+dir_entry.filesize]
+       mov [KERNEL_SIZE], eax
        mov ax, [es:di+dir_entry.firstclushi]
        shl eax, 16
        mov ax, [es:di+dir_entry.firstclushi]
        shl eax, 16
-       mov ax, [es:di+(dir_entry.firstcluslo)]
+       mov ax, [es:di+dir_entry.firstcluslo]
+       call print_dword
        mov edi, 0x100000
        mov edi, 0x100000
+       print kernel_loading
        call read_clus_chain_unreal ; load kernel
        call read_clus_chain_unreal ; load kernel
+       print kernel_loaded
        
        
+       call get_e820_map
+       mov ebx, ecx
+       mov eax, 24
+       mul ecx
+       add eax, 20
+       sub sp, ax
+
        cli
        lgdt [gdt]
        mov eax, cr0
        cli
        lgdt [gdt]
        mov eax, cr0
@@ -139,29 +160,43 @@ memcpy:
        pop esi
        ret
 
        pop esi
        ret
 
-
 %include "unreal.s"
 %include "a20.s"
 %include "../fat32/fat32.s"
 %include "gdt.s"
 %include "print.s"
 %include "unreal.s"
 %include "a20.s"
 %include "../fat32/fat32.s"
 %include "gdt.s"
 %include "print.s"
+%include "e820.s"
 
 
-in_protected:
 bits 32
 bits 32
+section .text
+in_protected:
        mov ax, 0x10
        mov ds, ax
        mov es, ax
        mov ss, ax
        mov fs, ax
        mov gs, ax
        mov ax, 0x10
        mov ds, ax
        mov es, ax
        mov ss, ax
        mov fs, ax
        mov gs, ax
-       call 0x100000
-       hlt
-       jmp $-1
 
 
-kernel_name: db "KERNEL  BIN"
+       push dword [KERNEL_SIZE]
+       push 0x100000
+       push ebx
+       push edi
+       call run_kernel
+
+section .bss
+KERNEL_SIZE: resd 1
+
+section .rodata
+
+kernel_name: db "KERNEL  ELF"
+begin: db "Nameless Bootloader revision ", GIT_REVISION, 0xd, 0xa, 0
+a20_enabled: db "A20 has been enabled", 0xd, 0xa, "Searching for kernel...", 0xd, 0xa, 0
 a20_fail: db "Failed to enable A20, giving up!", 0xd, 0xa, 0
 crit_err: db "A critical error occurred, dumping registers now: ", 0xd, 0xa, 0
 a20_fail: db "Failed to enable A20, giving up!", 0xd, 0xa, 0
 crit_err: db "A critical error occurred, dumping registers now: ", 0xd, 0xa, 0
-missing_kernel: db "Could not find KERNEL.BIN", 0xd, 0xa, 0
+kernel_found: db "Found kernel at cluster ", 0
+kernel_loading: db 0xd, 0xa, "Loading kernel...", 0xd, 0xa, 0
+kernel_loaded: db "Kernel successfully loaded.", 0xd, 0xa, "Setting up kernel environment and running kernel...", 0xd, 0xa, 0
+missing_kernel: db "Could not find KERNEL.ELF", 0xd, 0xa, 0
 eax_s: db "EAX: ", 0
 ebx_s: db "EBX: ", 0
 ecx_s: db "ECX: ", 0
 eax_s: db "EAX: ", 0
 ebx_s: db "EBX: ", 0
 ecx_s: db "ECX: ", 0