summaryrefslogtreecommitdiff
path: root/src/mem/comm_monitor.cc
diff options
context:
space:
mode:
authorAndreas Hansson <andreas.hansson@arm.com>2013-01-07 13:05:37 -0500
committerAndreas Hansson <andreas.hansson@arm.com>2013-01-07 13:05:37 -0500
commitf456c7983ded455b006d25a9c5e17401f6c22dca (patch)
tree622f60618aa3158e8f4d757e3dcc3536a5bb3057 /src/mem/comm_monitor.cc
parent11ab30fa5a4f56e4f7ea3b5b51e529bc246d1d35 (diff)
downloadgem5-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.cc48
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");