[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:
parent
a0a673ee16
commit
0f2d6d7cc8
|
@ -71,8 +71,9 @@ uint64_t LoadElfProgram(uint64_t base, uint64_t as_cap) {
|
||||||
#if MAM_PROC_DEBUG
|
#if MAM_PROC_DEBUG
|
||||||
dbgln("Create mem object");
|
dbgln("Create mem object");
|
||||||
#endif
|
#endif
|
||||||
|
uint64_t page_offset = program.vaddr & 0xFFF;
|
||||||
uint64_t mem_cap;
|
uint64_t mem_cap;
|
||||||
uint64_t size = program.memsz;
|
uint64_t size = page_offset + program.memsz;
|
||||||
check(ZMemoryObjectCreate(size, &mem_cap));
|
check(ZMemoryObjectCreate(size, &mem_cap));
|
||||||
|
|
||||||
#if MAM_PROC_DEBUG
|
#if MAM_PROC_DEBUG
|
||||||
|
@ -80,16 +81,21 @@ uint64_t LoadElfProgram(uint64_t base, uint64_t as_cap) {
|
||||||
#endif
|
#endif
|
||||||
uint64_t vaddr;
|
uint64_t vaddr;
|
||||||
check(ZAddressSpaceMap(gSelfVmasCap, 0, mem_cap, &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
|
#if MAM_PROC_DEBUG
|
||||||
dbgln("Copy");
|
dbgln("Copy");
|
||||||
#endif
|
#endif
|
||||||
memcpy(base + program.offset, program.filesz, vaddr);
|
memcpy(base + program.offset, program.filesz, vaddr + page_offset);
|
||||||
|
|
||||||
#if MAM_PROC_DEBUG
|
#if MAM_PROC_DEBUG
|
||||||
dbgln("Map Foreign");
|
dbgln("Map Foreign");
|
||||||
#endif
|
#endif
|
||||||
check(ZAddressSpaceMap(as_cap, program.vaddr, mem_cap, &vaddr));
|
check(
|
||||||
|
ZAddressSpaceMap(as_cap, program.vaddr - page_offset, mem_cap, &vaddr));
|
||||||
}
|
}
|
||||||
return header->entry;
|
return header->entry;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue