Revert "Kernel/x86: Bake the Prekernel and the Kernel into one image"

Some hardware/software configurations crash KVM as soon as we try to
start Serenity. The exact cause is currently unknown, so just fully
revert it for now.

This reverts commit 897c4e5145.
This commit is contained in:
Tim Schumacher 2023-04-28 17:27:24 +02:00 committed by Jelle Raaijmakers
parent a8d08357c9
commit 9ab598af49
Notes: sideshowbarker 2024-07-17 12:02:22 +09:00
10 changed files with 50 additions and 81 deletions

View file

@ -27,9 +27,6 @@ extern "C" [[noreturn]] void __stack_chk_fail();
extern "C" u8 start_of_prekernel_image[];
extern "C" u8 end_of_prekernel_image[];
extern "C" u8 _binary_Kernel_standalone_start[];
extern "C" u8 end_of_prekernel_image_after_kernel_image[];
extern "C" u8 gdt64ptr[];
extern "C" u16 code64_sel;
extern "C" u64 boot_pml4t[512];
@ -79,7 +76,12 @@ u64 generate_secure_seed();
extern "C" [[noreturn]] void init()
{
u8* kernel_image = _binary_Kernel_standalone_start;
if (multiboot_info_ptr->mods_count < 1)
halt();
multiboot_module_entry_t* kernel_module = (multiboot_module_entry_t*)(FlatPtr)multiboot_info_ptr->mods_addr;
u8* kernel_image = (u8*)(FlatPtr)kernel_module->start;
// copy the ELF header and program headers because we might end up overwriting them
ElfW(Ehdr) kernel_elf_header = *(ElfW(Ehdr)*)kernel_image;
ElfW(Phdr) kernel_program_headers[16];
@ -87,8 +89,8 @@ extern "C" [[noreturn]] void init()
halt();
__builtin_memcpy(kernel_program_headers, kernel_image + kernel_elf_header.e_phoff, sizeof(ElfW(Phdr)) * kernel_elf_header.e_phnum);
FlatPtr kernel_physical_base = (FlatPtr)kernel_image;
FlatPtr default_kernel_load_base = KERNEL_MAPPING_BASE + kernel_physical_base;
FlatPtr kernel_physical_base = 0x200000;
FlatPtr default_kernel_load_base = KERNEL_MAPPING_BASE + 0x200000;
FlatPtr kernel_load_base = default_kernel_load_base;
@ -166,6 +168,9 @@ extern "C" [[noreturn]] void init()
__builtin_memset((u8*)kernel_load_base + kernel_program_header.p_vaddr + kernel_program_header.p_filesz, 0, kernel_program_header.p_memsz - kernel_program_header.p_filesz);
}
multiboot_info_ptr->mods_count--;
multiboot_info_ptr->mods_addr += sizeof(multiboot_module_entry_t);
auto adjust_by_mapping_base = [kernel_mapping_base](auto ptr) {
return (decltype(ptr))((FlatPtr)ptr + kernel_mapping_base);
};
@ -189,16 +194,8 @@ extern "C" [[noreturn]] void init()
info.multiboot_flags = multiboot_info_ptr->flags;
info.multiboot_memory_map = adjust_by_mapping_base((FlatPtr)multiboot_info_ptr->mmap_addr);
info.multiboot_memory_map_count = multiboot_info_ptr->mmap_length / sizeof(multiboot_memory_map_t);
info.multiboot_modules_physical_ptr = (FlatPtr)multiboot_info_ptr->mods_addr;
info.multiboot_modules = adjust_by_mapping_base((FlatPtr)multiboot_info_ptr->mods_addr);
info.multiboot_modules_count = multiboot_info_ptr->mods_count;
if (info.multiboot_modules_count > 0) {
auto* entry = reinterpret_cast<multiboot_module_entry*>(multiboot_info_ptr->mods_addr);
info.multiboot_module_ramdisk_physical_start = entry->start;
info.multiboot_module_ramdisk_physical_end = entry->end;
info.multiboot_module_ramdisk_physical_string_addr = entry->string_addr;
}
if ((multiboot_info_ptr->flags & MULTIBOOT_INFO_FRAMEBUFFER_INFO) != 0) {
info.multiboot_framebuffer_addr = multiboot_info_ptr->framebuffer_addr;
info.multiboot_framebuffer_pitch = multiboot_info_ptr->framebuffer_pitch;