diff options
Diffstat (limited to 'src/sim')
-rw-r--r-- | src/sim/process.cc | 16 | ||||
-rw-r--r-- | src/sim/process.hh | 4 | ||||
-rw-r--r-- | src/sim/syscall_emul.hh | 19 | ||||
-rw-r--r-- | src/sim/system.cc | 34 | ||||
-rw-r--r-- | src/sim/system.hh | 2 |
5 files changed, 47 insertions, 28 deletions
diff --git a/src/sim/process.cc b/src/sim/process.cc index 224152a32..a01cfea91 100644 --- a/src/sim/process.cc +++ b/src/sim/process.cc @@ -129,6 +129,8 @@ Process::Process(ProcessParams *params, EmulationPageTable *pTable, exitGroup = new bool(); sigchld = new bool(); + image = objFile->buildImage(); + if (!debugSymbolTable) { debugSymbolTable = new SymbolTable(); if (!objFile->loadGlobalSymbols(debugSymbolTable) || @@ -271,6 +273,16 @@ Process::revokeThreadContext(int context_id) } void +Process::init() +{ + // Patch the ld_bias for dynamic executables. + updateBias(); + + if (objFile->getInterpreter()) + interpImage = objFile->getInterpreter()->buildImage(); +} + +void Process::initState() { if (contextIds.empty()) @@ -283,6 +295,10 @@ Process::initState() tc->activate(); pTable->initState(); + + // load object file into target memory + image.write(initVirtMem); + interpImage.write(initVirtMem); } DrainState diff --git a/src/sim/process.hh b/src/sim/process.hh index ae23de420..8e353071c 100644 --- a/src/sim/process.hh +++ b/src/sim/process.hh @@ -41,6 +41,7 @@ #include <vector> #include "arch/registers.hh" +#include "base/loader/memory_image.hh" #include "base/statistics.hh" #include "base/types.hh" #include "config/the_isa.hh" @@ -69,6 +70,7 @@ class Process : public SimObject void serialize(CheckpointOut &cp) const override; void unserialize(CheckpointIn &cp) override; + void init() override; void initState() override; DrainState drain() override; @@ -182,6 +184,8 @@ class Process : public SimObject SETranslatingPortProxy initVirtMem; // memory proxy for initial image load ObjectFile *objFile; + MemoryImage image; + MemoryImage interpImage; std::vector<std::string> argv; std::vector<std::string> envp; std::string executable; diff --git a/src/sim/syscall_emul.hh b/src/sim/syscall_emul.hh index 6c3b172c2..91ddb2567 100644 --- a/src/sim/syscall_emul.hh +++ b/src/sim/syscall_emul.hh @@ -1886,17 +1886,14 @@ mmapImpl(SyscallDesc *desc, int num, ThreadContext *tc, bool is_mmap2) // executing inside the loader by checking the program counter value. // XXX: with multiprogrammed workloads or multi-node configurations, // this will not work since there is a single global symbol table. - ObjectFile *interpreter = p->getInterpreter(); - if (interpreter) { - if (interpreter->contains(tc->pcState().instAddr())) { - std::shared_ptr<FDEntry> fdep = (*p->fds)[tgt_fd]; - auto ffdp = std::dynamic_pointer_cast<FileFDEntry>(fdep); - ObjectFile *lib = createObjectFile(ffdp->getFileName()); - - if (lib) { - lib->loadAllSymbols(debugSymbolTable, - lib->minSegmentAddr(), start); - } + if (p->interpImage.contains(tc->pcState().instAddr())) { + std::shared_ptr<FDEntry> fdep = (*p->fds)[tgt_fd]; + auto ffdp = std::dynamic_pointer_cast<FileFDEntry>(fdep); + ObjectFile *lib = createObjectFile(ffdp->getFileName()); + + if (lib) { + lib->loadAllSymbols(debugSymbolTable, + lib->buildImage().minAddr(), start); } } diff --git a/src/sim/system.cc b/src/sim/system.cc index bf8b45239..87a220311 100644 --- a/src/sim/system.cc +++ b/src/sim/system.cc @@ -152,16 +152,16 @@ System::System(Params *p) } else { // Get the kernel code kernel = createObjectFile(params()->kernel); - kernel->setLoadOffset(loadAddrOffset); - kernel->setLoadMask(loadAddrMask); inform("kernel located at: %s", params()->kernel); if (kernel == NULL) fatal("Could not load kernel file %s", params()->kernel); + kernelImage = kernel->buildImage(); + // setup entry points - kernelStart = kernel->minSegmentAddr(); - kernelEnd = kernel->maxSegmentAddr(); + kernelStart = kernelImage.minAddr(); + kernelEnd = kernelImage.maxAddr(); kernelEntry = kernel->entryPoint(); // If load_addr_mask is set to 0x0, then auto-calculate @@ -170,9 +170,12 @@ System::System(Params *p) if (loadAddrMask == 0) { Addr shift_amt = findMsbSet(kernelEnd - kernelStart) + 1; loadAddrMask = ((Addr)1 << shift_amt) - 1; - kernel->setLoadMask(loadAddrMask); } + kernelImage.move([this](Addr a) { + return (a & loadAddrMask) + loadAddrOffset; + }); + // load symbols if (!kernel->loadGlobalSymbols(kernelSymtab)) fatal("could not load kernel symbols\n"); @@ -195,8 +198,6 @@ System::System(Params *p) ObjectFile *obj = createObjectFile(obj_name); fatal_if(!obj, "Failed to additional kernel object '%s'.\n", obj_name); - obj->setLoadOffset(loadAddrOffset); - obj->setLoadMask(loadAddrMask); kernelExtras.push_back(obj); } } @@ -316,25 +317,24 @@ System::initState() /** * Load the kernel code into memory */ + auto mapper = [this](Addr a) { + return (a & loadAddrMask) + loadAddrOffset; + }; if (params()->kernel != "") { if (params()->kernel_addr_check) { // Validate kernel mapping before loading binary - if (!(isMemAddr((kernelStart & loadAddrMask) + - loadAddrOffset) && - isMemAddr((kernelEnd & loadAddrMask) + - loadAddrOffset))) { + if (!isMemAddr(mapper(kernelStart)) || + !isMemAddr(mapper(kernelEnd))) { fatal("Kernel is mapped to invalid location (not memory). " "kernelStart 0x(%x) - kernelEnd 0x(%x) %#x:%#x\n", - kernelStart, - kernelEnd, (kernelStart & loadAddrMask) + - loadAddrOffset, - (kernelEnd & loadAddrMask) + loadAddrOffset); + kernelStart, kernelEnd, + mapper(kernelStart), mapper(kernelEnd)); } } // Load program sections into memory - kernel->loadSegments(physProxy); + kernelImage.write(physProxy); for (const auto &extra_kernel : kernelExtras) - extra_kernel->loadSegments(physProxy); + extra_kernel->buildImage().move(mapper).write(physProxy); DPRINTF(Loader, "Kernel start = %#x\n", kernelStart); DPRINTF(Loader, "Kernel end = %#x\n", kernelEnd); diff --git a/src/sim/system.hh b/src/sim/system.hh index c618e3944..345d83c2a 100644 --- a/src/sim/system.hh +++ b/src/sim/system.hh @@ -53,6 +53,7 @@ #include <vector> #include "arch/isa_traits.hh" +#include "base/loader/memory_image.hh" #include "base/loader/symtab.hh" #include "base/statistics.hh" #include "config/the_isa.hh" @@ -224,6 +225,7 @@ class System : public SimObject /** Object pointer for the kernel code */ ObjectFile *kernel; + MemoryImage kernelImage; /** Additional object files */ std::vector<ObjectFile *> kernelExtras; |