[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...
This commit is contained in:
Justin C. Miller
2022-02-14 00:18:29 -08:00
parent b353d68193
commit a6632625f4

View File

@@ -71,22 +71,22 @@ load_program(const module_program &prog, j6_handle_t sys, char *err_msg)
if (seg.flags && elf::segment_flags::exec) if (seg.flags && elf::segment_flags::exec)
flags |= j6_vm_flag_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; 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) { if (res != j6_status_ok) {
sprintf(err_msg, " ** error loading program '%s': creating sub vma: %lx", prog.filename, res); sprintf(err_msg, " ** error loading program '%s': creating sub vma: %lx", prog.filename, res);
return false; 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<uint8_t *>(start); uint8_t *src = reinterpret_cast<uint8_t *>(start);
uint8_t *dest = reinterpret_cast<uint8_t *>(load_addr); uint8_t *dest = reinterpret_cast<uint8_t *>(load_addr);
memset(dest, 0, prelude); memset(dest, 0, prologue);
memcpy(dest+prelude, src, seg.file_size); memcpy(dest+prologue, src, seg.file_size);
memset(dest+prelude+seg.file_size, 0, prologue); memset(dest+prologue+seg.file_size, 0, epilogue);
res = j6_vma_map(sub_vma, proc, seg.vaddr & ~0xfffull); res = j6_vma_map(sub_vma, proc, seg.vaddr & ~0xfffull);
if (res != j6_status_ok) { if (res != j6_status_ok) {