Some more useful debugging info for kernel panic and die events
authorRon Dreslinski <rdreslin@umich.edu>
Wed, 9 Feb 2005 15:27:00 +0000 (10:27 -0500)
committerRon Dreslinski <rdreslin@umich.edu>
Wed, 9 Feb 2005 15:27:00 +0000 (10:27 -0500)
Increase the default number of CSHR's, we should really fix this or make it a parameter

Use a setBlocked call to tell the bus it should block

New technique for sampling and switchover:
1) Sampler switchover event happens
2) All cpus in the current phase of sampling associated with this sampler are signaled to switchover
3) Each cpu drains it's pipe of things being executed (stops fetching and waits for empty pipe)
4) Once the pipe is empty the cpu calls back to the sampler to signal it has finished, and moves into the switchedout state (continues not to fetch)
5) The sampler collects all the signals, once all cpus are drained it calls the new cpu's in the next phase to takeover from the correct cpu
6) The statistics are reset and the next switchover time is calculated from this point

cpu/base_cpu.cc:
cpu/base_cpu.hh:
cpu/simple_cpu/simple_cpu.cc:
cpu/simple_cpu/simple_cpu.hh:
    Reconfigure the way the sampling switchover works
cpu/pc_event.cc:
    More debugging information on kernel panic's
kern/linux/linux_system.cc:
    More debug info for Kernel Die events
kern/linux/linux_system.hh:
    More debug info for kernel die events

--HG--
extra : convert_revision : 61cc42e43ba738705aa1f1d167b65d4d6dee51ae

cpu/base_cpu.cc
cpu/base_cpu.hh
cpu/pc_event.cc
cpu/simple_cpu/simple_cpu.cc
cpu/simple_cpu/simple_cpu.hh
kern/linux/linux_system.cc
kern/linux/linux_system.hh

index 7605ff3c3fd05b26b025b02563609ab58ffe1b7f..58f38d5d531bae253ce9f51588dd19cf214c7f39 100644 (file)
@@ -35,6 +35,7 @@
 #include "base/misc.hh"
 #include "cpu/base_cpu.hh"
 #include "cpu/exec_context.hh"
+#include "cpu/sampling_cpu/sampling_cpu.hh"
 #include "sim/param.hh"
 #include "sim/sim_events.hh"
 
@@ -210,9 +211,10 @@ BaseCPU::registerExecContexts()
 
 
 void
-BaseCPU::switchOut()
+BaseCPU::switchOut(SamplingCPU *sampler)
 {
-    // default: do nothing
+    // default: do nothing, signal done
+    sampler->signalSwitched();
 }
 
 void
index baa956aa8abf06de81b462b1c9e06cc6fae915bb..802da340b406da8d13a54f5577a5fe530909cc0b 100644 (file)
@@ -32,6 +32,7 @@
 #include <vector>
 
 #include "base/statistics.hh"
+#include "cpu/sampling_cpu/sampling_cpu.hh"
 #include "sim/eventq.hh"
 #include "sim/sim_object.hh"
 #include "targetarch/isa_traits.hh"
@@ -114,9 +115,9 @@ class BaseCPU : public SimObject
     bool deferRegistration;
     void registerExecContexts();
 
-    /// Prepare for another CPU to take over execution.  Called by
-    /// takeOverFrom() on its argument.
-    virtual void switchOut();
+    /// Prepare for another CPU to take over execution.  When it is
+    /// is ready (drained pipe) it signals the sampler.
+    virtual void switchOut(SamplingCPU *);
 
     /// Take over execution from the given CPU.  Used for warm-up and
     /// sampling.
index 8f046a7a41e9a6447113eadff6e159149d4231ba..21eef677a5c543f46a917f979ef57fe7a0148d7b 100644 (file)
 #include <string>
 #include <utility>
 
-#include "sim/debug.hh"
+#include "base/trace.hh"
+#include "cpu/base_cpu.hh"
 #include "cpu/exec_context.hh"
 #include "cpu/pc_event.hh"
-#include "base/trace.hh"
+#include "sim/debug.hh"
 #include "sim/universe.hh"
 
 using namespace std;
@@ -123,6 +124,8 @@ BreakPCEvent::BreakPCEvent(PCEventQueue *q, const std::string &desc, bool del)
 void
 BreakPCEvent::process(ExecContext *xc)
 {
+    StringWrap name(xc->cpu->name() + ".break_event");
+    DPRINTFN("break event %s triggered", descr());
     debug_break();
     if (remove)
         delete this;
index 9f4f821d45ca7e6fc7566eca794d2d1fbf0b8725..2f1e8e1f13ab85a2b83909608677ec2a6639ef88 100644 (file)
@@ -47,6 +47,7 @@
 #include "cpu/exec_context.hh"
 #include "cpu/exetrace.hh"
 #include "cpu/full_cpu/smt.hh"
+#include "cpu/sampling_cpu/sampling_cpu.hh"
 #include "cpu/simple_cpu/simple_cpu.hh"
 #include "cpu/static_inst.hh"
 #include "mem/base_mem.hh"
@@ -179,11 +180,21 @@ SimpleCPU::~SimpleCPU()
 }
 
 void
