# HG changeset patch
# User Brad Beckmann <[email protected]>
# Date 1269019051 25200
# Node ID b290241635cdf5b4937ef13a13a1beab0e4beccd
# Parent  44ed5e0c7228c2355a5b99c004c424abaefb6a3f
m5: Fixed TraceData delete bug when SimpleTimingCPU deletes the trace data, but
the instruction fails to realize that.

diff --git a/src/arch/alpha/isa/mem.isa b/src/arch/alpha/isa/mem.isa
--- a/src/arch/alpha/isa/mem.isa
+++ b/src/arch/alpha/isa/mem.isa
@@ -273,9 +273,12 @@
         }
 
         if (fault == NoFault) {
+            bool traceDataDeleted = false;
             fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA,
-                              memAccessFlags, NULL);
-            if (traceData) { traceData->setData(Mem); }
+                              memAccessFlags, NULL, &traceDataDeleted);
+            if (traceData && (!traceDataDeleted)) { 
+                traceData->setData(Mem); 
+            }
         }
 
         if (fault == NoFault) {
@@ -308,9 +311,12 @@
         }
 
         if (fault == NoFault) {
+            bool traceDataDeleted = false;
             fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA,
-                              memAccessFlags, &write_result);
-            if (traceData) { traceData->setData(Mem); }
+                              memAccessFlags, &write_result, 
&traceDataDeleted);
+            if (traceData && (!traceDataDeleted)) { 
+                traceData->setData(Mem); 
+            }
         }
 
         if (fault == NoFault) {
@@ -342,9 +348,12 @@
         }
 
         if (fault == NoFault) {
+            bool traceDataDeleted = false;
             fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA,
-                              memAccessFlags, NULL);
-            if (traceData) { traceData->setData(Mem); }
+                              memAccessFlags, NULL, &traceDataDeleted);
+            if (traceData && (!traceDataDeleted)) {
+                traceData->setData(Mem); 
+            }
         }
 
         return fault;
diff --git a/src/cpu/simple/atomic.cc b/src/cpu/simple/atomic.cc
--- a/src/cpu/simple/atomic.cc
+++ b/src/cpu/simple/atomic.cc
@@ -444,7 +444,8 @@
 
 template <class T>
 Fault
-AtomicSimpleCPU::write(T data, Addr addr, unsigned flags, uint64_t *res)
+AtomicSimpleCPU::write(T data, Addr addr, unsigned flags, uint64_t *res, 
+                       bool *traceDataDeleted)
 {
     // use the CPU's statically allocated write request and packet objects
     Request *req = &data_write_req;
@@ -560,6 +561,13 @@
     }
 }
 
+template <class T>
+Fault
+AtomicSimpleCPU::write(T data, Addr addr, unsigned flags, uint64_t *res)
+{
+    bool dummy;
+    return write(*(uint64_t*)&data, addr, flags, res, &dummy);
+}
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 
@@ -593,20 +601,58 @@
 AtomicSimpleCPU::write(uint8_t data, Addr addr,
                        unsigned flags, uint64_t *res);
 
+template
+Fault
+AtomicSimpleCPU::write(Twin32_t data, Addr addr,
+                       unsigned flags, uint64_t *res,
+                       bool *traceDataDeleted);
+
+template
+Fault
+AtomicSimpleCPU::write(Twin64_t data, Addr addr,
+                       unsigned flags, uint64_t *res,
+                       bool *traceDataDeleted);
+
+template
+Fault
+AtomicSimpleCPU::write(uint64_t data, Addr addr,
+                       unsigned flags, uint64_t *res,
+                       bool *traceDataDeleted);
+
+template
+Fault
+AtomicSimpleCPU::write(uint32_t data, Addr addr,
+                       unsigned flags, uint64_t *res,
+                       bool *traceDataDeleted);
+
+template
+Fault
+AtomicSimpleCPU::write(uint16_t data, Addr addr,
+                       unsigned flags, uint64_t *res,
+                       bool *traceDataDeleted);
+
+template
+Fault
+AtomicSimpleCPU::write(uint8_t data, Addr addr,
+                       unsigned flags, uint64_t *res,
+                       bool *traceDataDeleted);
+
 #endif //DOXYGEN_SHOULD_SKIP_THIS
 
 template<>
 Fault
 AtomicSimpleCPU::write(double data, Addr addr, unsigned flags, uint64_t *res)
 {
-    return write(*(uint64_t*)&data, addr, flags, res);
+    bool dummy;
+    return write(*(uint64_t*)&data, addr, flags, res, &dummy);
 }
 
 template<>
 Fault
 AtomicSimpleCPU::write(float data, Addr addr, unsigned flags, uint64_t *res)
 {
-    return write(*(uint32_t*)&data, addr, flags, res);
+    bool dummy;
+    return write(*(uint32_t*)&data, addr, flags, res, &dummy);
 }
 
 
@@ -614,9 +660,34 @@
 Fault
 AtomicSimpleCPU::write(int32_t data, Addr addr, unsigned flags, uint64_t *res)
 {
-    return write((uint32_t)data, addr, flags, res);
+    bool dummy;
+    return write((uint32_t)data, addr, flags, res, &dummy);
 }
 
