summaryrefslogtreecommitdiff
path: root/kern/tru64/tru64_events.cc
diff options
context:
space:
mode:
authorLisa Hsu <hsul@eecs.umich.edu>2003-11-04 15:15:12 -0500
committerLisa Hsu <hsul@eecs.umich.edu>2003-11-04 15:15:12 -0500
commit921b1ee87b6927e7310c747e03efd223d8c65642 (patch)
tree8583c8e95a6cfd99b26afe3586e00b576544f17a /kern/tru64/tru64_events.cc
parent959f0b228b1658b5c0776bd9d91c16bc62cd1f1c (diff)
downloadgem5-921b1ee87b6927e7310c747e03efd223d8c65642.tar.xz
Add the ability to track stats in user defined sets of function calls. code can be generated via the base/instrum_codegen.pl script to easily change the functions being tracked. the only thing the user needs to do is add code in tru64System to change how the callerMap is populated.
command line: m5.* <config file> <args> --server.system:bin=true to track function calls in the server m5.* <config file> <args> --client.system:bin=true to track function calls in the client base/statistics.cc: make an adjustment to the way stats are printed for FS_MEASURE base/statistics.hh: add a name() virtual function to GenBin. add a debug printf for activate(). add amake MainBin the default bin when FS_MEASURE. cpu/exec_context.cc: initialize swCtx to null upon creation of an xc cpu/exec_context.hh: add a SWContext pointer to every execution context. cpu/simple_cpu/simple_cpu.cc: process calls and returns for FS_MEASURE cpu/simple_cpu/simple_cpu.hh: add this so idleCycles will not be accessed before all stats are constructed kern/tru64/tru64_events.cc: add a FnEvent that fires whenever a function we're tracking is called. implement the process() virtual function for it. kern/tru64/tru64_events.hh: add FnEvent kern/tru64/tru64_system.cc: send bin parameter to System constructor. add bin parameter to Tru64System object. initialize all the FnEvent and MainBin members of Tru64system. also, populate the calling map that indicates whether a function call is on the path we're tracking. kern/tru64/tru64_system.hh: modify the Tru64System class to support FS_MEASURE sim/system.cc: add a bin parameter to System class. initialize a MainBin to hold the stats for nonPath. sim/system.hh: add a map of to match bins to function names. add a swCtx map to map pcb addresses to SWContext *s. Add some supporting functions. --HG-- extra : convert_revision : af3eadd798cb2d2aed9b54e1059dcedf244dd526
Diffstat (limited to 'kern/tru64/tru64_events.cc')
-rw-r--r--kern/tru64/tru64_events.cc50
1 files changed, 50 insertions, 0 deletions
diff --git a/kern/tru64/tru64_events.cc b/kern/tru64/tru64_events.cc
index 538246333..bb6588e62 100644
--- a/kern/tru64/tru64_events.cc
+++ b/kern/tru64/tru64_events.cc
@@ -36,6 +36,11 @@
#include "mem/functional_mem/memory_control.hh"
#include "targetarch/arguments.hh"
+#ifdef FS_MEASURE
+#include "sim/system.hh"
+#include "sim/sw_context.hh"
+#endif
+
void
SkipFuncEvent::process(ExecContext *xc)
{
@@ -105,3 +110,48 @@ DumpMbufEvent::process(ExecContext *xc)
}
}
+#ifdef FS_MEASURE
+FnEvent::FnEvent(PCEventQueue *q, const std::string & desc, System *system)
+ : PCEvent(q, desc), _name(desc)
+{
+ myBin = system->getBin(desc);
+ assert(myBin);
+}
+
+void
+FnEvent::process(ExecContext *xc)
+{
+ if (xc->misspeculating())
+ return;
+ assert(xc->system->bin && "FnEvent must be in a binned system");
+ SWContext *ctx = xc->swCtx;
+ DPRINTF(TCPIP, "%s: %s Event!!!\n", xc->system->name(), description);
+
+ if (ctx && !ctx->callStack.empty()) {
+ fnCall *last = ctx->callStack.top();
+ if (!xc->system->findCaller(myname(), last->name)) {
+ // assert(!xc->system->findCaller(myname(), "") &&
+ // "should not have head of path in middle of stack!");
+ return;
+ }
+ ctx->calls--;
+ } else {
+ if (!xc->system->findCaller(myname(), "")) {
+ return;
+ }
+ if (!ctx) {
+ DPRINTF(TCPIP, "creating new context for %s\n", myname());
+ ctx = new SWContext;
+ xc->swCtx = ctx;
+ }
+ }
+ DPRINTF(TCPIP, "adding fn %s to context\n", myname());
+ fnCall *call = new fnCall;
+ call->myBin = myBin;
+ call->name = myname();
+ ctx->callStack.push(call);
+ myBin->activate();
+ xc->system->fnCalls++;
+ xc->system->dumpState(xc);
+}
+#endif //FS_MEASURE