-SimpleCPU::switchOut()
+SimpleCPU::switchOut(SamplingCPU *s)
 {
-    _status = SwitchedOut;
-    if (tickEvent.scheduled())
-        tickEvent.squash();
+    sampler = s;
+    if (status() == DcacheMissStall) {
+        DPRINTF(Sampler,"Outstanding dcache access, waiting for completion\n");
+        _status = DcacheMissSwitch;
+    }
+    else {
+        _status = SwitchedOut;
+
+        if (tickEvent.scheduled())
+            tickEvent.squash();
+
+        sampler->signalSwitched();
+    }
 }
 
 
@@ -203,8 +214,6 @@ SimpleCPU::takeOverFrom(BaseCPU *oldCPU)
             tickEvent.schedule(curTick);
         }
     }
-
-    oldCPU->switchOut();
 }
 
 
@@ -631,6 +640,12 @@ SimpleCPU::processCacheCompletion()
         _status = Running;
         scheduleTickEvent(1);
         break;
+      case DcacheMissSwitch:
+        if (memReq->cmd.isRead()) {
+            curStaticInst->execute(this,traceData);
+        }
+        _status = SwitchedOut;
+        sampler->signalSwitched();
       case SwitchedOut:
         // If this CPU has been switched out due to sampling/warm-up,
         // ignore any further status changes (e.g., due to cache
index 8104d73a42182f954c0dc312ca0ad15c4b542d20..85bd1a74fe9aa821d317a56ca70c780915f6f1c2 100644 (file)
 #ifndef __SIMPLE_CPU_HH__
 #define __SIMPLE_CPU_HH__
 
-#include "cpu/base_cpu.hh"
-#include "sim/eventq.hh"
-#include "cpu/pc_event.hh"
 #include "base/statistics.hh"
+#include "cpu/base_cpu.hh"
 #include "cpu/exec_context.hh"
+#include "cpu/pc_event.hh"
+#include "cpu/sampling_cpu/sampling_cpu.hh"
 #include "cpu/static_inst.hh"
+#include "sim/eventq.hh"
 
 // forward declarations
 #ifdef FULL_SYSTEM
@@ -117,6 +118,7 @@ class SimpleCPU : public BaseCPU
         IcacheMissStall,
         IcacheMissComplete,
         DcacheMissStall,
+        DcacheMissSwitch,
         SwitchedOut
     };
 
@@ -163,7 +165,7 @@ class SimpleCPU : public BaseCPU
     // execution context
     ExecContext *xc;
 
-    void switchOut();
+    void switchOut(SamplingCPU *s);
     void takeOverFrom(BaseCPU *oldCPU);
 
 #ifdef FULL_SYSTEM
@@ -184,6 +186,11 @@ class SimpleCPU : public BaseCPU
     // Refcounted pointer to the one memory request.
     MemReqPtr memReq;
 
+    // Pointer to the sampler that is telling us to switchover.
+    // Used to signal the completion of the pipe drain and schedule
+    // the next switchover
+    SamplingCPU *sampler;
+
     StaticInstPtr<TheISA> curStaticInst;
 
     class CacheCompletionEvent : public Event
index 401b4ef44a573a6845a720e8e39698b8b1c44c99..4ac03143e65580db93e62a9b8930a4fd4e62926a 100644 (file)
@@ -102,12 +102,19 @@ LinuxSystem::LinuxSystem(Params *p)
     } else
         panic("could not find dp264_mv\n");
 
-#ifdef DEBUG
+#ifndef NDEBUG
     kernelPanicEvent = new BreakPCEvent(&pcEventQueue, "kernel panic");
     if (kernelSymtab->findAddress("panic", addr))
         kernelPanicEvent->schedule(addr);
     else
         panic("could not find kernel symbol \'panic\'");
+
+    kernelDieEvent = new BreakPCEvent(&pcEventQueue, "die if kernel");
+    if (kernelSymtab->findAddress("die_if_kernel", addr))
+        kernelDieEvent->schedule(addr);
+    else
+        panic("could not find kernel symbol \'die_if_kernel\'");
+
 #endif
 
     /**
@@ -174,7 +181,7 @@ LinuxSystem::LinuxSystem(Params *p)
 
 LinuxSystem::~LinuxSystem()
 {
-#ifdef DEBUG
+#ifndef NDEBUG
     delete kernelPanicEvent;
 #endif
     delete skipIdeDelay50msEvent;
index 5e3cba9b32be7aa433298d01a0971bb6fc632090..905b0ee70a7d27c27d6df46a6561875a3da9b2e0 100644 (file)
@@ -57,9 +57,12 @@ class PrintThreadInfo;
 class LinuxSystem : public System
 {
   private:
-#ifdef DEBUG
+#ifndef NDEBUG
     /** Event to halt the simulator if the kernel calls panic()  */
     BreakPCEvent *kernelPanicEvent;
+
+    /** Event to halt the simulator if the kernel calls die_if_kernel  */
+    BreakPCEvent *kernelDieEvent;
 #endif
 
     /**