Switch out fixes for CPUs.
src/cpu/o3/cpu.cc:
Fix up keeping proper state when switched out and drained.
src/cpu/simple/timing.cc:
src/cpu/simple/timing.hh:
Keep track of the event we use to schedule fetch initially and upon resume. We may have to cancel the event if the CPU is switched out.
--HG--
extra : convert_revision : 60a2a1bd2cdc67bd53ca4a67aa77166c826a4c8c
This commit is contained in:
@@ -400,7 +400,8 @@ FullO3CPU<Impl>::tick()
|
||||
}
|
||||
|
||||
if (!tickEvent.scheduled()) {
|
||||
if (_status == SwitchedOut) {
|
||||
if (_status == SwitchedOut ||
|
||||
getState() == SimObject::DrainedTiming) {
|
||||
// increment stat
|
||||
lastRunningCycle = curTick;
|
||||
} else if (!activityRec.active()) {
|
||||
@@ -793,6 +794,7 @@ FullO3CPU<Impl>::resume()
|
||||
if (!tickEvent.scheduled())
|
||||
tickEvent.schedule(curTick);
|
||||
_status = Running;
|
||||
changeState(SimObject::Timing);
|
||||
}
|
||||
|
||||
template <class Impl>
|
||||
|
||||
@@ -89,6 +89,7 @@ TimingSimpleCPU::TimingSimpleCPU(Params *p)
|
||||
_status = Idle;
|
||||
ifetch_pkt = dcache_pkt = NULL;
|
||||
drainEvent = NULL;
|
||||
fetchEvent = NULL;
|
||||
state = SimObject::Timing;
|
||||
}
|
||||
|
||||
@@ -130,9 +131,15 @@ void
|
||||
TimingSimpleCPU::resume()
|
||||
{
|
||||
if (_status != SwitchedOut && _status != Idle) {
|
||||
Event *e =
|
||||
new EventWrapper<TimingSimpleCPU, &TimingSimpleCPU::fetch>(this, true);
|
||||
e->schedule(curTick);
|
||||
// Delete the old event if it existed.
|
||||
if (fetchEvent) {
|
||||
assert(!fetchEvent->scheduled());
|
||||
delete fetchEvent;
|
||||
}
|
||||
|
||||
fetchEvent =
|
||||
new EventWrapper<TimingSimpleCPU, &TimingSimpleCPU::fetch>(this, false);
|
||||
fetchEvent->schedule(curTick);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -147,6 +154,11 @@ TimingSimpleCPU::switchOut()
|
||||
{
|
||||
assert(status() == Running || status() == Idle);
|
||||
_status = SwitchedOut;
|
||||
|
||||
// If we've been scheduled to resume but are then told to switch out,
|
||||
// we'll need to cancel it.
|
||||
if (fetchEvent && fetchEvent->scheduled())
|
||||
fetchEvent->deschedule();
|
||||
}
|
||||
|
||||
|
||||
@@ -178,9 +190,9 @@ TimingSimpleCPU::activateContext(int thread_num, int delay)
|
||||
notIdleFraction++;
|
||||
_status = Running;
|
||||
// kick things off by initiating the fetch of the next instruction
|
||||
Event *e =
|
||||
new EventWrapper<TimingSimpleCPU, &TimingSimpleCPU::fetch>(this, true);
|
||||
e->schedule(curTick + cycles(delay));
|
||||
fetchEvent =
|
||||
new EventWrapper<TimingSimpleCPU, &TimingSimpleCPU::fetch>(this, false);
|
||||
fetchEvent->schedule(curTick + cycles(delay));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -66,6 +66,8 @@ class TimingSimpleCPU : public BaseSimpleCPU
|
||||
|
||||
Event *drainEvent;
|
||||
|
||||
Event *fetchEvent;
|
||||
|
||||
private:
|
||||
|
||||
class CpuPort : public Port
|
||||
|
||||
Reference in New Issue
Block a user