O3: When waiting to handle an interrupt, let everything drain out.
authorGabe Black <gblack@eecs.umich.edu>
Tue, 9 Aug 2011 10:37:43 +0000 (03:37 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Tue, 9 Aug 2011 10:37:43 +0000 (03:37 -0700)
Before this change, the commit stage would wait until the ROB and store queue
were empty before recognizing an interrupt. The fetch stage would stop
generating instructions at an appropriate point, so commit would then wait
until a valid time to interrupt the instruction stream. Instructions might be
in flight after fetch but not the in the ROB or store queue (in rename, for
instance), so this change makes commit wait until all in flight instructions
are finished.

src/cpu/o3/commit_impl.hh

index f579305dca7886ae3e07ec2b0f7ad9aade08ff6b..c0946c16fabf83d29c0adabd80c8c690367b7dc2 100644 (file)
@@ -714,9 +714,9 @@ DefaultCommit<Impl>::handleInterrupt()
         return;
     }
 
-    // Wait until the ROB is empty and all stores have drained in
-    // order to enter the interrupt.
-    if (rob->isEmpty() && !iewStage->hasStoresToWB()) {
+    // Wait until all in flight instructions are finished before enterring
+    // the interrupt.
+    if (cpu->instList.empty()) {
         // Squash or record that I need to squash this cycle if
         // an interrupt needed to be handled.
         DPRINTF(Commit, "Interrupt detected.\n");