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:
13
cpu/base.cc
13
cpu/base.cc
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -157,6 +157,10 @@ class CPUExecContext
|
||||
|
||||
Tick readLastSuspend() { return lastSuspend; }
|
||||
|
||||
void profileClear();
|
||||
|
||||
void profileSample();
|
||||
|
||||
#else
|
||||
Process *process;
|
||||
|
||||
|
||||
@@ -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(); }
|
||||
|
||||
Reference in New Issue
Block a user