From 44771b28cd4bacebdb3cb67d2aff723308831b85 Mon Sep 17 00:00:00 2001 From: rsahwe Date: Wed, 14 May 2025 21:30:35 +0000 Subject: [PATCH 1/2] Update boot/common/loader/elf.c --- boot/common/loader/elf.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/boot/common/loader/elf.c b/boot/common/loader/elf.c index bd17021..ba8e313 100644 --- a/boot/common/loader/elf.c +++ b/boot/common/loader/elf.c @@ -52,13 +52,13 @@ 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; - if ((ph[i].p_vaddr & (~(max_align - 1))) < lowest) { - lowest = ph[i].p_vaddr & ~(max_align - 1); - } + lowest = ph[i].p_vaddr & ~(max_align - 1); uint64_t flags = VMM_PRESENT; if (ph[i].p_flags & PF_W) @@ -66,7 +66,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); + uint64_t phys = ((uint64_t)mem_alloc(ph[i].p_memsz + ph[i].p_vaddr - lowest + 4096) + 4096) & ~0xFFF; if (!phys) { debug("elf64_load(): Out of memory\n"); return 0; @@ -74,12 +74,25 @@ 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); - map_page(pagemap, ph[i].p_vaddr, phys, flags); - memcpy((void*)ph[i].p_vaddr - lowest, data + ph[i].p_offset, 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 } debug("elf64_load(): ELF loaded successfully, entry: 0x%llx\n", header->e_entry); - return (uintptr_t)((uint8_t *)data + header->e_entry); + return (uintptr_t)kernel_address; } uintptr_t elf_load(char *data, pagetable *pagemap) From 03802f538c510efa5221bc477203bf855b18c077 Mon Sep 17 00:00:00 2001 From: rsahwe Date: Wed, 21 May 2025 15:13:01 +0200 Subject: [PATCH 2/2] Cleanup --- boot/common/loader/elf.c | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/boot/common/loader/elf.c b/boot/common/loader/elf.c index ba8e313..e79601f 100644 --- a/boot/common/loader/elf.c +++ b/boot/common/loader/elf.c @@ -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)