diff options
author | Andreas Hansson <andreas.hansson@arm.com> | 2013-01-07 13:05:37 -0500 |
---|---|---|
committer | Andreas Hansson <andreas.hansson@arm.com> | 2013-01-07 13:05:37 -0500 |
commit | f456c7983ded455b006d25a9c5e17401f6c22dca (patch) | |
tree | 622f60618aa3158e8f4d757e3dcc3536a5bb3057 /src/mem/comm_monitor.cc | |
parent | 11ab30fa5a4f56e4f7ea3b5b51e529bc246d1d35 (diff) | |
download | gem5-f456c7983ded455b006d25a9c5e17401f6c22dca.tar.xz |
mem: Add tracing support in the communication monitor
This patch adds packet tracing to the communication monitor using a
protobuf as the mechanism for creating the trace.
If no file is specified, then the tracing is disabled. If a file is
specified, then for every packet that is successfully sent, a protobuf
message is serialized to the file.
Diffstat (limited to 'src/mem/comm_monitor.cc')
-rw-r--r-- | src/mem/comm_monitor.cc | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/src/mem/comm_monitor.cc b/src/mem/comm_monitor.cc index 7e98f64f6..88e549cbb 100644 --- a/src/mem/comm_monitor.cc +++ b/src/mem/comm_monitor.cc @@ -38,9 +38,12 @@ * Andreas Hansson */ +#include "base/callback.hh" +#include "base/output.hh" #include "base/trace.hh" #include "debug/CommMonitor.hh" #include "mem/comm_monitor.hh" +#include "proto/packet.pb.h" #include "sim/stats.hh" CommMonitor::CommMonitor(Params* params) @@ -51,8 +54,31 @@ CommMonitor::CommMonitor(Params* params) samplePeriodTicks(params->sample_period), readAddrMask(params->read_addr_mask), writeAddrMask(params->write_addr_mask), - stats(params) + stats(params), + traceStream(NULL) { + // If we are using a trace file, then open the file, + if (params->trace_file != "") { + // If the trace file is not specified as an absolute path, + // append the current simulation output directory + std::string filename = simout.resolve(params->trace_file); + traceStream = new ProtoOutputStream(filename); + + // Create a protobuf message for the header and write it to + // the stream + Message::PacketHeader header_msg; + header_msg.set_obj_id(name()); + header_msg.set_tick_freq(SimClock::Frequency); + traceStream->write(header_msg); + + // Register a callback to compensate for the destructor not + // being called. The callback forces the stream to flush and + // closes the output file. + Callback* cb = new MakeCallback<CommMonitor, + &CommMonitor::closeStreams>(this); + registerExitCallback(cb); + } + // keep track of the sample period both in ticks and absolute time samplePeriod.setTick(params->sample_period); @@ -61,6 +87,13 @@ CommMonitor::CommMonitor(Params* params) name(), samplePeriodTicks, samplePeriod); } +void +CommMonitor::closeStreams() +{ + if (traceStream != NULL) + delete traceStream; +} + CommMonitor* CommMonitorParams::create() { @@ -154,6 +187,19 @@ CommMonitor::recvTimingReq(PacketPtr pkt) pkt->senderState = senderState; } + if (successful && traceStream != NULL) { + // Create a protobuf message representing the + // packet. Currently we do not preserve the flags in the + // trace. + Message::Packet pkt_msg; + pkt_msg.set_tick(curTick()); + pkt_msg.set_cmd(pkt->cmdToIndex()); + pkt_msg.set_addr(pkt->getAddr()); + pkt_msg.set_size(pkt->getSize()); + + traceStream->write(pkt_msg); + } + if (successful && isRead) { DPRINTF(CommMonitor, "Forwarded read request\n"); |