From 0aa4a1f5f16888f1955be8ae1c509f1a969c74a8 Mon Sep 17 00:00:00 2001 From: Drew Galbraith Date: Sat, 17 Aug 2024 20:18:54 -0700 Subject: [PATCH] [Zion] Allow loading from an offset program segment. --- zion/loader/init_loader.cpp | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/zion/loader/init_loader.cpp b/zion/loader/init_loader.cpp index 285fc37..b05c70a 100644 --- a/zion/loader/init_loader.cpp +++ b/zion/loader/init_loader.cpp @@ -13,7 +13,7 @@ #include "scheduler/process_manager.h" #include "scheduler/scheduler.h" -#define K_INIT_DEBUG 0 +#define K_INIT_DEBUG 1 namespace { @@ -67,6 +67,9 @@ uint64_t LoadElfProgram(Process& dest_proc, uint64_t base, uint64_t offset) { reinterpret_cast(base + header->phoff); for (uint64_t i = 0; i < header->phnum; i++) { Elf64ProgramHeader& program = programs[i]; + if (program.type != 1) { + continue; + } #if K_INIT_DEBUG dbgln( "prog: type: {}, flags: {}, offset: {}\n vaddr: {x}, paddr: {x}\n " @@ -74,12 +77,19 @@ uint64_t LoadElfProgram(Process& dest_proc, uint64_t base, uint64_t offset) { program.type, program.flags, program.offset, program.vaddr, program.paddr, program.filesz, program.memsz, program.align); #endif - auto mem_obj = glcr::MakeRefCounted(program.memsz); - mem_obj->CopyBytesToObject(base + program.offset, program.filesz); - PANIC_ON_ERR( - dest_proc.vmas()->MapInMemoryObject( - program.vaddr, glcr::StaticCastRefPtr(mem_obj)), - "Couldn't map in init program."); + uint64_t page_offset = program.vaddr & 0xFFF; + auto mem_obj = + glcr::MakeRefCounted(program.memsz + page_offset); + + // Super hacky but if we adjust the offsets to handle a non-aligned page. + mem_obj->CopyBytesToObject(base + program.offset - page_offset, + program.filesz + page_offset); + auto map_res = dest_proc.vmas()->MapInMemoryObject( + program.vaddr - page_offset, + glcr::StaticCastRefPtr(mem_obj)); + if (map_res != glcr::OK) { + panic("Couldn't map in init program {}", map_res); + } } return header->entry; }