+template<>
+Fault
+AtomicSimpleCPU::write(double data, Addr addr, unsigned flags, uint64_t *res,
+                       bool *traceDataDeleted)
+{
+    return write(*(uint64_t*)&data, addr, flags, res, traceDataDeleted);
+}
+
+template<>
+Fault
+AtomicSimpleCPU::write(float data, Addr addr, unsigned flags, uint64_t *res,
+                       bool *traceDataDeleted)
+{
+    return write(*(uint32_t*)&data, addr, flags, res, traceDataDeleted);
+}
+
+
+template<>
+Fault
+AtomicSimpleCPU::write(int32_t data, Addr addr, unsigned flags, uint64_t *res,
+                       bool *traceDataDeleted)
+{
+    return write((uint32_t)data, addr, flags, res, traceDataDeleted);
+}
 
 void
 AtomicSimpleCPU::tick()
diff --git a/src/cpu/simple/atomic.hh b/src/cpu/simple/atomic.hh
--- a/src/cpu/simple/atomic.hh
+++ b/src/cpu/simple/atomic.hh
@@ -137,6 +137,10 @@
     template <class T>
     Fault write(T data, Addr addr, unsigned flags, uint64_t *res);
 
+    template <class T>
+    Fault write(T data, Addr addr, unsigned flags, uint64_t *res,
+                bool *traceDataDeleted);
+
     /**
      * Print state of address in memory system via PrintReq (for
      * debugging).
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
@@ -540,7 +540,8 @@
 
 template <class T>
 Fault
-TimingSimpleCPU::write(T data, Addr addr, unsigned flags, uint64_t *res)
+TimingSimpleCPU::write(T data, Addr addr, unsigned flags, uint64_t *res,
+                       bool *traceDataDeleted)
 {
     const int asid = 0;
     const ThreadID tid = 0;
@@ -584,6 +585,8 @@
     if (traceData) {
         traceData->setAddr(req->getVaddr());
         traceData->setData(data);
+    } else {
+        *traceDataDeleted = true;
     }
 
     // This will need a new way to tell if it's hooked up to a cache or not.
@@ -595,11 +598,48 @@
     return NoFault;
 }
 
+template <class T>
+Fault
+TimingSimpleCPU::write(T data, Addr addr, unsigned flags, uint64_t *res)
+{
+    bool dummy;
+    return write(data, addr, flags, res, &dummy);
+}
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 template
 Fault
 TimingSimpleCPU::write(Twin32_t data, Addr addr,
+                       unsigned flags, uint64_t *res, bool *traceDataDeleted);
+
+template
+Fault
+TimingSimpleCPU::write(Twin64_t data, Addr addr,
+                       unsigned flags, uint64_t *res, bool *traceDataDeleted);
+
+template
+Fault
+TimingSimpleCPU::write(uint64_t data, Addr addr,
+                       unsigned flags, uint64_t *res, bool *traceDataDeleted);
+
+template
+Fault
+TimingSimpleCPU::write(uint32_t data, Addr addr,
+                       unsigned flags, uint64_t *res, bool *traceDataDeleted);
+
+template
+Fault
+TimingSimpleCPU::write(uint16_t data, Addr addr,
+                       unsigned flags, uint64_t *res, bool *traceDataDeleted);
+
+template
+Fault
+TimingSimpleCPU::write(uint8_t data, Addr addr,
+                       unsigned flags, uint64_t *res, bool *traceDataDeleted);
+
+template
+Fault
+TimingSimpleCPU::write(Twin32_t data, Addr addr,
                        unsigned flags, uint64_t *res);
 
 template
@@ -631,16 +671,43 @@
 
 template<>
 Fault
+TimingSimpleCPU::write(double data, Addr addr, unsigned flags, uint64_t *res,
+                       bool *traceDataDeleted)
+{
+    return write(*(uint64_t*)&data, addr, flags, res, traceDataDeleted);
+}
+
+template<>
+Fault
+TimingSimpleCPU::write(float data, Addr addr, unsigned flags, uint64_t *res,
+                       bool *traceDataDeleted)
+{
+    return write(*(uint32_t*)&data, addr, flags, res, traceDataDeleted);
+}
+
+
+template<>
+Fault
+TimingSimpleCPU::write(int32_t data, Addr addr, unsigned flags, uint64_t *res,
+                       bool *traceDataDeleted)
+{
+    return write((uint32_t)data, addr, flags, res, traceDataDeleted);
+}
+
+template<>
+Fault
 TimingSimpleCPU::write(double data, Addr addr, unsigned flags, uint64_t *res)
 {
-    return write(*(uint64_t*)&data, addr, flags, res);
+    bool dummy;
+    return write(*(uint64_t*)&data, addr, flags, res, &dummy);
 }
 
 template<>
 Fault
 TimingSimpleCPU::write(float data, Addr addr, unsigned flags, uint64_t *res)
 {
-    return write(*(uint32_t*)&data, addr, flags, res);
+    bool dummy;
+    return write(*(uint32_t*)&data, addr, flags, res, &dummy);
 }
 
 
@@ -648,10 +715,10 @@
 Fault
 TimingSimpleCPU::write(int32_t data, Addr addr, unsigned flags, uint64_t *res)
 {
-    return write((uint32_t)data, addr, flags, res);
+    bool dummy;
+    return write((uint32_t)data, addr, flags, res, &dummy);
 }
 
-
 void
 TimingSimpleCPU::finishTranslation(WholeTranslationState *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
@@ -254,6 +254,10 @@
     template <class T>
     Fault write(T data, Addr addr, unsigned flags, uint64_t *res);
 
+    template <class T>
+    Fault write(T data, Addr addr, unsigned flags, uint64_t *res, 
+                bool *traceDataDeleted);
+
     void fetch();
     void sendFetch(Fault fault, RequestPtr req, ThreadContext *tc);
     void completeIfetch(PacketPtr );

_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to