From 503252e8e8593fdd66c34fa0097278141dce0fb0 Mon Sep 17 00:00:00 2001 From: Zhang Junyang Date: Thu, 12 Oct 2023 21:16:43 +0800 Subject: [PATCH] Fix multiboot entry in UEFI boot --- .../jinux-frame/src/arch/x86/boot/boot.S | 49 +++++++++++-------- .../jinux-frame/src/arch/x86/boot/linker.ld | 2 +- .../src/arch/x86/boot/multiboot/header.S | 3 -- .../src/arch/x86/boot/multiboot2/header.S | 4 +- 4 files changed, 32 insertions(+), 26 deletions(-) diff --git a/framework/jinux-frame/src/arch/x86/boot/boot.S b/framework/jinux-frame/src/arch/x86/boot/boot.S index 030c4eb00..81b7118a4 100644 --- a/framework/jinux-frame/src/arch/x86/boot/boot.S +++ b/framework/jinux-frame/src/arch/x86/boot/boot.S @@ -11,6 +11,9 @@ ENTRYTYPE_MULTIBOOT = 1 ENTRYTYPE_MULTIBOOT2 = 2 ENTRYTYPE_LINUX_32 = 3 +MULTIBOOT_ENTRY_MAGIC = 0x2BADB002 +MULTIBOOT2_ENTRY_MAGIC = 0x36D76289 + // The Linux 32-bit Boot Protocol entry point. // Must be located at 0x100000, ABI immutable! .code32 @@ -40,7 +43,7 @@ __linux64_boot_tag: call rax jmp halt // unreachable here -// The multiboot entry point. +// The multiboot & multiboot2 entry point. .code32 .global __multiboot_boot __multiboot_boot: @@ -54,28 +57,19 @@ __multiboot_boot: push eax // multiboot magic ptr push 0 // Upper 32-bits. push ebx // multiboot info ptr + // Tell the entry type from eax + cmp eax, MULTIBOOT_ENTRY_MAGIC + je magic_is_mb + cmp eax, MULTIBOOT2_ENTRY_MAGIC + je magic_is_mb2 + jmp halt // Should not be reachable! +magic_is_mb: push 0 // Upper 32-bits. push ENTRYTYPE_MULTIBOOT - jmp initial_boot_setup - -// The multiboot2 entry point. -.code32 -.global __multiboot2_boot -__multiboot2_boot: - cli - cld - - // Set the kernel call stack. - mov esp, offset boot_stack_top - - push 0 // Upper 32-bits. - push eax // multiboot magic ptr - push 0 // Upper 32-bits. - push ebx // multiboot info ptr +magic_is_mb2: push 0 // Upper 32-bits. push ENTRYTYPE_MULTIBOOT2 - jmp initial_boot_setup initial_boot_setup: @@ -305,6 +299,8 @@ long_mode: // Call the corresponding Rust entrypoint according to the boot entrypoint pop rax + cmp rax, ENTRYTYPE_MULTIBOOT + je entry_type_multiboot cmp rax, ENTRYTYPE_MULTIBOOT2 je entry_type_multiboot2 cmp rax, ENTRYTYPE_LINUX_32 @@ -312,17 +308,31 @@ long_mode: // Unreachable! jmp halt +.extern __linux64_boot +.extern __multiboot_entry +.extern __multiboot2_entry + entry_type_linux_32: pop rdi // boot_params ptr // Clear the frame pointer to stop backtracing here. xor rbp, rbp -.extern __linux64_boot lea rax, [rip + __linux64_boot] // jump into Rust code call rax jmp halt +entry_type_multiboot: + pop rsi // the address of multiboot info + pop rdi // multiboot magic + + // Clear the frame pointer to stop backtracing here. + xor rbp, rbp + + lea rax, [rip + __multiboot_entry] // jump into Rust code + call rax + jmp halt + entry_type_multiboot2: pop rsi // the address of multiboot info pop rdi // multiboot magic @@ -330,7 +340,6 @@ entry_type_multiboot2: // Clear the frame pointer to stop backtracing here. xor rbp, rbp -.extern __multiboot2_entry lea rax, [rip + __multiboot2_entry] // jump into Rust code call rax jmp halt diff --git a/framework/jinux-frame/src/arch/x86/boot/linker.ld b/framework/jinux-frame/src/arch/x86/boot/linker.ld index 663c030e3..48552a15f 100644 --- a/framework/jinux-frame/src/arch/x86/boot/linker.ld +++ b/framework/jinux-frame/src/arch/x86/boot/linker.ld @@ -1,4 +1,4 @@ -ENTRY(__linux64_boot) +ENTRY(__multiboot_boot) OUTPUT_ARCH(i386:x86-64) OUTPUT_FORMAT(elf64-x86-64) diff --git a/framework/jinux-frame/src/arch/x86/boot/multiboot/header.S b/framework/jinux-frame/src/arch/x86/boot/multiboot/header.S index 1c5ed4761..e7acd3ca2 100644 --- a/framework/jinux-frame/src/arch/x86/boot/multiboot/header.S +++ b/framework/jinux-frame/src/arch/x86/boot/multiboot/header.S @@ -12,6 +12,3 @@ multiboot_header: .long MB_MAGIC .long MB_FLAGS .long MB_CHECKSUM -multiboot_entry: -.global __multiboot_boot - jmp __multiboot_boot diff --git a/framework/jinux-frame/src/arch/x86/boot/multiboot2/header.S b/framework/jinux-frame/src/arch/x86/boot/multiboot2/header.S index f9e87df93..3eb833453 100644 --- a/framework/jinux-frame/src/arch/x86/boot/multiboot2/header.S +++ b/framework/jinux-frame/src/arch/x86/boot/multiboot2/header.S @@ -22,8 +22,8 @@ entry_address_tag_start: .short 3 .short 1 // Optional .long entry_address_tag_end - entry_address_tag_start -.extern __multiboot2_boot - .long __multiboot2_boot // entry_addr +.extern __multiboot_boot + .long __multiboot_boot // entry_addr entry_address_tag_end: // Tag: information request