summaryrefslogtreecommitdiff
path: root/src/cpu/o3/fetch.hh
diff options
context:
space:
mode:
authorAndreas Sandberg <Andreas.Sandberg@ARM.com>2013-01-07 13:05:46 -0500
committerAndreas Sandberg <Andreas.Sandberg@ARM.com>2013-01-07 13:05:46 -0500
commit1814a85a055732baf98fd030441bb4c5c5db9bdc (patch)
tree33dd6adc62342a55ac3b0f4dbe9fdb9d82faa323 /src/cpu/o3/fetch.hh
parent9e8003148f78811e600e51a900f96b71cb525b60 (diff)
downloadgem5-1814a85a055732baf98fd030441bb4c5c5db9bdc.tar.xz
cpu: Rewrite O3 draining to avoid stopping in microcode
Previously, the O3 CPU could stop in the middle of a microcode sequence. This patch makes sure that the pipeline stops when it has committed a normal instruction or exited from a microcode sequence. Additionally, it makes sure that the pipeline has no instructions in flight when it is drained, which should make draining more robust. Draining is controlled in the commit stage, which checks if the next PC after a committed instruction is in microcode. If this isn't the case, it requests a squash of all instructions after that the instruction that just committed and immediately signals a drain stall to the fetch stage. The CPU then continues to execute until the pipeline and all associated buffers are empty.
Diffstat (limited to 'src/cpu/o3/fetch.hh')
-rw-r--r--src/cpu/o3/fetch.hh37
1 files changed, 21 insertions, 16 deletions
diff --git a/src/cpu/o3/fetch.hh b/src/cpu/o3/fetch.hh
index 702a45e15..fb17a9247 100644
--- a/src/cpu/o3/fetch.hh
+++ b/src/cpu/o3/fetch.hh
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2011 ARM Limited
+ * Copyright (c) 2010-2012 ARM Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
@@ -165,7 +165,6 @@ class DefaultFetch
Fetching,
TrapPending,
QuiescePending,
- SwitchOut,
ItlbWait,
IcacheWaitResponse,
IcacheWaitRetry,
@@ -226,25 +225,36 @@ class DefaultFetch
/** Processes cache completion event. */
void processCacheCompletion(PacketPtr pkt);
- /** Begins the drain of the fetch stage. */
- bool drain();
+ /** Resume after a drain. */
+ void drainResume();
- /** Resumes execution after a drain. */
- void resume();
+ /** Perform sanity checks after a drain. */
+ void drainSanityCheck() const;
- /** Tells fetch stage to prepare to be switched out. */
- void switchOut();
+ /** Has the stage drained? */
+ bool isDrained() const;
/** Takes over from another CPU's thread. */
void takeOverFrom();
- /** Checks if the fetch stage is switched out. */
- bool isSwitchedOut() { return switchedOut; }
+ /**
+ * Stall the fetch stage after reaching a safe drain point.
+ *
+ * The CPU uses this method to stop fetching instructions from a
+ * thread that has been drained. The drain stall is different from
+ * all other stalls in that it is signaled instantly from the
+ * commit stage (without the normal communication delay) when it
+ * has reached a safe point to drain from.
+ */
+ void drainStall(ThreadID tid);
/** Tells fetch to wake up from a quiesce instruction. */
void wakeFromQuiesce();
private:
+ /** Reset this pipeline stage */
+ void resetStage();
+
/** Changes the status of this stage to active, and indicates this
* to the CPU.
*/
@@ -423,6 +433,7 @@ class DefaultFetch
bool rename;
bool iew;
bool commit;
+ bool drain;
};
/** Tracks which stages are telling fetch to stall. */
@@ -490,12 +501,6 @@ class DefaultFetch
*/
bool interruptPending;
- /** Is there a drain pending. */
- bool drainPending;
-
- /** Records if fetch is switched out. */
- bool switchedOut;
-
/** Set to true if a pipelined I-cache request should be issued. */
bool issuePipelinedIfetch[Impl::MaxThreads];