summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimothy M. Jones <tjones1@inf.ed.ac.uk>2010-07-22 18:47:43 +0100
committerTimothy M. Jones <tjones1@inf.ed.ac.uk>2010-07-22 18:47:43 +0100
commit9a3533ec843d8337e2181cc3ee2b92f78a17092c (patch)
tree488c9c7b62a3b45c4d090c019646ca361cb5fb1b
parent8c76715979682cbf0e653128c253805a80c40269 (diff)
downloadgem5-9a3533ec843d8337e2181cc3ee2b92f78a17092c.tar.xz
O3CPU: O3's tick event gets squashed when it is switched out. When repeatedly
switching between O3 and another CPU, O3's tick event might still be scheduled in the event queue (as squashed). Therefore, check for a squashed tick event as well as a non-scheduled event when taking over from another CPU and deal with it accordingly.
-rw-r--r--src/cpu/o3/cpu.cc4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/cpu/o3/cpu.cc b/src/cpu/o3/cpu.cc
index 2a4e0176a..49bfe88e3 100644
--- a/src/cpu/o3/cpu.cc
+++ b/src/cpu/o3/cpu.cc
@@ -1143,7 +1143,7 @@ FullO3CPU<Impl>::takeOverFrom(BaseCPU *oldCPU)
iew.takeOverFrom();
commit.takeOverFrom();
- assert(!tickEvent.scheduled());
+ assert(!tickEvent.scheduled() || tickEvent.squashed());
// @todo: Figure out how to properly select the tid to put onto
// the active threads list.
@@ -1168,7 +1168,7 @@ FullO3CPU<Impl>::takeOverFrom(BaseCPU *oldCPU)
ThreadContext *tc = threadContexts[i];
if (tc->status() == ThreadContext::Active && _status != Running) {
_status = Running;
- schedule(tickEvent, nextCycle());
+ reschedule(tickEvent, nextCycle(), true);
}
}
if (!tickEvent.scheduled())