|
@@ -27,6 +27,9 @@ 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];
|
|
@@ -76,12 +79,7 @@ u64 generate_secure_seed();
|
|
|
|
|
|
extern "C" [[noreturn]] void init()
|
|
|
{
|
|
|
- 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;
|
|
|
+ u8* kernel_image = _binary_Kernel_standalone_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];
|
|
@@ -89,8 +87,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 = 0x200000;
|
|
|
- FlatPtr default_kernel_load_base = KERNEL_MAPPING_BASE + 0x200000;
|
|
|
+ FlatPtr kernel_physical_base = (FlatPtr)kernel_image;
|
|
|
+ FlatPtr default_kernel_load_base = KERNEL_MAPPING_BASE + kernel_physical_base;
|
|
|
|
|
|
FlatPtr kernel_load_base = default_kernel_load_base;
|
|
|
|
|
@@ -168,9 +166,6 @@ 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);
|
|
|
};
|
|
@@ -194,8 +189,16 @@ 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 = adjust_by_mapping_base((FlatPtr)multiboot_info_ptr->mods_addr);
|
|
|
+ info.multiboot_modules_physical_ptr = (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;
|