Fixes to allow the ExecContext to be used for profiling.

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
This commit is contained in:
Kevin Lim
2006-03-07 22:21:39 -05:00
parent 97c4a84985
commit 7712232e55
4 changed files with 32 additions and 7 deletions

View 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);
}

View 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

View File

@@ -157,6 +157,10 @@ class CPUExecContext
Tick readLastSuspend() { return lastSuspend; }
void profileClear();
void profileSample();
#else
Process *process;

View 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(); }