summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2018-09-04 15:09:48 -0700
committerGabe Black <gabeblack@google.com>2018-10-03 00:53:04 +0000
commitfc0e22461e51eebcc6919672802fd9f1a3bc860c (patch)
tree3de2cd0fd28d24ba02aa6eec551424bb129e8001
parent9da2cdd3783abecbc3ccf4a74b3b928eab65fae2 (diff)
downloadgem5-fc0e22461e51eebcc6919672802fd9f1a3bc860c.tar.xz
systemc: Ensure sc_stop during callbacks actually stops.
Make sure calling sc_stop during the appropriate callbacks will actually skip future action by skipping later callbacks, by flushing the scheduler before running init (so it doesn't really do anything but record that it's in running mode now), and schedule the stop event. Change-Id: I5edfbceda457df88d15bfcac4d97e8578205ec5b Reviewed-on: https://gem5-review.googlesource.com/c/12468 Reviewed-by: Gabe Black <gabeblack@google.com> Maintainer: Gabe Black <gabeblack@google.com>
-rw-r--r--src/systemc/core/kernel.cc25
1 files changed, 14 insertions, 11 deletions
diff --git a/src/systemc/core/kernel.cc b/src/systemc/core/kernel.cc
index fd51b4c52..cc65fcc20 100644
--- a/src/systemc/core/kernel.cc
+++ b/src/systemc/core/kernel.cc
@@ -86,15 +86,12 @@ Kernel::init()
callbackModule(nullptr);
for (auto c: sc_gem5::allChannels)
c->sc_chan()->before_end_of_elaboration();
-
- if (stopAfterCallbacks)
- stopWork();
}
void
Kernel::regStats()
{
- if (scMainDone)
+ if (scMainDone || stopAfterCallbacks)
return;
for (auto m: sc_gem5::allModules)
@@ -113,9 +110,6 @@ Kernel::regStats()
callbackModule(nullptr);
for (auto c: sc_gem5::allChannels)
c->sc_chan()->end_of_elaboration();
-
- if (stopAfterCallbacks)
- stopWork();
}
void
@@ -124,6 +118,11 @@ Kernel::startup()
if (scMainDone)
return;
+ schedule(t0Event, curTick());
+
+ if (stopAfterCallbacks)
+ return;
+
status(::sc_core::SC_START_OF_SIMULATION);
for (auto m: sc_gem5::allModules) {
m->sc_mod()->start_of_simulation();
@@ -142,7 +141,6 @@ Kernel::startup()
kernel->status(::sc_core::SC_RUNNING);
- schedule(t0Event, curTick());
// Run update once before the event queue starts.
::sc_gem5::scheduler.update();
}
@@ -178,9 +176,14 @@ Kernel::stopWork()
void
Kernel::t0Handler()
{
- ::sc_gem5::scheduler.initPhase();
-
- status(::sc_core::SC_RUNNING);
+ if (stopAfterCallbacks) {
+ scheduler.clear();
+ ::sc_gem5::scheduler.initPhase();
+ scheduler.scheduleStop(false);
+ } else {
+ ::sc_gem5::scheduler.initPhase();
+ status(::sc_core::SC_RUNNING);
+ }
}
Kernel *kernel;