ARM: Make the ARM native tracer stop M5 if control diverges.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 29 Jul 2009 07:17:11 +0000 (00:17 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 29 Jul 2009 07:17:11 +0000 (00:17 -0700)
If the control flow of M5's executable and statetrace's target process get out
of sync even a little, there will be a LOT of output, very little of which
will be useful. There's also almost no hope for recovery. In those cases, we
might as well give up and not generate a huge, mostly worthless trace file.

src/arch/arm/ArmNativeTrace.py
src/arch/arm/nativetrace.cc
src/arch/arm/nativetrace.hh

index fb3d4a4ff42a37894d26ce0c70db9a9e9453b643..0a76913e39e241911fbe5fb25e36059c714d824c 100644 (file)
@@ -33,3 +33,5 @@ from NativeTrace import NativeTrace
 class ArmNativeTrace(NativeTrace):
     type = 'ArmNativeTrace'
     cxx_class = 'Trace::ArmNativeTrace'
+    stop_on_pc_error = Param.Bool(True,
+            "Stop M5 if it and statetrace's pcs are different")
index 90c5e5c255e60a75f94ead892c8b0320912960f0..1ad9e1a19a590b9e43da0ab7e88fb7c1826056c7 100644 (file)
@@ -162,6 +162,11 @@ Trace::ArmNativeTrace::check(NativeTraceRecord *record)
         }
         assert(inst);
         record->traceInst(inst, ran);
+
+        bool pcError = (mState.newState[STATE_PC] !=
+                        nState.newState[STATE_PC]);
+        if (stopOnPCError && pcError)
+            panic("Native trace detected an error in control flow!");
     }
 }
 
index d39bdcfa8efbae995295d6d816cac98ce8d055b4..7467e337826239040cfa0d577e9785e165ae117f 100644 (file)
@@ -33,6 +33,7 @@
 
 #include "base/types.hh"
 #include "cpu/nativetrace.hh"
+#include "params/ArmNativeTrace.hh"
 
 namespace Trace {
 
@@ -88,8 +89,19 @@ class ArmNativeTrace : public NativeTrace
 
     ThreadState nState, mState;
 
+    bool stopOnPCError;
+
   public:
-    ArmNativeTrace(const Params *p) : NativeTrace(p)
+    typedef ArmNativeTraceParams Params;
+
+    const Params *
+    params() const
+    {
+        return dynamic_cast<const Params *>(_params);
+    }
+
+    ArmNativeTrace(const Params *p) :
+        NativeTrace(p), stopOnPCError(p->stop_on_pc_error)
     {}
 
     void check(NativeTraceRecord *record);