ARM: Move PC mode bits around so they can be used for exectrace
authorAli Saidi <Ali.Saidi@ARM.com>
Wed, 2 Jun 2010 17:58:13 +0000 (12:58 -0500)
committerAli Saidi <Ali.Saidi@ARM.com>
Wed, 2 Jun 2010 17:58:13 +0000 (12:58 -0500)
src/arch/arm/isa_traits.hh
src/arch/arm/miscregs.hh
src/cpu/exetrace.cc

index 00c4c293256f4f30118e163b90110ae8c086d282..4cffe3bec08b4a4c3928c73bca9d78850821e65d 100644 (file)
@@ -121,6 +121,13 @@ namespace ArmISA
 
     // Memory accesses cannot be unaligned
     const bool HasUnalignedMemAcc = false;
+
+    // These otherwise unused bits of the PC are used to select a mode
+    // like the J and T bits of the CPSR.
+    static const Addr PcJBitShift = 33;
+    static const Addr PcTBitShift = 34;
+    static const Addr PcModeMask = (ULL(1) << PcJBitShift) |
+                                   (ULL(1) << PcTBitShift);
 };
 
 using namespace ArmISA;
index ad4f9190827fa46544862255c7ccc4b88aa1a41c..e3e2ca2c2cebac323ddaa5e5491c60374cf0d11c 100644 (file)
@@ -201,13 +201,6 @@ namespace ArmISA
     // integer register to allow renaming.
     static const uint32_t CondCodesMask = 0xF80F0000;
 
-    // These otherwise unused bits of the PC are used to select a mode
-    // like the J and T bits of the CPSR.
-    static const Addr PcJBitShift = 33;
-    static const Addr PcTBitShift = 34;
-    static const Addr PcModeMask = (ULL(1) << PcJBitShift) |
-                                   (ULL(1) << PcTBitShift);
-
     BitUnion32(SCTLR)
         Bitfield<30> te;  // Thumb Exception Enable
         Bitfield<29> afe; // Access flag enable
index 07be700bbd309fd406a1df5373b18086f3e53f68..28c7861ef97d95188a2ad388292b47f8276af82a 100644 (file)
@@ -33,6 +33,7 @@
 
 #include <iomanip>
 
+#include "arch/isa_traits.hh"
 #include "base/loader/symtab.hh"
 #include "cpu/base.hh"
 #include "cpu/exetrace.hh"
@@ -70,18 +71,22 @@ Trace::ExeTracerRecord::traceInst(StaticInstPtr inst, bool ran)
 
     std::string sym_str;
     Addr sym_addr;
+    Addr cur_pc = PC;
+#if THE_ISA == ARM_ISA
+    cur_pc &= ~PcModeMask;
+#endif
     if (debugSymbolTable
         && IsOn(ExecSymbol)
 #if FULL_SYSTEM
         && !inUserMode(thread)
 #endif
-        && debugSymbolTable->findNearestSymbol(PC, sym_str, sym_addr)) {
-        if (PC != sym_addr)
-            sym_str += csprintf("+%d", PC - sym_addr);
+        && debugSymbolTable->findNearestSymbol(cur_pc, sym_str, sym_addr)) {
+        if (cur_pc != sym_addr)
+            sym_str += csprintf("+%d",cur_pc - sym_addr);
         outs << "@" << sym_str;
     }
     else {
-        outs << "0x" << hex << PC;
+        outs << "0x" << hex << cur_pc;
     }
 
     if (inst->isMicroop()) {
@@ -97,7 +102,7 @@ Trace::ExeTracerRecord::traceInst(StaticInstPtr inst, bool ran)
     //
 
     outs << setw(26) << left;
-    outs << inst->disassemble(PC, debugSymbolTable);
+    outs << inst->disassemble(cur_pc, debugSymbolTable);
 
     if (ran) {
         outs << " : ";