X86: Add a trace flag for tracing faults.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 25 Feb 2009 18:17:59 +0000 (10:17 -0800)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 25 Feb 2009 18:17:59 +0000 (10:17 -0800)
src/arch/x86/SConscript
src/arch/x86/faults.cc
src/arch/x86/faults.hh

index 8c1aec7a79892a137fe383fc6a4e8b4d6cbe17dc..0e13d3104115a7326efc84d164063c96700ef905 100644 (file)
@@ -113,6 +113,7 @@ if env['TARGET_ISA'] == 'x86':
         TraceFlag('LocalApic', "Local APIC debugging")
         TraceFlag('PageTableWalker', \
                   "Page table walker state machine debugging")
+        TraceFlag('Faults', "Trace all faults/exceptions/traps")
 
         SimObject('X86LocalApic.py')
         SimObject('X86System.py')
index 964eb0a7fdc47b7d3bca91089ef3d6c16747f550..b81400cc392446e56f5cc28d4269c3d518bcd1ea 100644 (file)
@@ -103,6 +103,8 @@ namespace X86ISA
 #if FULL_SYSTEM
     void X86FaultBase::invoke(ThreadContext * tc)
     {
+        Addr pc = tc->readPC();
+        DPRINTF(Faults, "RIP %#x: vector %d: %s\n", pc, vector, describe());
         using namespace X86ISAInst::RomLabels;
         HandyM5Reg m5reg = tc->readMiscRegNoEffect(MISCREG_M5_REG);
         MicroPC entry;
@@ -116,7 +118,7 @@ namespace X86ISA
             entry = extern_label_legacyModeInterrupt;
         }
         tc->setIntReg(INTREG_MICRO(1), vector);
-        tc->setIntReg(INTREG_MICRO(7), tc->readPC());
+        tc->setIntReg(INTREG_MICRO(7), pc);
         if (errorCode != (uint64_t)(-1)) {
             if (m5reg.mode == LongMode) {
                 entry = extern_label_longModeInterruptWithError;
@@ -132,6 +134,18 @@ namespace X86ISA
         tc->setMicroPC(romMicroPC(entry));
         tc->setNextMicroPC(romMicroPC(entry) + 1);
     }
+
+    std::string
+    X86FaultBase::describe() const
+    {
+        std::stringstream ss;
+        ccprintf(ss, "%s", mnemonic());
+        if (errorCode != (uint64_t)(-1)) {
+            ccprintf(ss, "(%#x)", errorCode);
+        }
+
+        return ss.str();
+    }
     
     void X86Trap::invoke(ThreadContext * tc)
     {
@@ -163,6 +177,14 @@ namespace X86ISA
         }
     }
 
+    std::string
+    PageFault::describe() const
+    {
+        std::stringstream ss;
+        ccprintf(ss, "%s at %#x", X86FaultBase::describe(), addr);
+        return ss.str();
+    }
+
 #endif
 } // namespace X86ISA
 
index 3753e60e50cc2790fd020c8ed05ae1e9641f7186..cb1a3f18ac51e94c514db7a3e0ef4106371991ba 100644 (file)
@@ -62,6 +62,8 @@
 #include "base/misc.hh"
 #include "sim/faults.hh"
 
+#include <string>
+
 namespace X86ISA
 {
     // Base class for all x86 "faults" where faults is in the m5 sense
@@ -102,6 +104,8 @@ namespace X86ISA
 
 #if FULL_SYSTEM
         void invoke(ThreadContext * tc);
+
+        virtual std::string describe() const;
 #endif
     };
 
@@ -342,6 +346,8 @@ namespace X86ISA
 
 #if FULL_SYSTEM
         void invoke(ThreadContext * tc);
+
+        virtual std::string describe() const;
 #endif
     };
 
@@ -414,7 +420,7 @@ namespace X86ISA
     {
       public:
         SoftwareInterrupt(uint8_t _vector) :
-            X86Interrupt("Software Interrupt", "INTn", _vector)
+            X86Interrupt("Software Interrupt", "#INTR", _vector)
         {}
 
         bool isSoft()