O3: Fix pipeline restart when a table walk completes in the fetch stage.
authorGiacomo Gabrielli <Giacomo.Gabrielli@arm.com>
Sat, 12 Feb 2011 00:29:35 +0000 (18:29 -0600)
committerGiacomo Gabrielli <Giacomo.Gabrielli@arm.com>
Sat, 12 Feb 2011 00:29:35 +0000 (18:29 -0600)
When a table walk is initiated by the fetch stage, the CPU can
potentially move to the idle state and never wake up.

The fetch stage must call cpu->wakeCPU() when a translation completes
(in finishTranslation()).

src/cpu/o3/fetch_impl.hh

index d0c83d586ed0f8f8c1569632e74e89b541442cef..2e4e4819e964ecb0d23b83e7249ef9151d89fe54 100644 (file)
@@ -604,6 +604,9 @@ DefaultFetch<Impl>::finishTranslation(Fault fault, RequestPtr mem_req)
     ThreadID tid = mem_req->threadId();
     Addr block_PC = mem_req->getVaddr();
 
+    // Wake up CPU if it was idle
+    cpu->wakeCPU();
+
     // If translation was successful, attempt to read the icache block.
     if (fault == NoFault) {
         // Build packet here.
@@ -654,6 +657,9 @@ DefaultFetch<Impl>::finishTranslation(Fault fault, RequestPtr mem_req)
         instruction->fault = fault;
         wroteToTimeBuffer = true;
 
+        DPRINTF(Activity, "Activity this cycle.\n");
+        cpu->activityThisCycle();
+
         fetchStatus[tid] = TrapPending;
 
         DPRINTF(Fetch, "[tid:%i]: Blocked, need to handle the trap.\n", tid);