summaryrefslogtreecommitdiff
path: root/src/sim/simulate.cc
diff options
context:
space:
mode:
authorTao Zhang <tao.zhang.0924@gmail.com>2013-01-08 08:54:11 -0500
committerTao Zhang <tao.zhang.0924@gmail.com>2013-01-08 08:54:11 -0500
commit858d99b7cc6515aa6a0e75859aa7b5f460b40bb7 (patch)
tree09b76b831047c8565161f89c82cc14c63df79c81 /src/sim/simulate.cc
parent4a752b1655c531a2fd7d98dbe24239fed5261291 (diff)
downloadgem5-858d99b7cc6515aa6a0e75859aa7b5f460b40bb7.tar.xz
sim: Fix early termination in multi-core simulation under SE mode.
When "-I" (maximum instruction number) and "-F" (fastforward instruction number) are applied together, gem5 immediately exits after the cpu switching. The reason is that multiple exit events may be generated in the same cycle by Atomic CPU and inserted to mainEventQueue. However, mainEventQueue can only serve one exit event in one cycle. Therefore, the rest exit events are left in mainEventQueue without being descheduled or deleted, which causes gem5 exits immediately after the system resumes by cpu switching.
Diffstat (limited to 'src/sim/simulate.cc')
-rw-r--r--src/sim/simulate.cc14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/sim/simulate.cc b/src/sim/simulate.cc
index 6962fab9f..fb785a91f 100644
--- a/src/sim/simulate.cc
+++ b/src/sim/simulate.cc
@@ -44,6 +44,10 @@
* terminate the loop. Exported to Python via SWIG.
* @return The SimLoopExitEvent that caused the loop to exit.
*/
+
+// record the clock cycle for last exit event
+Tick lastExitTick = 0;
+
SimLoopExitEvent *
simulate(Tick num_cycles)
{
@@ -67,6 +71,16 @@ simulate(Tick num_cycles)
Event *exit_event = mainEventQueue.serviceOne();
if (exit_event != NULL) {
+ /*
+ * if there are multiple exit events in the same cycle, drain the
+ * following exit events since gem5 only allows one * exit event in
+ * a cycle
+ */
+ if (lastExitTick == curTick())
+ continue;
+ else
+ lastExitTick = curTick();
+
// hit some kind of exit event; return to Python
// event must be subclass of SimLoopExitEvent...
SimLoopExitEvent *se_event;