From a6632625f471e52ef7da0cf491ac903f679cad43 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Mon, 14 Feb 2022 00:18:29 -0800 Subject: [PATCH] [srv.init] Fix VMA size for non-aligned segments Another issue related to the bug fix in 3be4b10 - if the segment is non-aligned, the size of the VMA needs to be seg.mem_size + the prologue size. Also renamed the variables from prelude/prologue to prologue/epilogue; it must have been late at night that I wrote that... --- src/user/srv.init/loader.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/user/srv.init/loader.cpp b/src/user/srv.init/loader.cpp index 8b009f7..fe544ba 100644 --- a/src/user/srv.init/loader.cpp +++ b/src/user/srv.init/loader.cpp @@ -71,22 +71,22 @@ load_program(const module_program &prog, j6_handle_t sys, char *err_msg) if (seg.flags && elf::segment_flags::exec) flags |= j6_vm_flag_exec; + uintptr_t start = prog.base_address + seg.offset; + size_t prologue = start & 0xfff; + size_t epilogue = seg.mem_size - (prologue+seg.file_size); + j6_handle_t sub_vma = j6_handle_invalid; - res = j6_vma_create_map(&sub_vma, seg.mem_size, load_addr, flags); + res = j6_vma_create_map(&sub_vma, seg.mem_size+prologue, load_addr, flags); if (res != j6_status_ok) { sprintf(err_msg, " ** error loading program '%s': creating sub vma: %lx", prog.filename, res); return false; } - uintptr_t start = prog.base_address + seg.offset; - size_t prelude = start & 0xfff; - size_t prologue = seg.mem_size - (prelude+seg.file_size); - uint8_t *src = reinterpret_cast(start); uint8_t *dest = reinterpret_cast(load_addr); - memset(dest, 0, prelude); - memcpy(dest+prelude, src, seg.file_size); - memset(dest+prelude+seg.file_size, 0, prologue); + memset(dest, 0, prologue); + memcpy(dest+prologue, src, seg.file_size); + memset(dest+prologue+seg.file_size, 0, epilogue); res = j6_vma_map(sub_vma, proc, seg.vaddr & ~0xfffull); if (res != j6_status_ok) {