changeset d0c2ba70dc12 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=d0c2ba70dc12
description:
        cpu: Minor Draining Bug

        Fixes a bug where Minor drains in the midst of committing a
        conditional store.

        While committing a conditional store, lastCommitWasEndOfMacroop is true
        (from the previous instruction) as we still haven't finished the 
conditional
        store. If a drain occurs before the cache response, Minor would check 
just
        lastCommitWasEndOfMacroop, which was true, and set 
drainState=DrainHaltFetch,
        which increases the streamSeqNum.  This caused the conditional store to 
be
        squashed when the memory responded and it completed.  However, to the 
memory
        the store succeeded, while to the instruction sequence it never 
occurred.

        In the case of an LLSC, the instruction sequence will replay the 
squashed
        STREX, which will fail as the cache is no longer in LLSC.  Then the
        instruction sequence will loop back to a LDREX, which receives the 
updated
        (incorrect) value.

        Committed by: Nilay Vaish <[email protected]>

diffstat:

 src/cpu/minor/execute.cc |  9 +++++----
 1 files changed, 5 insertions(+), 4 deletions(-)

diffs (19 lines):

diff -r 0068ad93a67e -r d0c2ba70dc12 src/cpu/minor/execute.cc
--- a/src/cpu/minor/execute.cc  Thu Nov 06 05:42:21 2014 -0600
+++ b/src/cpu/minor/execute.cc  Thu Nov 06 05:42:21 2014 -0600
@@ -1683,10 +1683,11 @@
     if (drainState == NotDraining) {
         cpu.wakeupOnEvent(Pipeline::ExecuteStageId);
 
-        /* Go to DrainCurrentInst if we're not between operations
-         *  this should probably test the LSQ as well.  Or maybe
-         *  just always go to DrainCurrentInst anyway */
-        if (lastCommitWasEndOfMacroop)
+        /* Go to DrainCurrentInst if we're between microops
+         * or waiting on an unbufferable memory operation.
+         * Otherwise we can go straight to DrainHaltFetch
+         */
+        if (isInbetweenInsts())
             setDrainState(DrainHaltFetch);
         else
             setDrainState(DrainCurrentInst);
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to