mirror of
https://github.com/RGBCube/serenity
synced 2025-05-19 16:25:08 +00:00
Prekernel: Make sure we're not overwriting the ELF header
This copies the ELF header because we might end up overwriting when loading the ELF sections.
This commit is contained in:
parent
06468d9794
commit
69fd68b1c8
1 changed files with 11 additions and 7 deletions
|
@ -68,11 +68,15 @@ extern "C" [[noreturn]] void init()
|
||||||
multiboot_module_entry_t* kernel_module = (multiboot_module_entry_t*)(FlatPtr)multiboot_info_ptr->mods_addr;
|
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 = (u8*)(FlatPtr)kernel_module->start;
|
||||||
ElfW(Ehdr)* kernel_elf_header = (ElfW(Ehdr)*)kernel_image;
|
// copy the ELF header and program headers because we might end up overwriting them
|
||||||
ElfW(Phdr)* kernel_program_headers = (ElfW(Phdr*))((char*)kernel_elf_header + kernel_elf_header->e_phoff);
|
ElfW(Ehdr) kernel_elf_header = *(ElfW(Ehdr)*)kernel_image;
|
||||||
|
ElfW(Phdr) kernel_program_headers[16];
|
||||||
|
if (kernel_elf_header.e_phnum > array_size(kernel_program_headers))
|
||||||
|
halt();
|
||||||
|
__builtin_memcpy(kernel_program_headers, kernel_image + kernel_elf_header.e_phoff, sizeof(ElfW(Phdr)) * kernel_elf_header.e_phnum);
|
||||||
|
|
||||||
FlatPtr kernel_load_base = kernel_program_headers[0].p_vaddr;
|
FlatPtr kernel_load_base = kernel_program_headers[0].p_vaddr;
|
||||||
FlatPtr kernel_load_end = kernel_program_headers[kernel_elf_header->e_phnum - 1].p_vaddr + kernel_program_headers[kernel_elf_header->e_phnum - 1].p_memsz;
|
FlatPtr kernel_load_end = kernel_program_headers[kernel_elf_header.e_phnum - 1].p_vaddr + kernel_program_headers[kernel_elf_header.e_phnum - 1].p_memsz;
|
||||||
|
|
||||||
// align to 1GB
|
// align to 1GB
|
||||||
kernel_load_base &= ~(FlatPtr)0x3fffffff;
|
kernel_load_base &= ~(FlatPtr)0x3fffffff;
|
||||||
|
@ -99,7 +103,7 @@ extern "C" [[noreturn]] void init()
|
||||||
for (size_t i = 0; i < (FlatPtr)end_of_prekernel_image / PAGE_SIZE; i++)
|
for (size_t i = 0; i < (FlatPtr)end_of_prekernel_image / PAGE_SIZE; i++)
|
||||||
boot_pd_kernel_pts[i] = i * PAGE_SIZE | 0x3;
|
boot_pd_kernel_pts[i] = i * PAGE_SIZE | 0x3;
|
||||||
|
|
||||||
for (size_t i = 0; i < kernel_elf_header->e_phnum; i++) {
|
for (size_t i = 0; i < kernel_elf_header.e_phnum; i++) {
|
||||||
auto& kernel_program_header = kernel_program_headers[i];
|
auto& kernel_program_header = kernel_program_headers[i];
|
||||||
if (kernel_program_header.p_type != PT_LOAD)
|
if (kernel_program_header.p_type != PT_LOAD)
|
||||||
continue;
|
continue;
|
||||||
|
@ -113,14 +117,14 @@ extern "C" [[noreturn]] void init()
|
||||||
|
|
||||||
reload_cr3();
|
reload_cr3();
|
||||||
|
|
||||||
for (ssize_t i = kernel_elf_header->e_phnum - 1; i >= 0; i--) {
|
for (ssize_t i = kernel_elf_header.e_phnum - 1; i >= 0; i--) {
|
||||||
auto& kernel_program_header = kernel_program_headers[i];
|
auto& kernel_program_header = kernel_program_headers[i];
|
||||||
if (kernel_program_header.p_type != PT_LOAD)
|
if (kernel_program_header.p_type != PT_LOAD)
|
||||||
continue;
|
continue;
|
||||||
__builtin_memmove((u8*)kernel_program_header.p_vaddr, kernel_image + kernel_program_header.p_offset, kernel_program_header.p_filesz);
|
__builtin_memmove((u8*)kernel_program_header.p_vaddr, kernel_image + kernel_program_header.p_offset, kernel_program_header.p_filesz);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ssize_t i = kernel_elf_header->e_phnum - 1; i >= 0; i--) {
|
for (ssize_t i = kernel_elf_header.e_phnum - 1; i >= 0; i--) {
|
||||||
auto& kernel_program_header = kernel_program_headers[i];
|
auto& kernel_program_header = kernel_program_headers[i];
|
||||||
if (kernel_program_header.p_type != PT_LOAD)
|
if (kernel_program_header.p_type != PT_LOAD)
|
||||||
continue;
|
continue;
|
||||||
|
@ -166,7 +170,7 @@ extern "C" [[noreturn]] void init()
|
||||||
for (FlatPtr vaddr = (FlatPtr)end_of_prekernel_image; vaddr < MAX_KERNEL_SIZE; vaddr += PAGE_SIZE)
|
for (FlatPtr vaddr = (FlatPtr)end_of_prekernel_image; vaddr < MAX_KERNEL_SIZE; vaddr += PAGE_SIZE)
|
||||||
boot_pd0_pts[vaddr >> 12 & 0x1ff] = 0;
|
boot_pd0_pts[vaddr >> 12 & 0x1ff] = 0;
|
||||||
|
|
||||||
void (*entry)(BootInfo const&) = (void (*)(BootInfo const&))kernel_elf_header->e_entry;
|
void (*entry)(BootInfo const&) = (void (*)(BootInfo const&))kernel_elf_header.e_entry;
|
||||||
entry(*adjust_by_load_base(&info));
|
entry(*adjust_by_load_base(&info));
|
||||||
|
|
||||||
__builtin_unreachable();
|
__builtin_unreachable();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue