1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 04:08:11 +00:00

Prekernel: Don't assume that PT_LOAD headers are ordered by address

These headers are ordered by virtual address - at least with GCC - but
that might not always be the case.
This commit is contained in:
Gunnar Beutner 2021-07-20 02:32:53 +02:00 committed by Andreas Kling
parent 5188185374
commit 56f952a5f2

View file

@ -75,18 +75,26 @@ 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_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_base, kernel_load_end;
for (size_t i = 0; i < kernel_elf_header.e_phnum; i++) {
auto& kernel_program_header = kernel_program_headers[i];
if (kernel_program_header.p_type != PT_LOAD)
continue;
auto start = kernel_program_header.p_vaddr;
auto end = start + kernel_program_header.p_memsz;
if (start < (FlatPtr)end_of_prekernel_image)
halt();
if (kernel_program_header.p_paddr < (FlatPtr)end_of_prekernel_image)
halt();
if (kernel_load_base == 0 || start < kernel_load_base)
kernel_load_base = start;
if (end > kernel_load_end)
kernel_load_end = end;
}
// align to 1GB
kernel_load_base &= ~(FlatPtr)0x3fffffff;
if (kernel_program_headers[0].p_vaddr < (FlatPtr)end_of_prekernel_image)
halt();
if (kernel_program_headers[0].p_paddr < (FlatPtr)end_of_prekernel_image)
halt();
#if ARCH(I386)
int pdpt_flags = 0x1;
#else