]> 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 b89d9245f62bad488bec74ca13bd80000db7806c..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,10 +13,14 @@ 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 string
+       print begin
        call check_a20
        jc .a20_enabled
        call enable_a20
        call check_a20
        jc .a20_enabled
        call enable_a20
@@ -55,13 +61,24 @@ _start:
        pop si
        pop cx
        print 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
        call print_dword
        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
@@ -143,32 +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"
-string: db "Hello from LOADER.BIN!", 0xd, 0xa, 0
-a20_enabled: db "A20 is enabled", 0xd, 0xa, 0
+       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
 kernel_found: db "Found kernel at cluster ", 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
 kernel_found: db "Found kernel at cluster ", 0
-missing_kernel: db "Could not find KERNEL.BIN", 0xd, 0xa, 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