cpu: Consider instructions waiting for FU completion in draining
authorAndreas Hansson <andreas.hansson@arm.com>
Thu, 27 Jun 2013 09:49:49 +0000 (05:49 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Thu, 27 Jun 2013 09:49:49 +0000 (05:49 -0400)
This patch changes the IEW drain check to include the FU pool as there
can be instructions that are "stored" in FU completion events and thus
not covered by the existing checks. With this patch, we simply include
a check to see if all the FUs are considered non-busy in the next
tick.

Without this patch, the pc-switcheroo-full regression fails after
minor changes to the cache timing (aligning to clock edge).

src/cpu/o3/fu_pool.cc
src/cpu/o3/fu_pool.hh
src/cpu/o3/iew_impl.hh

index 78af428dbcc406093224fdd54d8f0def1f85b1bf..3edc2c35b1e252db645c8725621db1de147cb8b9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012 ARM Limited
+ * Copyright (c) 2012-2013 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -255,12 +255,14 @@ FUPool::dump()
     }
 }
 
-void
-FUPool::drainSanityCheck() const
+bool
+FUPool::isDrained() const
 {
-    assert(unitsToBeFreed.empty());
+    bool is_drained = true;
     for (int i = 0; i < numFU; i++)
-        assert(!unitBusy[i]);
+        is_drained = is_drained && !unitBusy[i];
+
+    return is_drained;
 }
 
 //
index 85912af3a08a806f33875601c54a1dd37ec307f6..79b2adf835872c3db6075759d6ef9252901c5271 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012 ARM Limited
+ * Copyright (c) 2012-2013 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -169,8 +169,8 @@ class FUPool : public SimObject
         return maxIssueLatencies[capability];
     }
 
-    /** Perform sanity checks after a drain. */
-    void drainSanityCheck() const;
+    /** Have all the FUs drained? */
+    bool isDrained() const;
 
     /** Takes over from another CPU's thread. */
     void takeOverFrom() {};
index 5bd5f6ae9795014b1fc845b9eb636d59d05256e6..5d18789c3552cdd73d05d12e7e5946ab9b18f177 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2012 ARM Limited
+ * Copyright (c) 2010-2013 ARM Limited
  * All rights reserved.
  *
  * The license below extends only to copyright in the software and shall
@@ -376,6 +376,14 @@ DefaultIEW<Impl>::isDrained() const
         }
     }
 
+    // Also check the FU pool as instructions are "stored" in FU
+    // completion events until they are done and not accounted for
+    // above
+    if (drained && !fuPool->isDrained()) {
+        DPRINTF(Drain, "FU pool still busy.\n");
+        drained = false;
+    }
+
     return drained;
 }
 
@@ -387,7 +395,6 @@ DefaultIEW<Impl>::drainSanityCheck() const
 
     instQueue.drainSanityCheck();
     ldstQueue.drainSanityCheck();
-    fuPool->drainSanityCheck();
 }
 
 template <class Impl>