cpu: Fix the O3 CPU Drain
authorRekai Gonzalez-Alberquilla <rekai.gonzalezalberquilla@arm.com>
Thu, 22 Sep 2016 09:49:10 +0000 (10:49 +0100)
committerRekai Gonzalez-Alberquilla <rekai.gonzalezalberquilla@arm.com>
Thu, 22 Sep 2016 09:49:10 +0000 (10:49 +0100)
The drain did not wait until stages were ready again. Therefore, as a
result of messages in the TimeBuffer being drain, the state after the
drain was not consistent and asserts fired in some places when the
draining happened after a stage got blocked, but before the notification
arrived to the previous stages.

Change-Id: Ib50b3b40b7f745b62c1eba2931dec76860824c71
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
src/cpu/o3/decode_impl.hh
src/cpu/o3/fetch_impl.hh
src/cpu/o3/iew_impl.hh
src/cpu/o3/rename_impl.hh

index 4ff82da8ef3d5f05d0ba88eb580e41e6db26d9bb..ca56ac1e442f04164211d1956d227c6421646a6e 100644 (file)
@@ -209,7 +209,8 @@ bool
 DefaultDecode<Impl>::isDrained() const
 {
     for (ThreadID tid = 0; tid < numThreads; ++tid) {
-        if (!insts[tid].empty() || !skidBuffer[tid].empty())
+        if (!insts[tid].empty() || !skidBuffer[tid].empty() ||
+                (decodeStatus[tid] != Running && decodeStatus[tid] != Idle))
             return false;
     }
     return true;
index 3b29d87d43238cae8b377f3aad9ab060b29068ec..7631b4c6ad07a36bb5144da98193b901bb6ee2fb 100644 (file)
@@ -424,8 +424,10 @@ template <class Impl>
 void
 DefaultFetch<Impl>::drainResume()
 {
-    for (ThreadID i = 0; i < numThreads; ++i)
+    for (ThreadID i = 0; i < numThreads; ++i) {
+        stalls[i].decode = false;
         stalls[i].drain = false;
+    }
 }
 
 template <class Impl>
index e02429b14bee62d11d0de8a8b62cea509edb1a4d..78b83eba678345188d98da09db3f28b9e7e45d31 100644 (file)
@@ -391,6 +391,7 @@ DefaultIEW<Impl>::isDrained() const
             DPRINTF(Drain, "%i: Skid buffer not empty.\n", tid);
             drained = false;
         }
+        drained = drained && dispatchStatus[tid] == Running;
     }
 
     // Also check the FU pool as instructions are "stored" in FU
index b6ab4cc3a53c4b86369db4a8ec4536ac91836788..00179faaef990ba664fd581e2fc57709170af49f 100644 (file)
@@ -304,7 +304,8 @@ DefaultRename<Impl>::isDrained() const
         if (instsInProgress[tid] != 0 ||
             !historyBuffer[tid].empty() ||
             !skidBuffer[tid].empty() ||
-            !insts[tid].empty())
+            !insts[tid].empty() ||
+            (renameStatus[tid] != Idle && renameStatus[tid] != Running))
             return false;
     }
     return true;