summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Sandberg <Andreas.Sandberg@ARM.com>2013-01-07 13:05:44 -0500
committerAndreas Sandberg <Andreas.Sandberg@ARM.com>2013-01-07 13:05:44 -0500
commit901258c22b631cd7c14e564bd5f1cde36347515e (patch)
tree0f60293252ffd01829c88800363c11f716e88677
parent4ae02295d59036fa2f9d272ee288e0321bb8257a (diff)
downloadgem5-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.cc4
-rw-r--r--src/cpu/simple/atomic.cc4
-rw-r--r--src/cpu/simple/timing.cc4
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.