cpu: Fix o3 quiesce fetch bug
authorMitch Hayenga <mitch.hayenga@arm.com>
Wed, 3 Sep 2014 11:42:38 +0000 (07:42 -0400)
committerMitch Hayenga <mitch.hayenga@arm.com>
Wed, 3 Sep 2014 11:42:38 +0000 (07:42 -0400)
O3 is supposed to stop fetching instructions once a quiesce is encountered.
However due to a bug, it would continue fetching instructions from the current
fetch buffer.  This is because of a break statment that only broke out of the
first of 2 nested loops.  It should have broken out of both.

src/cpu/o3/fetch_impl.hh

index d583ae7b6306073c26cb50bd0ac94a76809d49cb..e20d2970a8b896acd7a41a8e87ffc75b180fe065 100644 (file)
@@ -1236,6 +1236,9 @@ DefaultFetch<Impl>::fetch(bool &status_change)
     // ended this fetch block.
     bool predictedBranch = false;
 
+    // Need to halt fetch if quiesce instruction detected
+    bool quiesce = false;
+
     TheISA::MachInst *cacheInsts =
         reinterpret_cast<TheISA::MachInst *>(fetchBuffer[tid]);
 
@@ -1246,7 +1249,7 @@ DefaultFetch<Impl>::fetch(bool &status_change)
     // Keep issuing while fetchWidth is available and branch is not
     // predicted taken
     while (numInst < fetchWidth && fetchQueue[tid].size() < fetchQueueSize
-           && !predictedBranch) {
+           && !predictedBranch && !quiesce) {
         // We need to process more memory if we aren't going to get a
         // StaticInst from the rom, the current macroop, or what's already
         // in the decoder.
@@ -1363,9 +1366,10 @@ DefaultFetch<Impl>::fetch(bool &status_change)
 
             if (instruction->isQuiesce()) {
                 DPRINTF(Fetch,
-                        "Quiesce instruction encountered, halting fetch!");
+                        "Quiesce instruction encountered, halting fetch!\n");
                 fetchStatus[tid] = QuiescePending;
                 status_change = true;
+                quiesce = true;
                 break;
             }
         } while ((curMacroop || decoder[tid]->instReady()) &&