From d471bbf856888d9a2bd9b43f548f4779bfc9af7c Mon Sep 17 00:00:00 2001 From: Bananymous Date: Mon, 13 Apr 2026 16:43:30 +0300 Subject: [PATCH] Kernel: Cleanup bootloader headers Also add custom load addresses for x86_64 target. This allows qemu to load the kernel with -kernel argument. Without these addresses qemu would refuse to load as it only supports 32 bit ELFs, but as our kernel starts in 32 bit mode anyway, we can just load it! --- kernel/arch/i686/boot.S | 13 +++++++------ kernel/arch/i686/linker.ld | 1 + kernel/arch/x86_64/boot.S | 23 ++++++++++++----------- kernel/arch/x86_64/linker.ld | 2 ++ 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/kernel/arch/i686/boot.S b/kernel/arch/i686/boot.S index 40aae335..9bb11bce 100644 --- a/kernel/arch/i686/boot.S +++ b/kernel/arch/i686/boot.S @@ -11,13 +11,14 @@ .code32 -# multiboot2 header +// video mode info, page align modules +.set multiboot_flags, (1 << 2) | (1 << 0) + .section .multiboot, "aw" - .align 8 multiboot_start: .long 0x1BADB002 - .long (1 << 2) # page align modules - .long -(0x1BADB002 + (1 << 2)) + .long multiboot_flags + .long -(0x1BADB002 + multiboot_flags) .long 0 .long 0 @@ -30,7 +31,8 @@ multiboot_start: .long FB_HEIGHT .long FB_BPP multiboot_end: - .align 8 + +.section .multiboot2, "aw" multiboot2_start: .long 0xE85250D6 .long 0 @@ -66,7 +68,6 @@ multiboot2_start: multiboot2_end: .section .bananboot, "aw" - .align 8 bananboot_start: .long 0xBABAB007 .long -(0xBABAB007 + FB_WIDTH + FB_HEIGHT + FB_BPP) diff --git a/kernel/arch/i686/linker.ld b/kernel/arch/i686/linker.ld index 3a4b22bd..33abb58e 100644 --- a/kernel/arch/i686/linker.ld +++ b/kernel/arch/i686/linker.ld @@ -11,6 +11,7 @@ SECTIONS { g_kernel_execute_start = .; *(.multiboot) + *(.multiboot2) *(.bananboot) *(.text.*) } diff --git a/kernel/arch/x86_64/boot.S b/kernel/arch/x86_64/boot.S index 49612f81..9403ac94 100644 --- a/kernel/arch/x86_64/boot.S +++ b/kernel/arch/x86_64/boot.S @@ -11,26 +11,28 @@ .code32 -# multiboot2 header +// custom addresses, video mode info, page align modules +.set multiboot_flags, (1 << 16) | (1 << 2) | (1 << 0) + .section .multiboot, "aw" - .align 8 multiboot_start: .long 0x1BADB002 - .long (1 << 2) # page align modules - .long -(0x1BADB002 + (1 << 2)) + .long multiboot_flags + .long -(0x1BADB002 + multiboot_flags) - .long 0 - .long 0 - .long 0 - .long 0 - .long 0 + .long V2P(multiboot_start) + .long V2P(g_kernel_start) + .long V2P(g_kernel_bss_start) + .long V2P(g_kernel_end) + .long V2P(_start) .long 0 .long FB_WIDTH .long FB_HEIGHT .long FB_BPP multiboot_end: - .align 8 + +.section .multiboot2, "aw" multiboot2_start: .long 0xE85250D6 .long 0 @@ -66,7 +68,6 @@ multiboot2_start: multiboot2_end: .section .bananboot, "aw" - .align 8 bananboot_start: .long 0xBABAB007 .long -(0xBABAB007 + FB_WIDTH + FB_HEIGHT + FB_BPP) diff --git a/kernel/arch/x86_64/linker.ld b/kernel/arch/x86_64/linker.ld index 650e5a0c..ef80c843 100644 --- a/kernel/arch/x86_64/linker.ld +++ b/kernel/arch/x86_64/linker.ld @@ -11,6 +11,7 @@ SECTIONS { g_kernel_execute_start = .; *(.multiboot) + *(.multiboot2) *(.bananboot) *(.text.*) } @@ -43,6 +44,7 @@ SECTIONS } .bss ALIGN(4K) : AT(ADDR(.bss) - KERNEL_OFFSET) { + g_kernel_bss_start = .; *(COMMON) *(.bss) g_kernel_writable_end = .;