diff options
author | Andreas Sandberg <Andreas.Sandberg@ARM.com> | 2013-01-07 13:05:44 -0500 |
---|---|---|
committer | Andreas Sandberg <Andreas.Sandberg@ARM.com> | 2013-01-07 13:05:44 -0500 |
commit | 901258c22b631cd7c14e564bd5f1cde36347515e (patch) | |
tree | 0f60293252ffd01829c88800363c11f716e88677 | |
parent | 4ae02295d59036fa2f9d272ee288e0321bb8257a (diff) | |
download | gem5-901258c22b631cd7c14e564bd5f1cde36347515e.tar.xz |
cpu: Correctly call parent on switchOut() and takeOverFrom()
This patch cleans up the CPU switching functionality by making sure
that CPU models consistently call the parent on switchOut() and
takeOverFrom(). This has the following implications that might alter
current functionality:
* The call to BaseCPU::switchout() in the O3 CPU is moved from
signalDrained() (!) to switchOut().
* A call to BaseSimpleCPU::switchOut() is introduced in the simple
CPUs.
-rw-r--r-- | src/cpu/o3/cpu.cc | 4 | ||||
-rw-r--r-- | src/cpu/simple/atomic.cc | 4 | ||||
-rw-r--r-- | src/cpu/simple/timing.cc | 4 |
3 files changed, 8 insertions, 4 deletions
diff --git a/src/cpu/o3/cpu.cc b/src/cpu/o3/cpu.cc index 2613a8da3..78fbd6694 100644 --- a/src/cpu/o3/cpu.cc +++ b/src/cpu/o3/cpu.cc @@ -1192,8 +1192,6 @@ FullO3CPU<Impl>::signalDrained() setDrainState(Drainable::Drained); - BaseCPU::switchOut(); - if (drainManager) { DPRINTF(Drain, "CPU done draining, processing drain event\n"); drainManager->signalDrainDone(); @@ -1207,6 +1205,8 @@ template <class Impl> void FullO3CPU<Impl>::switchOut() { + BaseCPU::switchOut(); + fetch.switchOut(); rename.switchOut(); iew.switchOut(); diff --git a/src/cpu/simple/atomic.cc b/src/cpu/simple/atomic.cc index fffbb55d6..2d026e733 100644 --- a/src/cpu/simple/atomic.cc +++ b/src/cpu/simple/atomic.cc @@ -177,6 +177,8 @@ AtomicSimpleCPU::drainResume() void AtomicSimpleCPU::switchOut() { + BaseSimpleCPU::switchOut(); + assert(_status == BaseSimpleCPU::Running || _status == Idle); _status = SwitchedOut; @@ -187,7 +189,7 @@ AtomicSimpleCPU::switchOut() void AtomicSimpleCPU::takeOverFrom(BaseCPU *oldCPU) { - BaseCPU::takeOverFrom(oldCPU); + BaseSimpleCPU::takeOverFrom(oldCPU); assert(!tickEvent.scheduled()); diff --git a/src/cpu/simple/timing.cc b/src/cpu/simple/timing.cc index d3959c895..121db090b 100644 --- a/src/cpu/simple/timing.cc +++ b/src/cpu/simple/timing.cc @@ -163,6 +163,8 @@ TimingSimpleCPU::drainResume() void TimingSimpleCPU::switchOut() { + BaseSimpleCPU::switchOut(); + assert(_status == BaseSimpleCPU::Running || _status == Idle); _status = SwitchedOut; numCycles += curCycle() - previousCycle; @@ -177,7 +179,7 @@ TimingSimpleCPU::switchOut() void TimingSimpleCPU::takeOverFrom(BaseCPU *oldCPU) { - BaseCPU::takeOverFrom(oldCPU); + BaseSimpleCPU::takeOverFrom(oldCPU); // if any of this CPU's ThreadContexts are active, mark the CPU as // running and schedule its tick event. |