diff options
Diffstat (limited to 'src/sim')
-rw-r--r-- | src/sim/syscall_emul.hh | 9 | ||||
-rw-r--r-- | src/sim/system.cc | 17 |
2 files changed, 12 insertions, 14 deletions
diff --git a/src/sim/syscall_emul.hh b/src/sim/syscall_emul.hh index fb6e9a168..6c3b172c2 100644 --- a/src/sim/syscall_emul.hh +++ b/src/sim/syscall_emul.hh @@ -1888,19 +1888,14 @@ mmapImpl(SyscallDesc *desc, int num, ThreadContext *tc, bool is_mmap2) // this will not work since there is a single global symbol table. ObjectFile *interpreter = p->getInterpreter(); if (interpreter) { - Addr text_start = interpreter->textBase(); - Addr text_end = text_start + interpreter->textSize(); - - Addr pc = tc->pcState().pc(); - - if (pc >= text_start && pc < text_end) { + 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->textBase(), start); + lib->minSegmentAddr(), start); } } } diff --git a/src/sim/system.cc b/src/sim/system.cc index 73f93a257..bf8b45239 100644 --- a/src/sim/system.cc +++ b/src/sim/system.cc @@ -152,14 +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); // setup entry points - kernelStart = kernel->textBase(); - kernelEnd = kernel->bssBase() + kernel->bssSize(); + kernelStart = kernel->minSegmentAddr(); + kernelEnd = kernel->maxSegmentAddr(); kernelEntry = kernel->entryPoint(); // If load_addr_mask is set to 0x0, then auto-calculate @@ -168,6 +170,7 @@ System::System(Params *p) if (loadAddrMask == 0) { Addr shift_amt = findMsbSet(kernelEnd - kernelStart) + 1; loadAddrMask = ((Addr)1 << shift_amt) - 1; + kernel->setLoadMask(loadAddrMask); } // load symbols @@ -192,6 +195,8 @@ 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); } } @@ -327,11 +332,9 @@ System::initState() } } // Load program sections into memory - kernel->loadSegments(physProxy, loadAddrMask, loadAddrOffset); - for (const auto &extra_kernel : kernelExtras) { - extra_kernel->loadSegments(physProxy, loadAddrMask, - loadAddrOffset); - } + kernel->loadSegments(physProxy); + for (const auto &extra_kernel : kernelExtras) + extra_kernel->loadSegments(physProxy); DPRINTF(Loader, "Kernel start = %#x\n", kernelStart); DPRINTF(Loader, "Kernel end = %#x\n", kernelEnd); |