Fix for bug when draining and a memory access is outstanding.
authorKevin Lim <ktlim@umich.edu>
Fri, 7 Jul 2006 20:48:44 +0000 (16:48 -0400)
committerKevin Lim <ktlim@umich.edu>
Fri, 7 Jul 2006 20:48:44 +0000 (16:48 -0400)
--HG--
extra : convert_revision : 1af782cf023ae74c2a3ff9f7aefcea880bc87936

src/cpu/o3/fetch_impl.hh

index c0cc189f27043d4801c4a1e00ebe1e843a47c172..03836f47cb8b7392c0af5691f253e08682fc35c7 100644 (file)
@@ -354,22 +354,23 @@ DefaultFetch<Impl>::processCacheCompletion(PacketPtr pkt)
     // to return.
     if (fetchStatus[tid] != IcacheWaitResponse ||
         pkt->req != memReq[tid] ||
-        isSwitchedOut() ||
-        drainPending) {
+        isSwitchedOut()) {
         ++fetchIcacheSquashes;
         delete pkt->req;
         delete pkt;
         return;
     }
 
-    // Wake up the CPU (if it went to sleep and was waiting on this completion
-    // event).
-    cpu->wakeCPU();
+    if (!drainPending) {
+        // Wake up the CPU (if it went to sleep and was waiting on
+        // this completion event).
+        cpu->wakeCPU();
 
-    DPRINTF(Activity, "[tid:%u] Activating fetch due to cache completion\n",
-            tid);
+        DPRINTF(Activity, "[tid:%u] Activating fetch due to cache completion\n",
+                tid);
 
-    switchToActive();
+        switchToActive();
+    }
 
     // Only switch to IcacheAccessComplete if we're not stalled as well.
     if (checkStall(tid)) {
@@ -509,7 +510,7 @@ DefaultFetch<Impl>::fetchCacheLine(Addr fetch_PC, Fault &ret_fault, unsigned tid
     unsigned flags = 0;
 #endif // FULL_SYSTEM
 
-    if (cacheBlocked || (interruptPending && flags == 0) || drainPending) {
+    if (cacheBlocked || (interruptPending && flags == 0)) {
         // Hold off fetch from getting new instructions when:
         // Cache is blocked, or
         // while an interrupt is pending and we're not in PAL mode, or
@@ -909,7 +910,7 @@ DefaultFetch<Impl>::fetch(bool &status_change)
     //////////////////////////////////////////
     int tid = getFetchingThread(fetchPolicy);
 
-    if (tid == -1) {
+    if (tid == -1 || drainPending) {
         DPRINTF(Fetch,"There are no more threads available to fetch from.\n");
 
         // Breaks looping condition in tick()