sim: Add an option to load additional kernel objects
authorAndreas Sandberg <andreas.sandberg@arm.com>
Tue, 12 Apr 2016 10:34:13 +0000 (05:34 -0500)
committerAndreas Sandberg <andreas.sandberg@arm.com>
Thu, 16 Nov 2017 11:06:29 +0000 (11:06 +0000)
There are cases where it is desirable to load a kernel and a set of
additional objects. This can, for example, be useful for testing where
the bootstrap code can be loaded from one object (the kernel) and the
test proper from another.

This changeset adds this functionality by adding a kernel_extras
vector parameter to the System class. Object files in this vector are
loaded in order after the kernel when running in full system mode.

Change-Id: I06f57c6a65a17b02eb4267bed0aa829f21bcfa3b
Reviewed-on: https://gem5-review.googlesource.com/5703
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Maintainer: Jason Lowe-Power <jason@lowepower.com>

src/sim/System.py
src/sim/system.cc
src/sim/system.hh

index 53377989d4b800cf79e519d603bf74d421132bc5..68761384b38a0d801c23751f435fe8d96a6503ec 100644 (file)
@@ -93,6 +93,7 @@ class System(MemObject):
     kernel = Param.String("", "file that contains the kernel code")
     kernel_addr_check = Param.Bool(True,
         "whether to address check on kernel (disable for baremetal)")
+    kernel_extras = VectorParam.String([],"Additional object files to load")
     readfile = Param.String("", "file to read startup script from")
     symbolfile = Param.String("", "file to get the symbols from")
     load_addr_mask = Param.UInt64(0xffffffffff,
index 42cd5e720e0d5c2a92d0059b2e3b82b287e10632..9d0b919cae22d9f00e757c767728c995436df8da 100644 (file)
@@ -174,6 +174,14 @@ System::System(Params *p)
             // Loading only needs to happen once and after memory system is
             // connected so it will happen in initState()
         }
+
+        for (const auto &obj_name : p->kernel_extras) {
+            inform("Loading additional kernel object: %s", obj_name);
+            ObjectFile *obj = createObjectFile(obj_name);
+            fatal_if(!obj, "Failed to additional kernel object '%s'.\n",
+                     obj_name);
+            kernelExtras.push_back(obj);
+        }
     }
 
     // increment the number of running systems
@@ -312,6 +320,10 @@ System::initState()
             }
             // Load program sections into memory
             kernel->loadSections(physProxy, loadAddrMask, loadAddrOffset);
+            for (const auto &extra_kernel : kernelExtras) {
+                extra_kernel->loadSections(physProxy, loadAddrMask,
+                                           loadAddrOffset);
+            }
 
             DPRINTF(Loader, "Kernel start = %#x\n", kernelStart);
             DPRINTF(Loader, "Kernel end   = %#x\n", kernelEnd);
index a656ab382fa83d2578b850d241b3b252e63eba27..acd3108a0117296cfd6ae7841e7c42b839077e1c 100644 (file)
@@ -229,6 +229,9 @@ class System : public MemObject
     /** Object pointer for the kernel code */
     ObjectFile *kernel;
 
+    /** Additional object files */
+    std::vector<ObjectFile *> kernelExtras;
+
     /** Beginning of kernel code */
     Addr kernelStart;