diff --git a/configs/dram/low_power_sweep.py b/configs/dram/low_power_sweep.py index c21a180215..db02a06a81 100644 --- a/configs/dram/low_power_sweep.py +++ b/configs/dram/low_power_sweep.py @@ -90,8 +90,6 @@ system.clk_domain = SrcClockDomain(clock = '2.0GHz', voltage_domain = VoltageDomain(voltage = '1V')) -system.workload = SEWorkload() - # We are fine with 256 MB memory for now. mem_range = AddrRange('256MB') # Start address is 0 diff --git a/src/sim/System.py b/src/sim/System.py index d7b88b0226..115fb94f23 100644 --- a/src/sim/System.py +++ b/src/sim/System.py @@ -44,6 +44,7 @@ from m5.proxy import * from m5.objects.DVFSHandler import * from m5.objects.SimpleMemory import * +from m5.objects.Workload import StubWorkload class MemoryMode(Enum): vals = ['invalid', 'atomic', 'timing', 'atomic_noncaching'] @@ -117,7 +118,7 @@ class System(SimObject): work_cpus_ckpt_count = Param.Counter(0, "create checkpoint when active cpu count value is reached") - workload = Param.Workload(NULL, "Workload to run on this system") + workload = Param.Workload(StubWorkload(), "Workload to run on this system") init_param = Param.UInt64(0, "numerical value to pass into simulator") readfile = Param.String("", "file to read startup script from") symbolfile = Param.String("", "file to get the symbols from") diff --git a/src/sim/Workload.py b/src/sim/Workload.py index 74d2306122..8d6316435d 100644 --- a/src/sim/Workload.py +++ b/src/sim/Workload.py @@ -37,6 +37,13 @@ class Workload(SimObject): wait_for_remote_gdb = Param.Bool(False, "Wait for a remote GDB connection"); +class StubWorkload(Workload): + type = 'StubWorkload' + cxx_header = "sim/workload.hh" + cxx_class = 'gem5::StubWorkload' + + entry = Param.Addr(0, 'Dummy entry point for this workload.') + class KernelWorkload(Workload): type = 'KernelWorkload' cxx_header = "sim/kernel_workload.hh" diff --git a/src/sim/system.cc b/src/sim/system.cc index 14e6a78f4a..86ba3be2d8 100644 --- a/src/sim/system.cc +++ b/src/sim/system.cc @@ -96,9 +96,7 @@ void System::Threads::Thread::quiesce() const { context->suspend(); - auto *workload = context->getSystemPtr()->workload; - if (workload) - workload->recordQuiesce(); + context->getSystemPtr()->workload->recordQuiesce(); } void @@ -217,8 +215,9 @@ System::System(const Params &p) AddrRange(1, 0)), // Create an empty range if disabled redirectPaths(p.redirect_paths) { - if (workload) - workload->setSystem(this); + panic_if(!workload, "No workload set for system %s " + "(could use StubWorkload?).", name()); + workload->setSystem(this); // add self to global system list systemList.push_back(this); @@ -277,8 +276,7 @@ System::registerThreadContext(ThreadContext *tc, ContextID assigned) { threads.insert(tc, assigned); - if (workload) - workload->registerThreadContext(tc); + workload->registerThreadContext(tc); for (auto *e: liveEvents) tc->schedule(e); @@ -310,8 +308,7 @@ System::replaceThreadContext(ThreadContext *tc, ContextID context_id) auto *otc = threads[context_id]; threads.replace(tc, context_id); - if (workload) - workload->replaceThreadContext(tc); + workload->replaceThreadContext(tc); for (auto *e: liveEvents) { otc->remove(e); @@ -454,7 +451,7 @@ System::workItemEnd(uint32_t tid, uint32_t workid) bool System::trapToGdb(int signal, ContextID ctx_id) const { - return workload && workload->trapToGdb(signal, ctx_id); + return workload->trapToGdb(signal, ctx_id); } void diff --git a/src/sim/workload.hh b/src/sim/workload.hh index fa62555ba5..c09c56c2f0 100644 --- a/src/sim/workload.hh +++ b/src/sim/workload.hh @@ -33,6 +33,7 @@ #include "base/loader/object_file.hh" #include "base/loader/symtab.hh" +#include "params/StubWorkload.hh" #include "params/Workload.hh" #include "sim/sim_object.hh" #include "sim/stats.hh" @@ -159,6 +160,29 @@ class Workload : public SimObject /** @} */ }; +class StubWorkload : public Workload +{ + private: + PARAMS(StubWorkload); + loader::SymbolTable _symtab; + + public: + StubWorkload(const StubWorkloadParams ¶ms) : Workload(params) {} + + Addr getEntry() const override { return params().entry; } + loader::Arch getArch() const override { return loader::UnknownArch; } + const loader::SymbolTable & + symtab(ThreadContext *tc) override + { + return _symtab; + } + bool + insertSymbol(const loader::Symbol &symbol) override + { + return _symtab.insert(symbol); + } +}; + } // namespace gem5 #endif // __SIM_WORKLOAD_HH__