sim, arch-arm: Restore capability of running without a kernel
authorGiacomo Travaglini <giacomo.travaglini@arm.com>
Fri, 24 Apr 2020 13:12:54 +0000 (14:12 +0100)
committerGiacomo Travaglini <giacomo.travaglini@arm.com>
Tue, 28 Apr 2020 09:51:36 +0000 (09:51 +0000)
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>
src/arch/arm/fs_workload.cc
src/sim/kernel_workload.cc

index 550d8ded0eab3f12b757781f5c62a38e4484ef94..09c7bb2e73f92b994db587f4b382596fc23094d2 100644 (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;
index f107d696e706220ae00748b3ef485ed033547355..415ff9630368b0194cfcb2343462e0fa41526c1c 100644 (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()