summaryrefslogtreecommitdiff
path: root/src/sim
diff options
context:
space:
mode:
Diffstat (limited to 'src/sim')
-rw-r--r--src/sim/process.cc16
-rw-r--r--src/sim/process.hh4
-rw-r--r--src/sim/syscall_emul.hh19
-rw-r--r--src/sim/system.cc34
-rw-r--r--src/sim/system.hh2
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;