Fixes to allow the ExecContext to be used for profiling.
authorKevin Lim <ktlim@umich.edu>
Wed, 8 Mar 2006 03:21:39 +0000 (22:21 -0500)
committerKevin Lim <ktlim@umich.edu>
Wed, 8 Mar 2006 03:21:39 +0000 (22:21 -0500)
cpu/base.cc:
    Change to be calls through the ExecContext instead of accessing the profile object directly.
cpu/cpu_exec_context.cc:
    Add functions to clear and sample the profile object.
cpu/cpu_exec_context.hh:
    Add functions to clear and sample the profile object.  These are not the most flexible functions; it might be better to eventually move the quiesce, profile, and store conditional stuff out of ExecContext so they don't clutter the interface.
cpu/exec_context.hh:
    Include functions to support using the profile object to clear itself and take samples.

--HG--
extra : convert_revision : 40849915fd51303673451515debb9ecdc7afb8c8

cpu/base.cc
cpu/cpu_exec_context.cc
cpu/cpu_exec_context.hh
cpu/exec_context.hh

index e2a4c214a826c7b4c4d4ce1895bd47af429f394d..2eb5f7fd310b2ab9ab0470c311564a0da4fd9c4f 100644 (file)
@@ -271,11 +271,10 @@ BaseCPU::takeOverFrom(BaseCPU *oldCPU)
     for (int i = 0; i < TheISA::NumInterruptLevels; ++i)
         interrupts[i] = oldCPU->interrupts[i];
     intstatus = oldCPU->intstatus;
-/*
+
     for (int i = 0; i < execContexts.size(); ++i)
-        if (execContexts[i]->profile)
-            execContexts[i]->profile->clear();
-*/
+        execContexts[i]->profileClear();
+
     if (profileEvent)
         profileEvent->schedule(curTick);
 #endif
@@ -290,11 +289,11 @@ BaseCPU::ProfileEvent::ProfileEvent(BaseCPU *_cpu, int _interval)
 void
 BaseCPU::ProfileEvent::process()
 {
-/*    for (int i = 0, size = cpu->execContexts.size(); i < size; ++i) {
+    for (int i = 0, size = cpu->execContexts.size(); i < size; ++i) {
         ExecContext *xc = cpu->execContexts[i];
-        xc->profile->sample(xc->profileNode, xc->profilePC);
+        xc->profileSample();
     }
-*/
+
     schedule(curTick + interval);
 }
 
index 74b609764a071fed0fb03f3bd6844095592e7db8..683d077879dfb75965e98c1a5766ee358aa79340 100644 (file)
@@ -137,6 +137,21 @@ CPUExecContext::EndQuiesceEvent::description()
 {
     return "End Quiesce Event.";
 }
+
+void
+CPUExecContext::profileClear()
+{
+    if (profile)
+        profile->clear();
+}
+
+void
+CPUExecContext::profileSample()
+{
+    if (profile)
+        profile->sample(profileNode, profilePC);
+}
+
 #endif
 
 void
index f5c57da22324a320cfc4d856f0505ac7c1f900d4..e2fbb23682b5186da159c22cd818e6615d86b006 100644 (file)
@@ -157,6 +157,10 @@ class CPUExecContext
 
     Tick readLastSuspend() { return lastSuspend; }
 
+    void profileClear();
+
+    void profileSample();
+
 #else
     Process *process;
 
index b7653f12199bec9fa3a5492e34acd997ac978bae..2b6c41bd7470719a6dd32154162efe7ecd356c1a 100644 (file)
@@ -136,6 +136,9 @@ class ExecContext
     // Having an extra function just to read these is obnoxious
     virtual Tick readLastActivate() = 0;
     virtual Tick readLastSuspend() = 0;
+
+    virtual void profileClear() = 0;
+    virtual void profileSample() = 0;
 #endif
 
     virtual int getThreadNum() = 0;
@@ -152,6 +155,7 @@ class ExecContext
     virtual Fault translateDataWriteReq(MemReqPtr &req) = 0;
 
     // Also somewhat obnoxious.  Really only used for the TLB fault.
+    // However, may be quite useful in SPARC.
     virtual TheISA::MachInst getInst() = 0;
 
     virtual void copyArchRegs(ExecContext *xc) = 0;
@@ -294,6 +298,9 @@ class ProxyExecContext : public ExecContext
 
     Tick readLastActivate() { return actualXC->readLastActivate(); }
     Tick readLastSuspend() { return actualXC->readLastSuspend(); }
+
+    void profileClear() { return actualXC->profileClear(); }
+    void profileSample() { return actualXC->profileSample(); }
 #endif
 
     int getThreadNum() { return actualXC->getThreadNum(); }