# HG changeset patch
# User Gabe Black <[email protected]>
# Date 1241318863 25200
# Node ID 8876c73dde1b40863d98fadb1524536eb333a658
# Parent  af13ed3bea4884454325d5e05d7e9d2ff54e7301
CPU: Defer completing an access until we're no longer running out of 
initiateAcc.

diff --git a/src/cpu/simple/timing.cc b/src/cpu/simple/timing.cc
--- a/src/cpu/simple/timing.cc
+++ b/src/cpu/simple/timing.cc
@@ -105,7 +105,7 @@
 
 TimingSimpleCPU::TimingSimpleCPU(TimingSimpleCPUParams *p)
     : BaseSimpleCPU(p), fetchTranslation(this), icachePort(this, p->clock),
-    dcachePort(this, p->clock), fetchEvent(this)
+    dcachePort(this, p->clock), completeAccessEvent(this), fetchEvent(this)
 {
     _status = Idle;
 
@@ -275,7 +275,7 @@
         delete data;
         delete req;
 
-        translationFault(fault);
+        delayAccessCompletion(fault);
         return;
     }
     PacketPtr pkt;
@@ -284,7 +284,7 @@
     if (req->getFlags().isSet(Request::NO_ACCESS)) {
         assert(!dcache_pkt);
         pkt->makeResponse();
-        completeDataAccess(pkt);
+        delayAccessCompletion(pkt);
     } else if (read) {
         handleReadPacket(pkt);
     } else {
@@ -302,7 +302,7 @@
             handleWritePacket();
         } else {
             _status = DcacheWaitResponse;
-            completeDataAccess(pkt);
+            delayAccessCompletion(pkt);
         }
     }
 }
@@ -318,9 +318,9 @@
         delete req1;
         delete req2;
         if (fault1 != NoFault)
-            translationFault(fault1);
+            delayAccessCompletion(fault1);
         else if (fault2 != NoFault)
-            translationFault(fault2);
+            delayAccessCompletion(fault2);
         return;
     }
     PacketPtr pkt1, pkt2;
@@ -328,7 +328,7 @@
     if (req->getFlags().isSet(Request::NO_ACCESS)) {
         assert(!dcache_pkt);
         pkt1->makeResponse();
-        completeDataAccess(pkt1);
+        delayAccessCompletion(pkt1);
     } else if (read) {
         if (handleReadPacket(pkt1)) {
             SplitFragmentSenderState * send_state =
diff --git a/src/cpu/simple/timing.hh b/src/cpu/simple/timing.hh
--- a/src/cpu/simple/timing.hh
+++ b/src/cpu/simple/timing.hh
@@ -309,8 +309,51 @@
 
     };
 
+    struct CompleteAccessEvent : public Event
+    {
+        PacketPtr pkt;
+        Fault fault;
+        TimingSimpleCPU *cpu;
+
+        CompleteAccessEvent(TimingSimpleCPU *_cpu)
+            : cpu(_cpu) {}
+        
+        void
+        process()
+        {
+            if (fault != NoFault) {
+                cpu->translationFault(fault);
+            } else {
+                cpu->completeDataAccess(pkt);
+            }
+        }
+        const char
+        *description() const
+        {
+            return "Delayed data access completion";
+        }
+    };
+
     IcachePort icachePort;
     DcachePort dcachePort;
+
+    CompleteAccessEvent completeAccessEvent;
+
+    void
+    delayAccessCompletion(PacketPtr pkt)
+    {
+        completeAccessEvent.pkt = pkt;
+        completeAccessEvent.fault = NoFault;
+        schedule(&completeAccessEvent, curTick);
+    }
+
+    void
+    delayAccessCompletion(Fault fault)
+    {
+        completeAccessEvent.pkt = NULL;
+        completeAccessEvent.fault = fault;
+        schedule(&completeAccessEvent, curTick);
+    }
 
     PacketPtr ifetch_pkt;
     PacketPtr dcache_pkt;
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to