changeset 29d5891a96d6 in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=29d5891a96d6
description:
        ruby: Added SC fail indication to trace profiling

diffstat:

 src/mem/ruby/system/Sequencer.cc |  39 +++++++++++++++++++++++++++++----------
 src/mem/ruby/system/Sequencer.hh |   5 +++--
 2 files changed, 32 insertions(+), 12 deletions(-)

diffs (122 lines):

diff -r 017baf09599f -r 29d5891a96d6 src/mem/ruby/system/Sequencer.cc
--- a/src/mem/ruby/system/Sequencer.cc  Fri Aug 20 11:46:13 2010 -0700
+++ b/src/mem/ruby/system/Sequencer.cc  Fri Aug 20 11:46:13 2010 -0700
@@ -303,9 +303,15 @@
     markRemoved();
 }
 
-void
-Sequencer::handleLlscWrites(const Address& address, SequencerRequest* request)
+bool
+Sequencer::handleLlsc(const Address& address, SequencerRequest* request)
 {
+    //
+    // The success flag indicates whether the LLSC operation was successful.
+    // LL ops will always succeed, but SC may fail if the cache line is no
+    // longer locked.
+    //
+    bool success = true;
     if (request->ruby_request.type == RubyRequestType_Locked_Write) {
         if (!m_dataCache_ptr->isLocked(address, m_version)) {
             //
@@ -313,6 +319,7 @@
             // setting the extra data to zero.
             //
             request->ruby_request.pkt->req->setExtraData(0);
+            success = false;
         } else {
             //
             // For successful SC requests, indicate the success to the cpu by
@@ -320,6 +327,9 @@
             //
             request->ruby_request.pkt->req->setExtraData(1);
         }
+        //
+        // Independent of success, all SC operations must clear the lock
+        //
         m_dataCache_ptr->clearLocked(address);
     } else if (request->ruby_request.type == RubyRequestType_Locked_Read) {
         //
@@ -333,6 +343,7 @@
         //
         m_dataCache_ptr->clearLocked(address);
     }
+    return success;
 }
 
 void
@@ -366,7 +377,7 @@
     // For Alpha, properly handle LL, SC, and write requests with respect to
     // locked cache blocks.
     //
-    handleLlscWrites(address, request);
+    bool success = handleLlsc(address, request);
 
     if (request->ruby_request.type == RubyRequestType_RMW_Read) {
         m_controller->blockOnQueue(address, m_mandatory_q_ptr);
@@ -374,7 +385,7 @@
         m_controller->unblock(address);
     }
 
-    hitCallback(request, mach, data);
+    hitCallback(request, mach, data, success);
 }
 
 void
@@ -402,13 +413,14 @@
            (request->ruby_request.type == RubyRequestType_RMW_Read) ||
            (request->ruby_request.type == RubyRequestType_IFETCH));
 
-    hitCallback(request, mach, data);
+    hitCallback(request, mach, data, true);
 }
 
 void
 Sequencer::hitCallback(SequencerRequest* srequest,
                        GenericMachineType mach,
-                       DataBlock& data)
+                       DataBlock& data,
+                       bool success)
 {
     const RubyRequest & ruby_request = srequest->ruby_request;
     Address request_address(ruby_request.paddr);
@@ -434,10 +446,17 @@
         g_system_ptr->getProfiler()->missLatency(miss_latency, type, mach);
 
         if (Debug::getProtocolTrace()) {
-            g_system_ptr->getProfiler()->
-                profileTransition("Seq", m_version,
-                                  Address(ruby_request.paddr), "", "Done", "",
-                                  csprintf("%d cycles", miss_latency));
+            if (success) {
+                g_system_ptr->getProfiler()->
+                    profileTransition("Seq", m_version,
+                                      Address(ruby_request.paddr), "", "Done", 
"",
+                                      csprintf("%d cycles", miss_latency));
+            } else {
+                g_system_ptr->getProfiler()->
+                    profileTransition("Seq", m_version,
+                                      Address(ruby_request.paddr), "", 
"SC_Failed", "",
+                                      csprintf("%d cycles", miss_latency));
+            }
         }
     }
 #if 0
diff -r 017baf09599f -r 29d5891a96d6 src/mem/ruby/system/Sequencer.hh
--- a/src/mem/ruby/system/Sequencer.hh  Fri Aug 20 11:46:13 2010 -0700
+++ b/src/mem/ruby/system/Sequencer.hh  Fri Aug 20 11:46:13 2010 -0700
@@ -105,11 +105,12 @@
 
     void hitCallback(SequencerRequest* request, 
                      GenericMachineType mach,
-                     DataBlock& data);
+                     DataBlock& data,
+                     bool success);
 
     bool insertRequest(SequencerRequest* request);
 
-    void handleLlscWrites(const Address& address, SequencerRequest* request);
+    bool handleLlsc(const Address& address, SequencerRequest* request);
 
     // Private copy constructor and assignment operator
     Sequencer(const Sequencer& obj);
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to