summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/alpha/isa_desc14
-rw-r--r--base/statistics.hh2
-rw-r--r--cpu/exec_context.cc48
-rw-r--r--cpu/exec_context.hh12
-rw-r--r--cpu/simple_cpu/simple_cpu.cc40
-rw-r--r--cpu/simple_cpu/simple_cpu.hh11
-rw-r--r--kern/tru64/tru64_events.cc17
-rw-r--r--kern/tru64/tru64_events.hh4
-rw-r--r--kern/tru64/tru64_system.cc428
-rw-r--r--kern/tru64/tru64_system.hh80
-rw-r--r--sim/system.cc72
-rw-r--r--sim/system.hh6
12 files changed, 240 insertions, 494 deletions
diff --git a/arch/alpha/isa_desc b/arch/alpha/isa_desc
index a7665210f..0da087f97 100644
--- a/arch/alpha/isa_desc
+++ b/arch/alpha/isa_desc
@@ -5,7 +5,7 @@
let {{
global rcs_id
- rcs_id = "$Id$"
+ rcs_id = "$Id: s.isa_desc 1.43 04/02/29 22:41:10-05:00 ehallnor@zazzer.eecs.umich.edu $"
}};
@@ -1854,9 +1854,9 @@ decode OPCODE default Unknown::unknown() {
0x23: ldt({{ EA = Rb + disp; }}, {{ Fa = Mem.df; }});
0x2a: ldl_l({{ EA = Rb + disp; }}, {{ Ra.sl = Mem.sl; }}, LOCKED);
0x2b: ldq_l({{ EA = Rb + disp; }}, {{ Ra.uq = Mem.uq; }}, LOCKED);
- //0x20: copy_load({{EA = Ra;}},
- // {{memAccessObj->copySrcTranslate(EA);}},
- // IsMemRef, IsLoad, IsCopy);
+ 0x20: copy_load({{EA = Ra;}},
+ {{ fault = memAccessObj->copySrcTranslate(EA);}},
+ IsMemRef, IsLoad, IsCopy);
}
format LoadOrPrefetch {
@@ -1876,9 +1876,9 @@ decode OPCODE default Unknown::unknown() {
0x0f: stq_u({{ EA = (Rb + disp) & ~7; }}, {{ Mem.uq = Ra.uq; }});
0x26: sts({{ EA = Rb + disp; }}, {{ Mem.ul = t_to_s(Fa.uq); }});
0x27: stt({{ EA = Rb + disp; }}, {{ Mem.df = Fa; }});
- //0x24: copy_store({{EA = Rb;}},
- // {{memAccessObj->copy(EA);}},
- // IsMemRef, IsStore, IsCopy);
+ 0x24: copy_store({{EA = Rb;}},
+ {{ fault = memAccessObj->copy(EA);}},
+ IsMemRef, IsStore, IsCopy);
}
format StoreCond {
diff --git a/base/statistics.hh b/base/statistics.hh
index c99aadab5..0dad31a5a 100644
--- a/base/statistics.hh
+++ b/base/statistics.hh
@@ -2498,7 +2498,7 @@ struct NoBin
* binned. If the typedef is NoBin, nothing is binned. If it is
* MainBin, then all stats are binned under that Bin.
*/
-#if defined(STATS_BINNING)
+#if defined(FS_MEASURE)
typedef MainBin DefaultBin;
#else
typedef NoBin DefaultBin;
diff --git a/cpu/exec_context.cc b/cpu/exec_context.cc
index b0ebb9622..20ab64bc4 100644
--- a/cpu/exec_context.cc
+++ b/cpu/exec_context.cc
@@ -104,6 +104,29 @@ ExecContext::serialize(ostream &os)
regs.serialize(os);
// thread_num and cpu_id are deterministic from the config
SERIALIZE_SCALAR(func_exe_inst);
+
+ bool ctx = false;
+ if (swCtx) {
+ ctx = true;
+ SERIALIZE_SCALAR(ctx);
+ SERIALIZE_SCALAR(swCtx->calls);
+ std::stack<fnCall *> *stack = &(swCtx->callStack);
+ fnCall *top;
+ int size = stack->size();
+ SERIALIZE_SCALAR(size);
+
+ for (int j=0; j<size; ++j) {
+ top = stack->top();
+ paramOut(os, csprintf("stackpos[%d]",j), top->name);
+ }
+ } else {
+ SERIALIZE_SCALAR(ctx);
+ }
+ if (system->bin) {
+ Statistics::MainBin *cur = Statistics::MainBin::curBin();
+ string bin_name = cur->name();
+ SERIALIZE_SCALAR(bin_name);
+ }
}
@@ -114,6 +137,31 @@ ExecContext::unserialize(Checkpoint *cp, const std::string &section)
regs.unserialize(cp, section);
// thread_num and cpu_id are deterministic from the config
UNSERIALIZE_SCALAR(func_exe_inst);
+
+ bool ctx;
+ UNSERIALIZE_SCALAR(ctx);
+ if (ctx) {
+ swCtx = new SWContext;
+ UNSERIALIZE_SCALAR(swCtx->calls);
+ int size;
+ UNSERIALIZE_SCALAR(size);
+ fnCall *call = new fnCall[size];
+ for (int i=0; i<size; ++i) {
+ paramIn(cp, section, csprintf("stackpos[%d]",i), call[i].name);
+ call[i].myBin = system->getBin(call[i].name);
+ }
+
+ for (int i=size-1; i>=0; --i) {
+ swCtx->callStack.push(&(call[i]));
+ }
+
+ }
+
+ if (system->bin) {
+ string bin_name;
+ UNSERIALIZE_SCALAR(bin_name);
+ system->getBin(bin_name)->activate();
+ }
}
diff --git a/cpu/exec_context.hh b/cpu/exec_context.hh
index a4bbdd484..a72516ac7 100644
--- a/cpu/exec_context.hh
+++ b/cpu/exec_context.hh
@@ -147,6 +147,18 @@ class ExecContext
#endif
+ /**
+ * Temporary storage to pass the source address from copy_load to
+ * copy_store.
+ * @todo Remove this temporary when we have a better way to do it.
+ */
+ Addr copySrcAddr;
+ /**
+ * Temp storage for the physical source address of a copy.
+ * @todo Remove this temporary when we have a better way to do it.
+ */
+ Addr copySrcPhysAddr;
+
/*
* number of executed instructions, for matching with syscall trace
diff --git a/cpu/simple_cpu/simple_cpu.cc b/cpu/simple_cpu/simple_cpu.cc
index c25a95775..c2796efd0 100644
--- a/cpu/simple_cpu/simple_cpu.cc
+++ b/cpu/simple_cpu/simple_cpu.cc
@@ -327,6 +327,46 @@ change_thread_state(int thread_number, int activate, int priority)
{
}
+Fault
+SimpleCPU::copySrcTranslate(Addr src)
+{
+ memReq->reset(src, (dcacheInterface) ?
+ dcacheInterface->getBlockSize()
+ : 64);
+
+ // translate to physical address
+ Fault fault = xc->translateDataReadReq(memReq);
+
+ if (fault == No_Fault) {
+ xc->copySrcAddr = src;
+ xc->copySrcPhysAddr = memReq->paddr;
+ } else {
+ xc->copySrcAddr = 0;
+ xc->copySrcPhysAddr = 0;
+ }
+ return fault;
+}
+
+Fault
+SimpleCPU::copy(Addr dest)
+{
+ int blk_size = (dcacheInterface) ? dcacheInterface->getBlockSize() : 64;
+ uint8_t data[blk_size];
+ assert(xc->copySrcPhysAddr);
+ memReq->reset(dest, blk_size);
+ // translate to physical address
+ Fault fault = xc->translateDataWriteReq(memReq);
+ if (fault == No_Fault) {
+ Addr dest_addr = memReq->paddr;
+ // Need to read straight from memory since we have more than 8 bytes.
+ memReq->paddr = xc->copySrcPhysAddr;
+ xc->mem->read(memReq, data);
+ memReq->paddr = dest_addr;
+ xc->mem->write(memReq, data);
+ }
+ return fault;
+}
+
// precise architected memory state accessor macros
template <class T>
Fault
diff --git a/cpu/simple_cpu/simple_cpu.hh b/cpu/simple_cpu/simple_cpu.hh
index 4bdc69ad1..9edd66ab4 100644
--- a/cpu/simple_cpu/simple_cpu.hh
+++ b/cpu/simple_cpu/simple_cpu.hh
@@ -247,16 +247,9 @@ class SimpleCPU : public BaseCPU
// need to do this...
}
- void copySrcTranslate(Addr src)
- {
- panic("Haven't implemented Copy Src translate yet in SimpleCPU\n");
- }
-
- void copy(Addr dest)
- {
- panic("Haven't implemented Copy yet in SimpleCPU\n");
- }
+ Fault copySrcTranslate(Addr src);
+ Fault copy(Addr dest);
};
#endif // __SIMPLE_CPU_HH__
diff --git a/kern/tru64/tru64_events.cc b/kern/tru64/tru64_events.cc
index f542256e4..e018cb242 100644
--- a/kern/tru64/tru64_events.cc
+++ b/kern/tru64/tru64_events.cc
@@ -35,11 +35,8 @@
#include "kern/tru64/tru64_events.hh"
#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)
@@ -110,7 +107,6 @@ DumpMbufEvent::process(ExecContext *xc)
}
}
-#ifdef FS_MEASURE
FnEvent::FnEvent(PCEventQueue *q, const std::string & desc, System *system)
: PCEvent(q, desc), _name(desc)
{
@@ -128,13 +124,23 @@ FnEvent::process(ExecContext *xc)
DPRINTF(TCPIP, "%s: %s Event!!!\n", xc->system->name(), description);
if (ctx && !ctx->callStack.empty()) {
+ DPRINTF(TCPIP, "already a callstack!\n");
fnCall *last = ctx->callStack.top();
+
+ if (last->name == "idle_thread")
+ ctx->calls++;
+
if (!xc->system->findCaller(myname(), last->name)) {
+ DPRINTF(TCPIP, "but can't find parent %s\n", last->name);
return;
}
ctx->calls--;
+
+ //assert(!ctx->calls && "on a binned fn, calls should == 0 (but can happen in boot)");
} else {
+ DPRINTF(TCPIP, "no callstack yet\n");
if (!xc->system->findCaller(myname(), "")) {
+ DPRINTF(TCPIP, "not the right function, returning\n");
return;
}
if (!ctx) {
@@ -150,6 +156,7 @@ FnEvent::process(ExecContext *xc)
ctx->callStack.push(call);
myBin->activate();
xc->system->fnCalls++;
+ DPRINTF(TCPIP, "fnCalls for %s is %d\n", description,
+ xc->system->fnCalls.val());
xc->system->dumpState(xc);
}
-#endif //FS_MEASURE
diff --git a/kern/tru64/tru64_events.hh b/kern/tru64/tru64_events.hh
index 2067f2ef3..96e6a8b26 100644
--- a/kern/tru64/tru64_events.hh
+++ b/kern/tru64/tru64_events.hh
@@ -35,9 +35,7 @@
class ExecContext;
-#ifdef FS_MEASURE
class System;
-#endif
class SkipFuncEvent : public PCEvent
{
@@ -82,7 +80,6 @@ class DumpMbufEvent : public PCEvent
virtual void process(ExecContext *xc);
};
-#ifdef FS_MEASURE
class FnEvent : public PCEvent
{
public:
@@ -94,5 +91,4 @@ class FnEvent : public PCEvent
std::string _name;
Statistics::MainBin *myBin;
};
-#endif //FS_MEASURE
#endif // __TRU64_EVENTS_HH__
diff --git a/kern/tru64/tru64_system.cc b/kern/tru64/tru64_system.cc
index 13f28beab..8df8cc86d 100644
--- a/kern/tru64/tru64_system.cc
+++ b/kern/tru64/tru64_system.cc
@@ -41,17 +41,15 @@
#include "targetarch/isa_traits.hh"
#include "targetarch/vtophys.hh"
-//un-comment this to see the state of call stack when it changes.
-//#define SW_DEBUG
-
using namespace std;
Tru64System::Tru64System(const string _name, const uint64_t _init_param,
MemoryController *_memCtrl, PhysicalMemory *_physmem,
const string &kernel_path, const string &console_path,
const string &palcode, const string &boot_osflags,
- const bool _bin)
- : System(_name, _init_param, _memCtrl, _physmem, _bin), bin(_bin)
+ const bool _bin, const vector<string> &binned_fns)
+ : System(_name, _init_param, _memCtrl, _physmem, _bin), bin(_bin),
+ binned_fns(binned_fns)
{
kernelSymtab = new SymbolTable;
consoleSymtab = new SymbolTable;
@@ -92,106 +90,6 @@ Tru64System::Tru64System(const string _name, const uint64_t _init_param,
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
kernelPanicEvent = new BreakPCEvent(&pcEventQueue, "kernel panic");
consolePanicEvent = new BreakPCEvent(&pcEventQueue, "console panic");
@@ -208,44 +106,6 @@ Tru64System::Tru64System(const string _name, const uint64_t _init_param,
"debug_printfr", true);
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;
if (kernelSymtab->findAddress("enable_async_printf", addr)) {
Addr paddr = vtophys(physmem, addr);
@@ -299,212 +159,39 @@ Tru64System::Tru64System(const string _name, const uint64_t _init_param,
dumpMbufEvent->schedule(addr);
#endif
-#ifdef FS_MEASURE
- //INSTRUMENTATION CODEGEN BEGIN THREE
+ // BINNING STUFF
if (bin == true) {
- if (kernelSymtab->findAddress("es_intr", addr))
- esIntrEvent->schedule(addr);
- else
- panic("could not find kernel symbol \'es_intr\'");
-
- if (kernelSymtab->findAddress("es_rxeof", addr))
- esRxeofEvent->schedule(addr);
- else
- panic("could not find kernel symbol \'es_rxeof\'");
-
- if (kernelSymtab->findAddress("es_newbuf", addr))
- esNewbufEvent->schedule(addr);
- else
- panic("could not find kernel symbol \'es_newbuf\'");
-
- if (kernelSymtab->findAddress("es_dma_load", addr))
- esDmaLoadEvent->schedule(addr);
- else
- panic("could not find kernel symbol \'es_dma_load\'");
-
- if (kernelSymtab->findAddress("dma_map_load", addr))
- dmaMapLoadEvent->schedule(addr);
- else
- panic("could not find kernel symbol \'dma_map_load\'");
-
- if (kernelSymtab->findAddress("ether_input", addr))
- etherInputEvent->schedule(addr);
- else
- panic("could not find kernel symbol \'ether_input\'");
-
- 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\'");
+ int end = binned_fns.size();
+ assert(!(end & 1));
+
+ Statistics::MainBin *Bin;
+ Addr address = 0;
+
+ fnEvents.resize(end>>1);
+
+ for (int i = 0; i < end; i +=2) {
+ cout << "creating Bin for " << binned_fns[i] << endl;
+ Bin = new Statistics::MainBin(name() + " " + binned_fns[i]);
+ fnBins.insert(make_pair(binned_fns[i], Bin));
+
+ fnEvents[(i>>1)] = new FnEvent(&pcEventQueue, binned_fns[i], this);
+ if (kernelSymtab->findAddress(binned_fns[i], address))
+ fnEvents[(i>>1)]->schedule(address);
+ else
+ panic("could not find kernel symbol %s\n", binned_fns[i]);
+
+ if (binned_fns[i+1] == "null")
+ populateMap(binned_fns[i], "");
+ else
+ populateMap(binned_fns[i], binned_fns[i+1]);
+ }
- }
- //INSTRUMENTATION CODEGEN END
- if (bin == true) {
fnCalls
.name(name() + ":fnCalls")
.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()
@@ -527,43 +214,13 @@ Tru64System::~Tru64System()
delete debugPrintfrEvent;
delete dumpMbufEvent;
-#ifdef FS_MEASURE
- //INSTRUMENTATION CODEGEN BEGIN FOUR
if (bin == true) {
- delete esIntrEvent;
- delete esRxeofEvent;
- delete esNewbufEvent;
- delete esDmaLoadEvent;
- delete dmaMapLoadEvent;
- 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;
+ int end = fnEvents.size();
+ for (int i = 0; i < end; ++i) {
+ delete fnEvents[i];
+ }
+ fnEvents.clear();
}
- //INSTRUMENTATION CODEGEN END
-#endif //FS_MEASURE
}
int
@@ -629,19 +286,16 @@ Tru64System::findCaller(std::string callee, std::string caller) const
void
Tru64System::dumpState(ExecContext *xc) const
{
-#ifndef SW_DEBUG
- return;
-#endif
if (xc->swCtx) {
stack<fnCall *> copy(xc->swCtx->callStack);
if (copy.empty())
return;
- cprintf("xc->swCtx:\n");
+ DPRINTF(TCPIP, "xc->swCtx:\n");
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() ) {
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> pal_code;
Param<string> boot_osflags;
+ VectorParam<string> binned_fns;
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(pal_code, "file that contains palcode"),
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)
@@ -679,7 +334,8 @@ CREATE_SIM_OBJECT(Tru64System)
{
Tru64System *sys = new Tru64System(getInstanceName(), init_param, mem_ctl,
physmem, kernel_code, console_code,
- pal_code, boot_osflags, bin);
+ pal_code, boot_osflags, bin,
+ binned_fns);
return sys;
}
diff --git a/kern/tru64/tru64_system.hh b/kern/tru64/tru64_system.hh
index bedf1f383..34569664d 100644
--- a/kern/tru64/tru64_system.hh
+++ b/kern/tru64/tru64_system.hh
@@ -57,42 +57,6 @@ class Tru64System : public System
SymbolTable *kernelSymtab;
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 *consolePanicEvent;
BadAddrEvent *badaddrEvent;
@@ -102,41 +66,8 @@ class Tru64System : public System
DebugPrintfEvent *debugPrintfEvent;
DebugPrintfEvent *debugPrintfrEvent;
DumpMbufEvent *dumpMbufEvent;
-#ifdef FS_MEASURE
- //INSTRUMENTATION CODEGEN BEGIN TWO
- 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
+
+ std::vector<FnEvent *> fnEvents;
private:
@@ -144,6 +75,7 @@ class Tru64System : public System
Addr kernelEnd;
Addr kernelEntry;
bool bin;
+ std::vector<string> binned_fns;
public:
std::vector<RemoteGDB *> remoteGDB;
@@ -158,7 +90,8 @@ class Tru64System : public System
const std::string &console_path,
const std::string &palcode,
const std::string &boot_osflags,
- const bool _bin);
+ const bool _bin,
+ const std::vector<string> &binned_fns);
~Tru64System();
int registerExecContext(ExecContext *xc);
@@ -173,7 +106,7 @@ class Tru64System : public System
static void DumpMbuf(AlphaArguments args);
- // Lisa's fs measure stuff
+ // Lisa's binning stuff
private:
std::multimap<const std::string, std::string> callerMap;
void populateMap(std::string caller, std::string callee);
@@ -181,6 +114,7 @@ class Tru64System : public System
public:
bool findCaller(std::string callee, std::string caller) const;
void dumpState(ExecContext *xc) const;
+ //
};
#endif // __TRU64_SYSTEM_HH__
diff --git a/sim/system.cc b/sim/system.cc
index db93250ee..40c841ed5 100644
--- a/sim/system.cc
+++ b/sim/system.cc
@@ -50,13 +50,12 @@ System::System(const std::string _name,
{
// add self to global system list
systemList.push_back(this);
-#ifdef FS_MEASURE
if (bin == true) {
- nonPath = new Statistics::MainBin("non TCPIP path stats");
- nonPath->activate();
+ Kernel = new Statistics::MainBin("non TCPIP Kernel stats");
+ Kernel->activate();
+ User = new Statistics::MainBin("User stats");
} else
- nonPath = NULL;
-#endif
+ Kernel = NULL;
}
@@ -104,14 +103,13 @@ printSystems()
System::printSystems();
}
-#ifdef FS_MEASURE
Statistics::MainBin *
System::getBin(const std::string &name)
{
std::map<const std::string, Statistics::MainBin *>::const_iterator i;
i = fnBins.find(name);
if (i == fnBins.end())
- panic("trying to getBin that is not on system map!");
+ panic("trying to getBin %s that is not on system map!", name);
return (*i).second;
}
@@ -127,7 +125,65 @@ System::findContext(Addr pcb)
} else
return NULL;
}
-#endif //FS_MEASURE
+
+void
+System::serialize(std::ostream &os)
+{
+ if (bin == true) {
+ map<const Addr, SWContext *>::const_iterator iter, end;
+ iter = swCtxMap.begin();
+ end = swCtxMap.end();
+
+ int numCtxs = swCtxMap.size();
+ SERIALIZE_SCALAR(numCtxs);
+ SWContext *ctx;
+ for (int i = 0; iter != end; ++i, ++iter) {
+ paramOut(os, csprintf("Addr[%d]",i), (*iter).first);
+ ctx = (*iter).second;
+ paramOut(os, csprintf("calls[%d]",i), ctx->calls);
+
+ stack<fnCall *> *stack = &(ctx->callStack);
+ fnCall *top;
+ int size = stack->size();
+ paramOut(os, csprintf("stacksize[%d]",i), size);
+ for (int j=0; j<size; ++j) {
+ top = stack->top();
+ paramOut(os, csprintf("ctx[%d].stackpos[%d]",i,j), top->name);
+ }
+ }
+ }
+}
+
+void
+System::unserialize(Checkpoint *cp, const std::string &section)
+{
+ if (bin == true) {
+ int numCtxs;
+ UNSERIALIZE_SCALAR(numCtxs);
+
+ SWContext *ctxs = new SWContext[numCtxs];
+ Addr addr;
+ int size;
+ for(int i = 0; i < numCtxs; ++i) {
+ paramIn(cp, section, csprintf("Addr[%d]",i), addr);
+ paramIn(cp, section, csprintf("calls[%d]",i), ctxs[i].calls);
+
+ paramIn(cp, section, csprintf("stacksize[%d]",i), size);
+ fnCall *call = new fnCall[size];
+ for (int j = 0; j < size; ++j) {
+ paramIn(cp, section, csprintf("ctx[%d].stackpos[%d]",i,j),
+ call[j].name);
+ call[j].myBin = getBin(call[j].name);
+ }
+
+ for (int j=size-1; j>=0; --j) {
+ ctxs[i].callStack.push(&(call[j]));
+ }
+
+ addContext(addr, &(ctxs[i]));
+ }
+ }
+}
DEFINE_SIM_OBJECT_CLASS_NAME("System", System)
diff --git a/sim/system.hh b/sim/system.hh
index 2e0cb3dbf..3d6d3fc39 100644
--- a/sim/system.hh
+++ b/sim/system.hh
@@ -54,7 +54,7 @@ class System : public SimObject
public:
Statistics::Scalar<Counter> fnCalls;
- Statistics::MainBin *nonPath;
+ Statistics::MainBin *Kernel;
Statistics::MainBin * getBin(const std::string &name);
virtual bool findCaller(std::string, std::string) const = 0;
@@ -70,6 +70,10 @@ class System : public SimObject
virtual void dumpState(ExecContext *xc) const = 0;
+ virtual void serialize(std::ostream &os);
+ virtual void unserialize(Checkpoint *cp, const std::string &section);
+ //
+
public:
const uint64_t init_param;
MemoryController *memCtrl;