From 0f2d6d7cc8f62999c57b0ee11299cafcf8a1029a Mon Sep 17 00:00:00 2001 From: Drew Galbraith Date: Sun, 19 Nov 2023 22:52:32 -0800 Subject: [PATCH] [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. --- lib/mammoth/src/process.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/mammoth/src/process.cpp b/lib/mammoth/src/process.cpp index 9d59828..2d9fe30 100644 --- a/lib/mammoth/src/process.cpp +++ b/lib/mammoth/src/process.cpp @@ -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(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; }