mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 08:27:35 +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:
parent
5188185374
commit
56f952a5f2
1 changed files with 16 additions and 8 deletions
|
@ -75,18 +75,26 @@ extern "C" [[noreturn]] void init()
|
||||||
halt();
|
halt();
|
||||||
__builtin_memcpy(kernel_program_headers, kernel_image + kernel_elf_header.e_phoff, sizeof(ElfW(Phdr)) * kernel_elf_header.e_phnum);
|
__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_load_end;
|
||||||
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;
|
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
|
// align to 1GB
|
||||||
kernel_load_base &= ~(FlatPtr)0x3fffffff;
|
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)
|
#if ARCH(I386)
|
||||||
int pdpt_flags = 0x1;
|
int pdpt_flags = 0x1;
|
||||||
#else
|
#else
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue