sim, arch-arm: Restore capability of running without a kernel

The following patch:

https://gem5-review.googlesource.com/c/public/gem5/+/24283

Removed the capability of starting a gem5 simulation without
a kernel object. This patch is restoring it

Change-Id: I6d751bac386cbb250b3593bb12463140dc964ab3
Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/28147
Reviewed-by: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
Giacomo Travaglini
2020-04-24 14:12:54 +01:00
parent 26454e8072
commit a0038f7aec
2 changed files with 35 additions and 26 deletions

View File

@@ -69,9 +69,13 @@ SkipFunc::returnFromFuncIn(ThreadContext *tc)
}
}
FsWorkload::FsWorkload(Params *p) : KernelWorkload(*p),
kernelEntry((kernelObj->entryPoint() & loadAddrMask()) + loadAddrOffset())
FsWorkload::FsWorkload(Params *p) : KernelWorkload(*p)
{
if (kernelObj) {
kernelEntry = (kernelObj->entryPoint() & loadAddrMask()) +
loadAddrOffset();
}
bootLoaders.reserve(p->boot_loader.size());
for (const auto &bl : p->boot_loader) {
std::unique_ptr<Loader::ObjectFile> bl_obj;

View File

@@ -38,39 +38,44 @@ KernelWorkload::KernelWorkload(const Params &p) : Workload(&p), _params(p),
if (!Loader::debugSymbolTable)
Loader::debugSymbolTable = new Loader::SymbolTable;
kernelObj = Loader::createObjectFile(params().object_file);
inform("kernel located at: %s", params().object_file);
if (params().object_file == "") {
inform("No kernel set for full system simulation. "
"Assuming you know what you're doing.");
} else {
kernelObj = Loader::createObjectFile(params().object_file);
inform("kernel located at: %s", params().object_file);
fatal_if(!kernelObj,
"Could not load kernel file %s", params().object_file);
fatal_if(!kernelObj,
"Could not load kernel file %s", params().object_file);
image = kernelObj->buildImage();
image = kernelObj->buildImage();
_start = image.minAddr();
_end = image.maxAddr();
_start = image.minAddr();
_end = image.maxAddr();
// If load_addr_mask is set to 0x0, then calculate the smallest mask to
// cover all kernel addresses so gem5 can relocate the kernel to a new
// offset.
if (_loadAddrMask == 0)
_loadAddrMask = mask(findMsbSet(_end - _start) + 1);
// If load_addr_mask is set to 0x0, then calculate the smallest mask to
// cover all kernel addresses so gem5 can relocate the kernel to a new
// offset.
if (_loadAddrMask == 0)
_loadAddrMask = mask(findMsbSet(_end - _start) + 1);
image.move([this](Addr a) {
return (a & _loadAddrMask) + _loadAddrOffset;
});
image.move([this](Addr a) {
return (a & _loadAddrMask) + _loadAddrOffset;
});
// load symbols
fatal_if(!kernelObj->loadGlobalSymbols(kernelSymtab),
"Could not load kernel symbols.");
// load symbols
fatal_if(!kernelObj->loadGlobalSymbols(kernelSymtab),
"Could not load kernel symbols.");
fatal_if(!kernelObj->loadLocalSymbols(kernelSymtab),
"Could not load kernel local symbols.");
fatal_if(!kernelObj->loadLocalSymbols(kernelSymtab),
"Could not load kernel local symbols.");
fatal_if(!kernelObj->loadGlobalSymbols(Loader::debugSymbolTable),
"Could not load kernel symbols.");
fatal_if(!kernelObj->loadGlobalSymbols(Loader::debugSymbolTable),
"Could not load kernel symbols.");
fatal_if(!kernelObj->loadLocalSymbols(Loader::debugSymbolTable),
"Could not load kernel local symbols.");
fatal_if(!kernelObj->loadLocalSymbols(Loader::debugSymbolTable),
"Could not load kernel local symbols.");
}
// Loading only needs to happen once and after memory system is
// connected so it will happen in initState()