[Mammoth] Load non aligned ELF program sections properly.

Previously we would write into a memory object for an offset address but
when it would be mapped into the address space it would be page aligned.
This commit is contained in:
Drew Galbraith 2023-11-19 22:52:32 -08:00
parent a0a673ee16
commit 0f2d6d7cc8
1 changed files with 9 additions and 3 deletions

View File

@ -71,8 +71,9 @@ uint64_t LoadElfProgram(uint64_t base, uint64_t as_cap) {
#if MAM_PROC_DEBUG
dbgln("Create mem object");
#endif
uint64_t page_offset = program.vaddr & 0xFFF;
uint64_t mem_cap;
uint64_t size = program.memsz;
uint64_t size = page_offset + program.memsz;
check(ZMemoryObjectCreate(size, &mem_cap));
#if MAM_PROC_DEBUG
@ -80,16 +81,21 @@ uint64_t LoadElfProgram(uint64_t base, uint64_t as_cap) {
#endif
uint64_t vaddr;
check(ZAddressSpaceMap(gSelfVmasCap, 0, mem_cap, &vaddr));
uint8_t* offset = reinterpret_cast<uint8_t*>(vaddr);
for (uint64_t j = 0; j < size; j++) {
offset[j] = 0;
}
#if MAM_PROC_DEBUG
dbgln("Copy");
#endif
memcpy(base + program.offset, program.filesz, vaddr);
memcpy(base + program.offset, program.filesz, vaddr + page_offset);
#if MAM_PROC_DEBUG
dbgln("Map Foreign");
#endif
check(ZAddressSpaceMap(as_cap, program.vaddr, mem_cap, &vaddr));
check(
ZAddressSpaceMap(as_cap, program.vaddr - page_offset, mem_cap, &vaddr));
}
return header->entry;
}