Merge pull request 'Update boot/common/loader/elf.c' (#2) from rsahwe/aurix:main into main
Reviewed-on: #2
This commit is contained in:
commit
5b1a271d45
1 changed files with 5 additions and 8 deletions
|
@ -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++) {
|
||||
|
@ -56,9 +55,7 @@ uintptr_t elf64_load(char *data, pagetable *pagemap)
|
|||
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);
|
||||
}
|
||||
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);
|
||||
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,12 +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);
|
||||
|
||||
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);
|
||||
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)((uint8_t *)data + header->e_entry);
|
||||
return (uintptr_t)header->e_entry;
|
||||
}
|
||||
|
||||
uintptr_t elf_load(char *data, pagetable *pagemap)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue