From: Timothy M. Jones Date: Thu, 22 Jul 2010 17:47:43 +0000 (+0100) Subject: O3CPU: O3's tick event gets squashed when it is switched out. When repeatedly X-Git-Tag: stable_2012_02_02~986 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9a3533ec843d8337e2181cc3ee2b92f78a17092c;p=gem5.git 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. --- 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::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::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())