CPU: Add function to explictly compare thread contexts after copying.
authorAli Saidi <saidi@eecs.umich.edu>
Thu, 8 Nov 2007 15:46:41 +0000 (10:46 -0500)
committerAli Saidi <saidi@eecs.umich.edu>
Thu, 8 Nov 2007 15:46:41 +0000 (10:46 -0500)
--HG--
extra : convert_revision : 9b7af59a11202a91409aad7c427b7749cd1d2f12

src/arch/alpha/SConscript
src/cpu/SConscript
src/cpu/base.cc
src/cpu/thread_context.cc [new file with mode: 0644]
src/cpu/thread_context.hh

index ca20cf585237e08c681b4146aa0875ca77cc4011..04bac399613773f76d13c353df3c081d8a7023b4 100644 (file)
@@ -75,5 +75,3 @@ if env['TARGET_ISA'] == 'alpha':
     for f in isa_desc_files:
         if not f.path.endswith('.hh'):
             Source(f)
-
-    TraceFlag('Context')
index 6b43c6c1617312784007ba8583949bae9d7f26c8..c7d0c33bdcc012ee44f6a6e3e2e3a470021bc942 100644 (file)
@@ -118,6 +118,7 @@ Source('pc_event.cc')
 Source('quiesce_event.cc')
 Source('static_inst.cc')
 Source('simple_thread.cc')
+Source('thread_context.cc')
 Source('thread_state.cc')
 
 if env['FULL_SYSTEM']:
@@ -150,6 +151,7 @@ if env['USE_CHECKER']:
 
 TraceFlag('Activity')
 TraceFlag('Commit')
+TraceFlag('Context')
 TraceFlag('Decode')
 TraceFlag('DynInst')
 TraceFlag('ExecEnable')
index 25bd3f893f56c96e3e5d5622bbfdaf85a7c2416d..7b04f5a9036bf4559f8f4c22ee1249350cc36f68 100644 (file)
@@ -334,7 +334,8 @@ BaseCPU::takeOverFrom(BaseCPU *oldCPU, Port *ic, Port *dc)
         newTC->getProcessPtr()->replaceThreadContext(newTC, newTC->readCpuId());
 #endif
 
-//    TheISA::compareXCs(oldXC, newXC);
+        if (DTRACE(Context))
+            ThreadContext::compare(oldTC, newTC);
     }
 
 #if FULL_SYSTEM
diff --git a/src/cpu/thread_context.cc b/src/cpu/thread_context.cc
new file mode 100644 (file)
index 0000000..10c9402
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2006 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Kevin Lim
+ */
+
+#include "base/misc.hh"
+#include "base/trace.hh"
+#include "cpu/thread_context.hh"
+
+void
+ThreadContext::compare(ThreadContext *one, ThreadContext *two)
+{
+    DPRINTF(Context, "Comparing thread contexts\n");
+
+    // First loop through the integer registers.
+    for (int i = 0; i < TheISA::NumIntRegs; ++i) {
+        TheISA::IntReg t1 = one->readIntReg(i);
+        TheISA::IntReg t2 = two->readIntReg(i);
+        if (t1 != t2)
+            panic("Int reg idx %d doesn't match, one: %#x, two: %#x",
+                  i, t1, t2);
+    }
+
+    // Then loop through the floating point registers.
+    for (int i = 0; i < TheISA::NumFloatRegs; ++i) {
+        TheISA::FloatRegBits t1 = one->readFloatRegBits(i);
+        TheISA::FloatRegBits t2 = two->readFloatRegBits(i);
+        if (t1 != t2)
+            panic("Float reg idx %d doesn't match, one: %#x, two: %#x",
+                  i, t1, t2);
+    }
+#if FULL_SYSTEM
+    for (int i = 0; i < TheISA::NumMiscRegs; ++i) {
+        TheISA::MiscReg t1 = one->readMiscRegNoEffect(i);
+        TheISA::MiscReg t2 = two->readMiscRegNoEffect(i);
+        if (t1 != t2)
+            panic("Misc reg idx %d doesn't match, one: %#x, two: %#x",
+                  i, t1, t2);
+    }
+#endif
+
+    Addr pc1 = one->readPC();
+    Addr pc2 = two->readPC();
+    if (pc1 != pc2)
+        panic("PCs doesn't match, one: %#x, two: %#x", pc1, pc2);
+
+    Addr npc1 = one->readNextPC();
+    Addr npc2 = two->readNextPC();
+    if (npc1 != npc2)
+        panic("NPCs doesn't match, one: %#x, two: %#x", npc1, npc2);
+
+    int id1 = one->readCpuId();
+    int id2 = two->readCpuId();
+    if (id1 != id2)
+        panic("CPU ids don't match, one: %d, two: %d", id1, id2);
+}
index 1af0290930d63a44f6fe34898a2343f6039ae520..31fdb42c2b605c3df36428057d83be8b07efd6c3 100644 (file)
@@ -268,6 +268,9 @@ class ThreadContext
 
     virtual void changeRegFileContext(TheISA::RegContextParam param,
             TheISA::RegContextVal val) = 0;
+
+    /** function to compare two thread contexts (for debugging) */
+    static void compare(ThreadContext *one, ThreadContext *two);
 };
 
 /**