This commit is contained in:
rsahwe 2025-05-21 15:13:01 +02:00
parent 44771b28cd
commit 03802f538c

View file

@ -40,7 +40,6 @@ uintptr_t elf64_load(char *data, pagetable *pagemap)
struct elf_header *header = (struct elf_header *)data;
struct elf_program_header *ph = (struct elf_program_header *)((uint8_t *)data + header->e_phoff);
uint64_t lowest = UINT64_MAX;
uint64_t max_align = 0;
for (uint16_t i = 0; i < header->e_phnum; i++) {
@ -52,13 +51,11 @@ uintptr_t elf64_load(char *data, pagetable *pagemap)
}
}
uintptr_t kernel_address = 0;// OR OTHER INVALID
for (uint16_t i = 0; i < header->e_phnum; i++) {
if (ph[i].p_type != PT_LOAD)
continue;
lowest = ph[i].p_vaddr & ~(max_align - 1);
uint64_t aligned_vaddr = ph[i].p_vaddr & ~(max_align - 1);
uint64_t flags = VMM_PRESENT;
if (ph[i].p_flags & PF_W)
@ -66,7 +63,7 @@ uintptr_t elf64_load(char *data, pagetable *pagemap)
if (!(ph[i].p_flags & PF_X))
flags |= VMM_NX;
uint64_t phys = ((uint64_t)mem_alloc(ph[i].p_memsz + ph[i].p_vaddr - lowest + 4096) + 4096) & ~0xFFF;
uint64_t phys = ((uint64_t)mem_alloc(ph[i].p_memsz + ph[i].p_vaddr - aligned_vaddr + 4096) + 4096) & ~0xFFF;
if (!phys) {
debug("elf64_load(): Out of memory\n");
return 0;
@ -74,25 +71,12 @@ uintptr_t elf64_load(char *data, pagetable *pagemap)
debug("elf64_load(): phys=0x%llx, virt=0x%llx, size=%lu\n", phys, ph[i].p_vaddr, ph[i].p_filesz);
if (ph[i].p_vaddr <= header->e_entry && ph[i].p_vaddr + ph[i].p_memsz >= header->e_entry) {
kernel_address = header->e_entry;
debug("elf64_load(): found kernel entry at 0x%llx\n", kernel_address);
debug("elf64_load(): comparison to old at 0x%llx\n", (uintptr_t)data + header->e_entry - 0xffffffff80000000 + 0x1000);
}
map_page(pagemap, lowest, phys, flags);
debug("elf64_load(): memcpy(0x%llx, 0x%llx, 0x%llx)\n", (void*)(phys + ph[i].p_vaddr - lowest), data + ph[i].p_offset, ph[i].p_filesz);
debug("\n");
memcpy((void*)(phys + ph[i].p_vaddr - lowest), data + ph[i].p_offset, ph[i].p_filesz);
}
if (kernel_address == 0) {
//SOMETHING
map_page(pagemap, aligned_vaddr, phys, flags);
memcpy((void*)(phys + ph[i].p_vaddr - aligned_vaddr), data + ph[i].p_offset, ph[i].p_filesz);
}
debug("elf64_load(): ELF loaded successfully, entry: 0x%llx\n", header->e_entry);
return (uintptr_t)kernel_address;
return (uintptr_t)header->e_entry;
}
uintptr_t elf_load(char *data, pagetable *pagemap)