diff --git a/src/sim/System.py b/src/sim/System.py index 53377989d4..68761384b3 100644 --- a/src/sim/System.py +++ b/src/sim/System.py @@ -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, diff --git a/src/sim/system.cc b/src/sim/system.cc index 42cd5e720e..9d0b919cae 100644 --- a/src/sim/system.cc +++ b/src/sim/system.cc @@ -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); diff --git a/src/sim/system.hh b/src/sim/system.hh index a656ab382f..acd3108a01 100644 --- a/src/sim/system.hh +++ b/src/sim/system.hh @@ -229,6 +229,9 @@ class System : public MemObject /** Object pointer for the kernel code */ ObjectFile *kernel; + /** Additional object files */ + std::vector kernelExtras; + /** Beginning of kernel code */ Addr kernelStart;