mem: Add stack distance statistics to the CommMonitor
This patch adds the stack distance calculator to the CommMonitor. The stats are disabled by default.
This commit is contained in:
parent
888975b29d
commit
7a25b1a0e0
3 changed files with 21 additions and 4 deletions
|
@ -110,3 +110,6 @@ class CommMonitor(MemObject):
|
|||
read_addr_mask = Param.Addr(MaxAddr, "Address mask for read address")
|
||||
write_addr_mask = Param.Addr(MaxAddr, "Address mask for write address")
|
||||
disable_addr_dists = Param.Bool(True, "Disable address distributions")
|
||||
|
||||
# optional stack distance calculator
|
||||
stack_dist_calc = Param.StackDistCalc(NULL, "Stack distance calculator")
|
||||
|
|
|
@ -55,6 +55,7 @@ CommMonitor::CommMonitor(Params* params)
|
|||
readAddrMask(params->read_addr_mask),
|
||||
writeAddrMask(params->write_addr_mask),
|
||||
stats(params),
|
||||
stackDistCalc(params->stack_dist_calc),
|
||||
traceStream(NULL),
|
||||
system(params->system)
|
||||
{
|
||||
|
@ -137,6 +138,7 @@ CommMonitor::init()
|
|||
if (!system->isTimingMode())
|
||||
warn("%s: Not in timing mode. No trace will be recorded.", name());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
BaseMasterPort&
|
||||
|
@ -174,6 +176,10 @@ CommMonitor::recvFunctionalSnoop(PacketPtr pkt)
|
|||
Tick
|
||||
CommMonitor::recvAtomic(PacketPtr pkt)
|
||||
{
|
||||
// allow stack distance calculations for atomic if enabled
|
||||
if (stackDistCalc)
|
||||
stackDistCalc->update(pkt->cmd, pkt->getAddr());
|
||||
|
||||
return masterPort.sendAtomic(pkt);
|
||||
}
|
||||
|
||||
|
@ -193,7 +199,8 @@ CommMonitor::recvTimingReq(PacketPtr pkt)
|
|||
// or even deleted when sendTiming() is called.
|
||||
bool is_read = pkt->isRead();
|
||||
bool is_write = pkt->isWrite();
|
||||
int cmd = pkt->cmdToIndex();
|
||||
MemCmd cmd = pkt->cmd;
|
||||
int cmd_idx = pkt->cmdToIndex();
|
||||
Request::FlagsType req_flags = pkt->req->getFlags();
|
||||
unsigned size = pkt->getSize();
|
||||
Addr addr = pkt->getAddr();
|
||||
|
@ -216,13 +223,18 @@ CommMonitor::recvTimingReq(PacketPtr pkt)
|
|||
delete pkt->popSenderState();
|
||||
}
|
||||
|
||||
// If successful and we are calculating stack distances, update
|
||||
// the calculator
|
||||
if (successful && stackDistCalc)
|
||||
stackDistCalc->update(cmd, addr);
|
||||
|
||||
if (successful && traceStream != NULL) {
|
||||
// Create a protobuf message representing the
|
||||
// packet. Currently we do not preserve the flags in the
|
||||
// trace.
|
||||
ProtoMessage::Packet pkt_msg;
|
||||
pkt_msg.set_tick(curTick());
|
||||
pkt_msg.set_cmd(cmd);
|
||||
pkt_msg.set_cmd(cmd_idx);
|
||||
pkt_msg.set_flags(req_flags);
|
||||
pkt_msg.set_addr(addr);
|
||||
pkt_msg.set_size(size);
|
||||
|
|
|
@ -44,6 +44,7 @@
|
|||
#include "base/statistics.hh"
|
||||
#include "base/time.hh"
|
||||
#include "mem/mem_object.hh"
|
||||
#include "mem/stack_dist_calc.hh"
|
||||
#include "params/CommMonitor.hh"
|
||||
#include "proto/protoio.hh"
|
||||
#include "sim/system.hh"
|
||||
|
@ -268,8 +269,6 @@ class CommMonitor : public MemObject
|
|||
|
||||
void recvRangeChange();
|
||||
|
||||
void periodicTraceDump();
|
||||
|
||||
/** Stats declarations, all in a struct for convenience. */
|
||||
struct MonitorStats
|
||||
{
|
||||
|
@ -417,6 +416,9 @@ class CommMonitor : public MemObject
|
|||
/** Instantiate stats */
|
||||
MonitorStats stats;
|
||||
|
||||
/** Optional stack distance calculator */
|
||||
StackDistCalc* stackDistCalc;
|
||||
|
||||
/** Output stream for a potential trace. */
|
||||
ProtoOutputStream* traceStream;
|
||||
|
||||
|
|
Loading…
Reference in a new issue