Overall gist of this is to 'dynamicize' the tracking of functions so you can choose them at the .ini stage rather than at compile time.
to do it: in .ini file set binned_fns=foo null bar foo what this says is, track foo when it is called by null (i.e. anything). bin bar only when it is called by foo. essentially, if you have a path of functions to track, the 0th, 2nd, 4th fn listed are the fns to track, and the 1st, 3rd, 5th are their respective callers. base/statistics.hh: turn it back to FS_MEASURE since we already have a build in place kern/tru64/tru64_events.cc: remove FS_MEASURE #defs. add more DPRINTF's. manage an anomaly that happens when tracking idle_thread. kern/tru64/tru64_events.hh: remove FS_MEASURE #defs kern/tru64/tru64_system.cc: make DumpState print all the time, but only with DPRINTF. add a new parameter to tru64System a vector<string> binned_fns, to read in from .ini file. now all this binning stuff is dynamically generated. kern/tru64/tru64_system.hh: remove all static binning stuff, add support for dynamic sim/system.cc: change nonPath bin name to Kernel, remove FS_MEASURE sim/system.hh: change nonPath to Kernel --HG-- extra : convert_revision : 9ee813c0a64273bab4125815b7bc8145c5897ec1
This commit is contained in:
parent
eabc59ca2d
commit
f3861d0cc7
7 changed files with 61 additions and 472 deletions
|
@ -2498,7 +2498,7 @@ struct NoBin
|
||||||
* binned. If the typedef is NoBin, nothing is binned. If it is
|
* binned. If the typedef is NoBin, nothing is binned. If it is
|
||||||
* MainBin, then all stats are binned under that Bin.
|
* MainBin, then all stats are binned under that Bin.
|
||||||
*/
|
*/
|
||||||
#if defined(STATS_BINNING)
|
#if defined(FS_MEASURE)
|
||||||
typedef MainBin DefaultBin;
|
typedef MainBin DefaultBin;
|
||||||
#else
|
#else
|
||||||
typedef NoBin DefaultBin;
|
typedef NoBin DefaultBin;
|
||||||
|
|
|
@ -35,11 +35,8 @@
|
||||||
#include "kern/tru64/tru64_events.hh"
|
#include "kern/tru64/tru64_events.hh"
|
||||||
#include "mem/functional_mem/memory_control.hh"
|
#include "mem/functional_mem/memory_control.hh"
|
||||||
#include "targetarch/arguments.hh"
|
#include "targetarch/arguments.hh"
|
||||||
|
|
||||||
#ifdef FS_MEASURE
|
|
||||||
#include "sim/system.hh"
|
#include "sim/system.hh"
|
||||||
#include "sim/sw_context.hh"
|
#include "sim/sw_context.hh"
|
||||||
#endif
|
|
||||||
|
|
||||||
void
|
void
|
||||||
SkipFuncEvent::process(ExecContext *xc)
|
SkipFuncEvent::process(ExecContext *xc)
|
||||||
|
@ -110,7 +107,6 @@ DumpMbufEvent::process(ExecContext *xc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef FS_MEASURE
|
|
||||||
FnEvent::FnEvent(PCEventQueue *q, const std::string & desc, System *system)
|
FnEvent::FnEvent(PCEventQueue *q, const std::string & desc, System *system)
|
||||||
: PCEvent(q, desc), _name(desc)
|
: PCEvent(q, desc), _name(desc)
|
||||||
{
|
{
|
||||||
|
@ -128,13 +124,23 @@ FnEvent::process(ExecContext *xc)
|
||||||
DPRINTF(TCPIP, "%s: %s Event!!!\n", xc->system->name(), description);
|
DPRINTF(TCPIP, "%s: %s Event!!!\n", xc->system->name(), description);
|
||||||
|
|
||||||
if (ctx && !ctx->callStack.empty()) {
|
if (ctx && !ctx->callStack.empty()) {
|
||||||
|
DPRINTF(TCPIP, "already a callstack!\n");
|
||||||
fnCall *last = ctx->callStack.top();
|
fnCall *last = ctx->callStack.top();
|
||||||
|
|
||||||
|
if (last->name == "idle_thread")
|
||||||
|
ctx->calls++;
|
||||||
|
|
||||||
if (!xc->system->findCaller(myname(), last->name)) {
|
if (!xc->system->findCaller(myname(), last->name)) {
|
||||||
|
DPRINTF(TCPIP, "but can't find parent %s\n", last->name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ctx->calls--;
|
ctx->calls--;
|
||||||
|
|
||||||
|
//assert(!ctx->calls && "on a binned fn, calls should == 0 (but can happen in boot)");
|
||||||
} else {
|
} else {
|
||||||
|
DPRINTF(TCPIP, "no callstack yet\n");
|
||||||
if (!xc->system->findCaller(myname(), "")) {
|
if (!xc->system->findCaller(myname(), "")) {
|
||||||
|
DPRINTF(TCPIP, "not the right function, returning\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!ctx) {
|
if (!ctx) {
|
||||||
|
@ -150,6 +156,7 @@ FnEvent::process(ExecContext *xc)
|
||||||
ctx->callStack.push(call);
|
ctx->callStack.push(call);
|
||||||
myBin->activate();
|
myBin->activate();
|
||||||
xc->system->fnCalls++;
|
xc->system->fnCalls++;
|
||||||
|
DPRINTF(TCPIP, "fnCalls for %s is %d\n", description,
|
||||||
|
xc->system->fnCalls.val());
|
||||||
xc->system->dumpState(xc);
|
xc->system->dumpState(xc);
|
||||||
}
|
}
|
||||||
#endif //FS_MEASURE
|
|
||||||
|
|
|
@ -35,9 +35,7 @@
|
||||||
|
|
||||||
class ExecContext;
|
class ExecContext;
|
||||||
|
|
||||||
#ifdef FS_MEASURE
|
|
||||||
class System;
|
class System;
|
||||||
#endif
|
|
||||||
|
|
||||||
class SkipFuncEvent : public PCEvent
|
class SkipFuncEvent : public PCEvent
|
||||||
{
|
{
|
||||||
|
@ -82,7 +80,6 @@ class DumpMbufEvent : public PCEvent
|
||||||
virtual void process(ExecContext *xc);
|
virtual void process(ExecContext *xc);
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef FS_MEASURE
|
|
||||||
class FnEvent : public PCEvent
|
class FnEvent : public PCEvent
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -94,5 +91,4 @@ class FnEvent : public PCEvent
|
||||||
std::string _name;
|
std::string _name;
|
||||||
Statistics::MainBin *myBin;
|
Statistics::MainBin *myBin;
|
||||||
};
|
};
|
||||||
#endif //FS_MEASURE
|
|
||||||
#endif // __TRU64_EVENTS_HH__
|
#endif // __TRU64_EVENTS_HH__
|
||||||
|
|
|
@ -41,17 +41,15 @@
|
||||||
#include "targetarch/isa_traits.hh"
|
#include "targetarch/isa_traits.hh"
|
||||||
#include "targetarch/vtophys.hh"
|
#include "targetarch/vtophys.hh"
|
||||||
|
|
||||||
//un-comment this to see the state of call stack when it changes.
|
|
||||||
//#define SW_DEBUG
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
Tru64System::Tru64System(const string _name, const uint64_t _init_param,
|
Tru64System::Tru64System(const string _name, const uint64_t _init_param,
|
||||||
MemoryController *_memCtrl, PhysicalMemory *_physmem,
|
MemoryController *_memCtrl, PhysicalMemory *_physmem,
|
||||||
const string &kernel_path, const string &console_path,
|
const string &kernel_path, const string &console_path,
|
||||||
const string &palcode, const string &boot_osflags,
|
const string &palcode, const string &boot_osflags,
|
||||||
const bool _bin)
|
const bool _bin, const vector<string> &binned_fns)
|
||||||
: System(_name, _init_param, _memCtrl, _physmem, _bin), bin(_bin)
|
: System(_name, _init_param, _memCtrl, _physmem, _bin), bin(_bin),
|
||||||
|
binned_fns(binned_fns)
|
||||||
{
|
{
|
||||||
kernelSymtab = new SymbolTable;
|
kernelSymtab = new SymbolTable;
|
||||||
consoleSymtab = new SymbolTable;
|
consoleSymtab = new SymbolTable;
|
||||||
|
@ -92,106 +90,6 @@ Tru64System::Tru64System(const string _name, const uint64_t _init_param,
|
||||||
|
|
||||||
DPRINTF(Loader, "Kernel loaded...\n");
|
DPRINTF(Loader, "Kernel loaded...\n");
|
||||||
|
|
||||||
#ifdef FS_MEASURE
|
|
||||||
//INSTRUMENTATION CODEGEN BEGIN ONE
|
|
||||||
if (bin == true) {
|
|
||||||
esIntrBin = new Statistics::MainBin(name() + " es_intr");
|
|
||||||
fnBins.insert(make_pair("es_intr", esIntrBin));
|
|
||||||
|
|
||||||
esRxeofBin = new Statistics::MainBin(name() + " es_rxeof");
|
|
||||||
fnBins.insert(make_pair("es_rxeof", esRxeofBin));
|
|
||||||
|
|
||||||
esNewbufBin = new Statistics::MainBin(name() + " es_newbuf");
|
|
||||||
fnBins.insert(make_pair("es_newbuf", esNewbufBin));
|
|
||||||
|
|
||||||
esDmaLoadBin = new Statistics::MainBin(name() + " es_dma_load");
|
|
||||||
fnBins.insert(make_pair("es_dma_load", esDmaLoadBin));
|
|
||||||
|
|
||||||
dmaMapLoadBin = new Statistics::MainBin(name() + " dma_map_load");
|
|
||||||
fnBins.insert(make_pair("dma_map_load", dmaMapLoadBin));
|
|
||||||
|
|
||||||
etherInputBin = new Statistics::MainBin(name() + " ether_input");
|
|
||||||
fnBins.insert(make_pair("ether_input", etherInputBin));
|
|
||||||
|
|
||||||
netisrInputBin = new Statistics::MainBin(name() + " netisr_input");
|
|
||||||
fnBins.insert(make_pair("netisr_input", netisrInputBin));
|
|
||||||
|
|
||||||
schednetisrIsrBin = new Statistics::MainBin(name() + " schednetisr_isr");
|
|
||||||
fnBins.insert(make_pair("schednetisr_isr", schednetisrIsrBin));
|
|
||||||
|
|
||||||
ipintrBin = new Statistics::MainBin(name() + " ipintr");
|
|
||||||
fnBins.insert(make_pair("ipintr", ipintrBin));
|
|
||||||
|
|
||||||
ipDooptionsBin = new Statistics::MainBin(name() + " ip_dooptions");
|
|
||||||
fnBins.insert(make_pair("ip_dooptions", ipDooptionsBin));
|
|
||||||
|
|
||||||
ipReassBin = new Statistics::MainBin(name() + " ip_reass");
|
|
||||||
fnBins.insert(make_pair("ip_reass", ipReassBin));
|
|
||||||
|
|
||||||
tcpInputBin = new Statistics::MainBin(name() + " tcp_input");
|
|
||||||
fnBins.insert(make_pair("tcp_input", tcpInputBin));
|
|
||||||
|
|
||||||
sbappendBin = new Statistics::MainBin(name() + " sbappend");
|
|
||||||
fnBins.insert(make_pair("sbappend", sbappendBin));
|
|
||||||
|
|
||||||
readBin = new Statistics::MainBin(name() + " read");
|
|
||||||
fnBins.insert(make_pair("read", readBin));
|
|
||||||
|
|
||||||
sooReadBin = new Statistics::MainBin(name() + " soo_read");
|
|
||||||
fnBins.insert(make_pair("soo_read", sooReadBin));
|
|
||||||
|
|
||||||
orecvBin = new Statistics::MainBin(name() + " orecv");
|
|
||||||
fnBins.insert(make_pair("orecv", orecvBin));
|
|
||||||
|
|
||||||
recvitBin = new Statistics::MainBin(name() + " recvit");
|
|
||||||
fnBins.insert(make_pair("recvit", recvitBin));
|
|
||||||
|
|
||||||
soreceiveBin = new Statistics::MainBin(name() + " soreceive");
|
|
||||||
fnBins.insert(make_pair("soreceive", soreceiveBin));
|
|
||||||
|
|
||||||
osendBin = new Statistics::MainBin(name() + " osend");
|
|
||||||
fnBins.insert(make_pair("osend", osendBin));
|
|
||||||
|
|
||||||
writeBin = new Statistics::MainBin(name() + " write");
|
|
||||||
fnBins.insert(make_pair("write", writeBin));
|
|
||||||
|
|
||||||
sooWriteBin = new Statistics::MainBin(name() + " soo_write");
|
|
||||||
fnBins.insert(make_pair("soo_write", sooWriteBin));
|
|
||||||
|
|
||||||
senditBin = new Statistics::MainBin(name() + " sendit");
|
|
||||||
fnBins.insert(make_pair("sendit", senditBin));
|
|
||||||
|
|
||||||
sosendBin = new Statistics::MainBin(name() + " sosend");
|
|
||||||
fnBins.insert(make_pair("sosend", sosendBin));
|
|
||||||
|
|
||||||
tcpSosendBin = new Statistics::MainBin(name() + " tcp_sosend");
|
|
||||||
fnBins.insert(make_pair("tcp_sosend", tcpSosendBin));
|
|
||||||
|
|
||||||
tcpOutputBin = new Statistics::MainBin(name() + " tcp_output");
|
|
||||||
fnBins.insert(make_pair("tcp_output", tcpOutputBin));
|
|
||||||
|
|
||||||
ipOutputBin = new Statistics::MainBin(name() + " ip_output");
|
|
||||||
fnBins.insert(make_pair("ip_output", ipOutputBin));
|
|
||||||
|
|
||||||
etherOutputBin = new Statistics::MainBin(name() + " ether_output");
|
|
||||||
fnBins.insert(make_pair("ether_output", etherOutputBin));
|
|
||||||
|
|
||||||
esStartBin = new Statistics::MainBin(name() + " es_start");
|
|
||||||
fnBins.insert(make_pair("es_start", esStartBin));
|
|
||||||
|
|
||||||
esTransmitBin = new Statistics::MainBin(name() + " es_transmit");
|
|
||||||
fnBins.insert(make_pair("es_transmit", esTransmitBin));
|
|
||||||
|
|
||||||
esTxeofBin = new Statistics::MainBin(name() + " es_txeof");
|
|
||||||
fnBins.insert(make_pair("es_txeof", esTxeofBin));
|
|
||||||
|
|
||||||
idleThreadBin = new Statistics::MainBin(name() + " idle_thread");
|
|
||||||
fnBins.insert(make_pair("idle_thread", idleThreadBin));
|
|
||||||
|
|
||||||
}
|
|
||||||
//INSTRUMENTATION CODEGEN END
|
|
||||||
#endif //FS_MEASURE
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
kernelPanicEvent = new BreakPCEvent(&pcEventQueue, "kernel panic");
|
kernelPanicEvent = new BreakPCEvent(&pcEventQueue, "kernel panic");
|
||||||
consolePanicEvent = new BreakPCEvent(&pcEventQueue, "console panic");
|
consolePanicEvent = new BreakPCEvent(&pcEventQueue, "console panic");
|
||||||
|
@ -208,44 +106,6 @@ Tru64System::Tru64System(const string _name, const uint64_t _init_param,
|
||||||
"debug_printfr", true);
|
"debug_printfr", true);
|
||||||
dumpMbufEvent = new DumpMbufEvent(&pcEventQueue, "dump_mbuf");
|
dumpMbufEvent = new DumpMbufEvent(&pcEventQueue, "dump_mbuf");
|
||||||
|
|
||||||
#ifdef FS_MEASURE
|
|
||||||
//INSTRUMENTATION CODEGEN BEGIN TWO
|
|
||||||
if (bin == true) {
|
|
||||||
esIntrEvent = new FnEvent(&pcEventQueue, "es_intr", this);
|
|
||||||
esRxeofEvent = new FnEvent(&pcEventQueue, "es_rxeof", this);
|
|
||||||
esNewbufEvent = new FnEvent(&pcEventQueue, "es_newbuf", this);
|
|
||||||
esDmaLoadEvent = new FnEvent(&pcEventQueue, "es_dma_load", this);
|
|
||||||
dmaMapLoadEvent = new FnEvent(&pcEventQueue, "dma_map_load", this);
|
|
||||||
etherInputEvent = new FnEvent(&pcEventQueue, "ether_input", this);
|
|
||||||
netisrInputEvent = new FnEvent(&pcEventQueue, "netisr_input", this);
|
|
||||||
schednetisrIsrEvent = new FnEvent(&pcEventQueue, "schednetisr_isr", this);
|
|
||||||
ipintrEvent = new FnEvent(&pcEventQueue, "ipintr", this);
|
|
||||||
ipDooptionsEvent = new FnEvent(&pcEventQueue, "ip_dooptions", this);
|
|
||||||
ipReassEvent = new FnEvent(&pcEventQueue, "ip_reass", this);
|
|
||||||
tcpInputEvent = new FnEvent(&pcEventQueue, "tcp_input", this);
|
|
||||||
sbappendEvent = new FnEvent(&pcEventQueue, "sbappend", this);
|
|
||||||
readEvent = new FnEvent(&pcEventQueue, "read", this);
|
|
||||||
sooReadEvent = new FnEvent(&pcEventQueue, "soo_read", this);
|
|
||||||
orecvEvent = new FnEvent(&pcEventQueue, "orecv", this);
|
|
||||||
recvitEvent = new FnEvent(&pcEventQueue, "recvit", this);
|
|
||||||
soreceiveEvent = new FnEvent(&pcEventQueue, "soreceive", this);
|
|
||||||
osendEvent = new FnEvent(&pcEventQueue, "osend", this);
|
|
||||||
writeEvent = new FnEvent(&pcEventQueue, "write", this);
|
|
||||||
sooWriteEvent = new FnEvent(&pcEventQueue, "soo_write", this);
|
|
||||||
senditEvent = new FnEvent(&pcEventQueue, "sendit", this);
|
|
||||||
sosendEvent = new FnEvent(&pcEventQueue, "sosend", this);
|
|
||||||
tcpSosendEvent = new FnEvent(&pcEventQueue, "tcp_sosend", this);
|
|
||||||
tcpOutputEvent = new FnEvent(&pcEventQueue, "tcp_output", this);
|
|
||||||
ipOutputEvent = new FnEvent(&pcEventQueue, "ip_output", this);
|
|
||||||
etherOutputEvent = new FnEvent(&pcEventQueue, "ether_output", this);
|
|
||||||
esStartEvent = new FnEvent(&pcEventQueue, "es_start", this);
|
|
||||||
esTransmitEvent = new FnEvent(&pcEventQueue, "es_transmit", this);
|
|
||||||
esTxeofEvent = new FnEvent(&pcEventQueue, "es_txeof", this);
|
|
||||||
idleThreadEvent = new FnEvent(&pcEventQueue, "idle_thread", this);
|
|
||||||
}
|
|
||||||
//INSTRUMENTATION CODEGEN END
|
|
||||||
#endif //FS_MEASURE
|
|
||||||
|
|
||||||
Addr addr = 0;
|
Addr addr = 0;
|
||||||
if (kernelSymtab->findAddress("enable_async_printf", addr)) {
|
if (kernelSymtab->findAddress("enable_async_printf", addr)) {
|
||||||
Addr paddr = vtophys(physmem, addr);
|
Addr paddr = vtophys(physmem, addr);
|
||||||
|
@ -299,212 +159,39 @@ Tru64System::Tru64System(const string _name, const uint64_t _init_param,
|
||||||
dumpMbufEvent->schedule(addr);
|
dumpMbufEvent->schedule(addr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef FS_MEASURE
|
// BINNING STUFF
|
||||||
//INSTRUMENTATION CODEGEN BEGIN THREE
|
|
||||||
if (bin == true) {
|
if (bin == true) {
|
||||||
if (kernelSymtab->findAddress("es_intr", addr))
|
int end = binned_fns.size();
|
||||||
esIntrEvent->schedule(addr);
|
assert(!(end & 1));
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'es_intr\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("es_rxeof", addr))
|
Statistics::MainBin *Bin;
|
||||||
esRxeofEvent->schedule(addr);
|
Addr address = 0;
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'es_rxeof\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("es_newbuf", addr))
|
fnEvents.resize(end>>1);
|
||||||
esNewbufEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'es_newbuf\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("es_dma_load", addr))
|
for (int i = 0; i < end; i +=2) {
|
||||||
esDmaLoadEvent->schedule(addr);
|
cout << "creating Bin for " << binned_fns[i] << endl;
|
||||||
else
|
Bin = new Statistics::MainBin(name() + " " + binned_fns[i]);
|
||||||
panic("could not find kernel symbol \'es_dma_load\'");
|
fnBins.insert(make_pair(binned_fns[i], Bin));
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("dma_map_load", addr))
|
fnEvents[(i>>1)] = new FnEvent(&pcEventQueue, binned_fns[i], this);
|
||||||
dmaMapLoadEvent->schedule(addr);
|
if (kernelSymtab->findAddress(binned_fns[i], address))
|
||||||
else
|
fnEvents[(i>>1)]->schedule(address);
|
||||||
panic("could not find kernel symbol \'dma_map_load\'");
|
else
|
||||||
|
panic("could not find kernel symbol %s\n", binned_fns[i]);
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("ether_input", addr))
|
if (binned_fns[i+1] == "null")
|
||||||
etherInputEvent->schedule(addr);
|
populateMap(binned_fns[i], "");
|
||||||
else
|
else
|
||||||
panic("could not find kernel symbol \'ether_input\'");
|
populateMap(binned_fns[i], binned_fns[i+1]);
|
||||||
|
}
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("netisr_input", addr))
|
|
||||||
netisrInputEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'netisr_input\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("schednetisr_isr", addr))
|
|
||||||
schednetisrIsrEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'schednetisr_isr\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("ipintr", addr))
|
|
||||||
ipintrEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'ipintr\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("ip_dooptions", addr))
|
|
||||||
ipDooptionsEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'ip_dooptions\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("ip_reass", addr))
|
|
||||||
ipReassEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'ip_reass\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("tcp_input", addr))
|
|
||||||
tcpInputEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'tcp_input\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("sbappend", addr))
|
|
||||||
sbappendEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'sbappend\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("read", addr))
|
|
||||||
readEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'read\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("soo_read", addr))
|
|
||||||
sooReadEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'soo_read\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("orecv", addr))
|
|
||||||
orecvEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'orecv\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("recvit", addr))
|
|
||||||
recvitEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'recvit\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("soreceive", addr))
|
|
||||||
soreceiveEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'soreceive\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("osend", addr))
|
|
||||||
osendEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'osend\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("write", addr))
|
|
||||||
writeEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'write\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("soo_write", addr))
|
|
||||||
sooWriteEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'soo_write\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("sendit", addr))
|
|
||||||
senditEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'sendit\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("sosend", addr))
|
|
||||||
sosendEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'sosend\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("tcp_sosend", addr))
|
|
||||||
tcpSosendEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'tcp_sosend\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("tcp_output", addr))
|
|
||||||
tcpOutputEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'tcp_output\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("ip_output", addr))
|
|
||||||
ipOutputEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'ip_output\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("ether_output", addr))
|
|
||||||
etherOutputEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'ether_output\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("es_start", addr))
|
|
||||||
esStartEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'es_start\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("es_transmit", addr))
|
|
||||||
esTransmitEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'es_transmit\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("es_txeof", addr))
|
|
||||||
esTxeofEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'es_txeof\'");
|
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("idle_thread", addr))
|
|
||||||
idleThreadEvent->schedule(addr);
|
|
||||||
else
|
|
||||||
panic("could not find kernel symbol \'idle_thread\'");
|
|
||||||
|
|
||||||
}
|
|
||||||
//INSTRUMENTATION CODEGEN END
|
|
||||||
if (bin == true) {
|
|
||||||
fnCalls
|
fnCalls
|
||||||
.name(name() + ":fnCalls")
|
.name(name() + ":fnCalls")
|
||||||
.desc("all fn calls being tracked")
|
.desc("all fn calls being tracked")
|
||||||
;
|
;
|
||||||
|
|
||||||
populateMap("es_intr", "");
|
|
||||||
populateMap("es_rxeof", "es_intr");
|
|
||||||
populateMap("es_newbuf", "es_rxeof");
|
|
||||||
populateMap("es_dma_load", "es_newbuf");
|
|
||||||
populateMap("dma_map_load", "es_dma_load");
|
|
||||||
populateMap("ether_input", "es_rxeof");
|
|
||||||
populateMap("netisr_input", "ether_input");
|
|
||||||
populateMap("schednetisr_isr", "netisr_input");
|
|
||||||
|
|
||||||
populateMap("ipintr", "");
|
|
||||||
populateMap("ip_dooptions", "ipintr");
|
|
||||||
populateMap("ip_reass", "ipintr");
|
|
||||||
populateMap("tcp_input", "ipintr");
|
|
||||||
populateMap("sbappend", "tcp_input");
|
|
||||||
|
|
||||||
populateMap("read", "");
|
|
||||||
populateMap("orecv", "");
|
|
||||||
populateMap("soo_read", "read");
|
|
||||||
populateMap("recvit", "orecv");
|
|
||||||
populateMap("soreceive", "recvit");
|
|
||||||
populateMap("soreceive", "soo_read");
|
|
||||||
|
|
||||||
populateMap("write", "");
|
|
||||||
populateMap("osend", "");
|
|
||||||
populateMap("soo_write", "write");
|
|
||||||
populateMap("sendit", "osend");
|
|
||||||
populateMap("sosend", "sendit");
|
|
||||||
populateMap("sosend", "soo_write");
|
|
||||||
populateMap("tcp_sosend", "sosend");
|
|
||||||
populateMap("tcp_output", "tcp_sosend");
|
|
||||||
populateMap("ip_output", "tcp_output");
|
|
||||||
populateMap("ether_output", "ip_output");
|
|
||||||
populateMap("es_start", "ether_output");
|
|
||||||
populateMap("es_transmit", "es_start");
|
|
||||||
|
|
||||||
populateMap("es_txeof", "es_intr");
|
|
||||||
|
|
||||||
populateMap("idle_thread", "");
|
|
||||||
}
|
}
|
||||||
#endif //FS_MEASURE
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
Tru64System::~Tru64System()
|
Tru64System::~Tru64System()
|
||||||
|
@ -527,43 +214,13 @@ Tru64System::~Tru64System()
|
||||||
delete debugPrintfrEvent;
|
delete debugPrintfrEvent;
|
||||||
delete dumpMbufEvent;
|
delete dumpMbufEvent;
|
||||||
|
|
||||||
#ifdef FS_MEASURE
|
|
||||||
//INSTRUMENTATION CODEGEN BEGIN FOUR
|
|
||||||
if (bin == true) {
|
if (bin == true) {
|
||||||
delete esIntrEvent;
|
int end = fnEvents.size();
|
||||||
delete esRxeofEvent;
|
for (int i = 0; i < end; ++i) {
|
||||||
delete esNewbufEvent;
|
delete fnEvents[i];
|
||||||
delete esDmaLoadEvent;
|
}
|
||||||
delete dmaMapLoadEvent;
|
fnEvents.clear();
|
||||||
delete etherInputEvent;
|
|
||||||
delete netisrInputEvent;
|
|
||||||
delete schednetisrIsrEvent;
|
|
||||||
delete ipintrEvent;
|
|
||||||
delete ipDooptionsEvent;
|
|
||||||
delete ipReassEvent;
|
|
||||||
delete tcpInputEvent;
|
|
||||||
delete sbappendEvent;
|
|
||||||
delete readEvent;
|
|
||||||
delete sooReadEvent;
|
|
||||||
delete orecvEvent;
|
|
||||||
delete recvitEvent;
|
|
||||||
delete soreceiveEvent;
|
|
||||||
delete osendEvent;
|
|
||||||
delete writeEvent;
|
|
||||||
delete sooWriteEvent;
|
|
||||||
delete senditEvent;
|
|
||||||
delete sosendEvent;
|
|
||||||
delete tcpSosendEvent;
|
|
||||||
delete tcpOutputEvent;
|
|
||||||
delete ipOutputEvent;
|
|
||||||
delete etherOutputEvent;
|
|
||||||
delete esStartEvent;
|
|
||||||
delete esTransmitEvent;
|
|
||||||
delete esTxeofEvent;
|
|
||||||
delete idleThreadEvent;
|
|
||||||
}
|
}
|
||||||
//INSTRUMENTATION CODEGEN END
|
|
||||||
#endif //FS_MEASURE
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -629,19 +286,16 @@ Tru64System::findCaller(std::string callee, std::string caller) const
|
||||||
void
|
void
|
||||||
Tru64System::dumpState(ExecContext *xc) const
|
Tru64System::dumpState(ExecContext *xc) const
|
||||||
{
|
{
|
||||||
#ifndef SW_DEBUG
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
if (xc->swCtx) {
|
if (xc->swCtx) {
|
||||||
stack<fnCall *> copy(xc->swCtx->callStack);
|
stack<fnCall *> copy(xc->swCtx->callStack);
|
||||||
if (copy.empty())
|
if (copy.empty())
|
||||||
return;
|
return;
|
||||||
cprintf("xc->swCtx:\n");
|
DPRINTF(TCPIP, "xc->swCtx:\n");
|
||||||
fnCall *top;
|
fnCall *top;
|
||||||
cprintf("|| call: %d\n",xc->swCtx->calls);
|
DPRINTF(TCPIP, "|| call : %d\n",xc->swCtx->calls);
|
||||||
for (top = copy.top(); !copy.empty(); copy.pop() ) {
|
for (top = copy.top(); !copy.empty(); copy.pop() ) {
|
||||||
top = copy.top();
|
top = copy.top();
|
||||||
cprintf("|| %13s : %s \n", top->name, top->myBin->name());
|
DPRINTF(TCPIP, "|| %13s : %s \n", top->name, top->myBin->name());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -657,6 +311,7 @@ BEGIN_DECLARE_SIM_OBJECT_PARAMS(Tru64System)
|
||||||
Param<string> console_code;
|
Param<string> console_code;
|
||||||
Param<string> pal_code;
|
Param<string> pal_code;
|
||||||
Param<string> boot_osflags;
|
Param<string> boot_osflags;
|
||||||
|
VectorParam<string> binned_fns;
|
||||||
|
|
||||||
END_DECLARE_SIM_OBJECT_PARAMS(Tru64System)
|
END_DECLARE_SIM_OBJECT_PARAMS(Tru64System)
|
||||||
|
|
||||||
|
@ -670,8 +325,8 @@ BEGIN_INIT_SIM_OBJECT_PARAMS(Tru64System)
|
||||||
INIT_PARAM(console_code, "file that contains the console code"),
|
INIT_PARAM(console_code, "file that contains the console code"),
|
||||||
INIT_PARAM(pal_code, "file that contains palcode"),
|
INIT_PARAM(pal_code, "file that contains palcode"),
|
||||||
INIT_PARAM_DFLT(boot_osflags, "flags to pass to the kernel during boot",
|
INIT_PARAM_DFLT(boot_osflags, "flags to pass to the kernel during boot",
|
||||||
"a")
|
"a"),
|
||||||
|
INIT_PARAM(binned_fns, "functions to be broken down and binned")
|
||||||
|
|
||||||
END_INIT_SIM_OBJECT_PARAMS(Tru64System)
|
END_INIT_SIM_OBJECT_PARAMS(Tru64System)
|
||||||
|
|
||||||
|
@ -679,7 +334,8 @@ CREATE_SIM_OBJECT(Tru64System)
|
||||||
{
|
{
|
||||||
Tru64System *sys = new Tru64System(getInstanceName(), init_param, mem_ctl,
|
Tru64System *sys = new Tru64System(getInstanceName(), init_param, mem_ctl,
|
||||||
physmem, kernel_code, console_code,
|
physmem, kernel_code, console_code,
|
||||||
pal_code, boot_osflags, bin);
|
pal_code, boot_osflags, bin,
|
||||||
|
binned_fns);
|
||||||
|
|
||||||
return sys;
|
return sys;
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,42 +57,6 @@ class Tru64System : public System
|
||||||
SymbolTable *kernelSymtab;
|
SymbolTable *kernelSymtab;
|
||||||
SymbolTable *consoleSymtab;
|
SymbolTable *consoleSymtab;
|
||||||
|
|
||||||
#ifdef FS_MEASURE
|
|
||||||
//INSTRUMENTATION CODEGEN BEGIN ONE
|
|
||||||
Statistics::MainBin *esIntrBin;
|
|
||||||
Statistics::MainBin *esRxeofBin;
|
|
||||||
Statistics::MainBin *esNewbufBin;
|
|
||||||
Statistics::MainBin *esDmaLoadBin;
|
|
||||||
Statistics::MainBin *dmaMapLoadBin;
|
|
||||||
Statistics::MainBin *etherInputBin;
|
|
||||||
Statistics::MainBin *netisrInputBin;
|
|
||||||
Statistics::MainBin *schednetisrIsrBin;
|
|
||||||
Statistics::MainBin *ipintrBin;
|
|
||||||
Statistics::MainBin *ipDooptionsBin;
|
|
||||||
Statistics::MainBin *ipReassBin;
|
|
||||||
Statistics::MainBin *tcpInputBin;
|
|
||||||
Statistics::MainBin *sbappendBin;
|
|
||||||
Statistics::MainBin *readBin;
|
|
||||||
Statistics::MainBin *sooReadBin;
|
|
||||||
Statistics::MainBin *orecvBin;
|
|
||||||
Statistics::MainBin *recvitBin;
|
|
||||||
Statistics::MainBin *soreceiveBin;
|
|
||||||
Statistics::MainBin *osendBin;
|
|
||||||
Statistics::MainBin *writeBin;
|
|
||||||
Statistics::MainBin *sooWriteBin;
|
|
||||||
Statistics::MainBin *senditBin;
|
|
||||||
Statistics::MainBin *sosendBin;
|
|
||||||
Statistics::MainBin *tcpSosendBin;
|
|
||||||
Statistics::MainBin *tcpOutputBin;
|
|
||||||
Statistics::MainBin *ipOutputBin;
|
|
||||||
Statistics::MainBin *etherOutputBin;
|
|
||||||
Statistics::MainBin *esStartBin;
|
|
||||||
Statistics::MainBin *esTransmitBin;
|
|
||||||
Statistics::MainBin *esTxeofBin;
|
|
||||||
Statistics::MainBin *idleThreadBin;
|
|
||||||
//INSTRUMENTATION CODEGEN END
|
|
||||||
#endif //FS_MEASURE
|
|
||||||
|
|
||||||
BreakPCEvent *kernelPanicEvent;
|
BreakPCEvent *kernelPanicEvent;
|
||||||
BreakPCEvent *consolePanicEvent;
|
BreakPCEvent *consolePanicEvent;
|
||||||
BadAddrEvent *badaddrEvent;
|
BadAddrEvent *badaddrEvent;
|
||||||
|
@ -102,41 +66,8 @@ class Tru64System : public System
|
||||||
DebugPrintfEvent *debugPrintfEvent;
|
DebugPrintfEvent *debugPrintfEvent;
|
||||||
DebugPrintfEvent *debugPrintfrEvent;
|
DebugPrintfEvent *debugPrintfrEvent;
|
||||||
DumpMbufEvent *dumpMbufEvent;
|
DumpMbufEvent *dumpMbufEvent;
|
||||||
#ifdef FS_MEASURE
|
|
||||||
//INSTRUMENTATION CODEGEN BEGIN TWO
|
std::vector<FnEvent *> fnEvents;
|
||||||
FnEvent *esIntrEvent;
|
|
||||||
FnEvent *esRxeofEvent;
|
|
||||||
FnEvent *esNewbufEvent;
|
|
||||||
FnEvent *esDmaLoadEvent;
|
|
||||||
FnEvent *dmaMapLoadEvent;
|
|
||||||
FnEvent *etherInputEvent;
|
|
||||||
FnEvent *netisrInputEvent;
|
|
||||||
FnEvent *schednetisrIsrEvent;
|
|
||||||
FnEvent *ipintrEvent;
|
|
||||||
FnEvent *ipDooptionsEvent;
|
|
||||||
FnEvent *ipReassEvent;
|
|
||||||
FnEvent *tcpInputEvent;
|
|
||||||
FnEvent *sbappendEvent;
|
|
||||||
FnEvent *readEvent;
|
|
||||||
FnEvent *sooReadEvent;
|
|
||||||
FnEvent *orecvEvent;
|
|
||||||
FnEvent *recvitEvent;
|
|
||||||
FnEvent *soreceiveEvent;
|
|
||||||
FnEvent *osendEvent;
|
|
||||||
FnEvent *writeEvent;
|
|
||||||
FnEvent *sooWriteEvent;
|
|
||||||
FnEvent *senditEvent;
|
|
||||||
FnEvent *sosendEvent;
|
|
||||||
FnEvent *tcpSosendEvent;
|
|
||||||
FnEvent *tcpOutputEvent;
|
|
||||||
FnEvent *ipOutputEvent;
|
|
||||||
FnEvent *etherOutputEvent;
|
|
||||||
FnEvent *esStartEvent;
|
|
||||||
FnEvent *esTransmitEvent;
|
|
||||||
FnEvent *esTxeofEvent;
|
|
||||||
FnEvent *idleThreadEvent;
|
|
||||||
//INSTRUMENTATION CODEGEN END
|
|
||||||
#endif //FS_MEASURE
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -144,6 +75,7 @@ class Tru64System : public System
|
||||||
Addr kernelEnd;
|
Addr kernelEnd;
|
||||||
Addr kernelEntry;
|
Addr kernelEntry;
|
||||||
bool bin;
|
bool bin;
|
||||||
|
std::vector<string> binned_fns;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
std::vector<RemoteGDB *> remoteGDB;
|
std::vector<RemoteGDB *> remoteGDB;
|
||||||
|
@ -158,7 +90,8 @@ class Tru64System : public System
|
||||||
const std::string &console_path,
|
const std::string &console_path,
|
||||||
const std::string &palcode,
|
const std::string &palcode,
|
||||||
const std::string &boot_osflags,
|
const std::string &boot_osflags,
|
||||||
const bool _bin);
|
const bool _bin,
|
||||||
|
const std::vector<string> &binned_fns);
|
||||||
~Tru64System();
|
~Tru64System();
|
||||||
|
|
||||||
int registerExecContext(ExecContext *xc);
|
int registerExecContext(ExecContext *xc);
|
||||||
|
@ -173,7 +106,7 @@ class Tru64System : public System
|
||||||
static void DumpMbuf(AlphaArguments args);
|
static void DumpMbuf(AlphaArguments args);
|
||||||
|
|
||||||
|
|
||||||
// Lisa's fs measure stuff
|
// Lisa's binning stuff
|
||||||
private:
|
private:
|
||||||
std::multimap<const std::string, std::string> callerMap;
|
std::multimap<const std::string, std::string> callerMap;
|
||||||
void populateMap(std::string caller, std::string callee);
|
void populateMap(std::string caller, std::string callee);
|
||||||
|
@ -181,6 +114,7 @@ class Tru64System : public System
|
||||||
public:
|
public:
|
||||||
bool findCaller(std::string callee, std::string caller) const;
|
bool findCaller(std::string callee, std::string caller) const;
|
||||||
void dumpState(ExecContext *xc) const;
|
void dumpState(ExecContext *xc) const;
|
||||||
|
//
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // __TRU64_SYSTEM_HH__
|
#endif // __TRU64_SYSTEM_HH__
|
||||||
|
|
|
@ -50,13 +50,11 @@ System::System(const std::string _name,
|
||||||
{
|
{
|
||||||
// add self to global system list
|
// add self to global system list
|
||||||
systemList.push_back(this);
|
systemList.push_back(this);
|
||||||
#ifdef FS_MEASURE
|
|
||||||
if (bin == true) {
|
if (bin == true) {
|
||||||
nonPath = new Statistics::MainBin("non TCPIP path stats");
|
Kernel = new Statistics::MainBin("non TCPIP Kernel stats");
|
||||||
nonPath->activate();
|
Kernel->activate();
|
||||||
} else
|
} else
|
||||||
nonPath = NULL;
|
Kernel = NULL;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -104,7 +102,6 @@ printSystems()
|
||||||
System::printSystems();
|
System::printSystems();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef FS_MEASURE
|
|
||||||
Statistics::MainBin *
|
Statistics::MainBin *
|
||||||
System::getBin(const std::string &name)
|
System::getBin(const std::string &name)
|
||||||
{
|
{
|
||||||
|
@ -127,7 +124,6 @@ System::findContext(Addr pcb)
|
||||||
} else
|
} else
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
#endif //FS_MEASURE
|
|
||||||
|
|
||||||
DEFINE_SIM_OBJECT_CLASS_NAME("System", System)
|
DEFINE_SIM_OBJECT_CLASS_NAME("System", System)
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,7 @@ class System : public SimObject
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Statistics::Scalar<Counter> fnCalls;
|
Statistics::Scalar<Counter> fnCalls;
|
||||||
Statistics::MainBin *nonPath;
|
Statistics::MainBin *Kernel;
|
||||||
|
|
||||||
Statistics::MainBin * getBin(const std::string &name);
|
Statistics::MainBin * getBin(const std::string &name);
|
||||||
virtual bool findCaller(std::string, std::string) const = 0;
|
virtual bool findCaller(std::string, std::string) const = 0;
|
||||||
|
|
Loading…
Reference in a new issue