diff --git a/src/mem/probes/MemTraceProbe.py b/src/mem/probes/MemTraceProbe.py index 971765eb4..c51ec9282 100644 --- a/src/mem/probes/MemTraceProbe.py +++ b/src/mem/probes/MemTraceProbe.py @@ -46,6 +46,9 @@ class MemTraceProbe(BaseMemProbe): # Boolean to compress the trace or not. trace_compress = Param.Bool(True, "Enable trace compression") + # For requests with a valid PC, include the PC in the trace + with_pc = Param.Bool(False, "Include PC info in the trace") + # packet trace output file, disabled by default trace_file = Param.String("", "Packet trace output file") diff --git a/src/mem/probes/mem_trace.cc b/src/mem/probes/mem_trace.cc index 121c6de48..97b97daae 100644 --- a/src/mem/probes/mem_trace.cc +++ b/src/mem/probes/mem_trace.cc @@ -47,7 +47,8 @@ MemTraceProbe::MemTraceProbe(MemTraceProbeParams *p) : BaseMemProbe(p), - traceStream(nullptr) + traceStream(nullptr), + withPC(p->with_pc) { std::string filename; if (p->trace_file != "") { @@ -102,6 +103,8 @@ MemTraceProbe::handleRequest(const ProbePoints::PacketInfo &pkt_info) pkt_msg.set_flags(pkt_info.flags); pkt_msg.set_addr(pkt_info.addr); pkt_msg.set_size(pkt_info.size); + if (withPC && pkt_info.pc != 0) + pkt_msg.set_pc(pkt_info.pc); traceStream->write(pkt_msg); } diff --git a/src/mem/probes/mem_trace.hh b/src/mem/probes/mem_trace.hh index d34235eef..158c5aacb 100644 --- a/src/mem/probes/mem_trace.hh +++ b/src/mem/probes/mem_trace.hh @@ -64,6 +64,11 @@ class MemTraceProbe : public BaseMemProbe /** Trace output stream */ ProtoOutputStream *traceStream; + + private: + + /** Include the Program Counter in the memory trace */ + const bool withPC; }; #endif //__MEM_PROBES_MEM_TRACE_HH__ diff --git a/src/sim/probe/mem.hh b/src/sim/probe/mem.hh index 2d4b9aeec..f17815bab 100644 --- a/src/sim/probe/mem.hh +++ b/src/sim/probe/mem.hh @@ -56,12 +56,14 @@ struct PacketInfo { Addr addr; uint32_t size; Request::FlagsType flags; + Addr pc; explicit PacketInfo(const PacketPtr& pkt) : cmd(pkt->cmd), addr(pkt->getAddr()), size(pkt->getSize()), - flags(pkt->req->getFlags()) { } + flags(pkt->req->getFlags()), + pc(pkt->req->hasPC() ? pkt->req->getPC() : 0) { } }; /** diff --git a/util/decode_packet_trace.py b/util/decode_packet_trace.py index e9105753d..97d344163 100755 --- a/util/decode_packet_trace.py +++ b/util/decode_packet_trace.py @@ -118,11 +118,15 @@ def main(): if packet.HasField('pkt_id'): ascii_out.write('%s,' % (packet.pkt_id)) if packet.HasField('flags'): - ascii_out.write('%s,%s,%s,%s,%s\n' % (cmd, packet.addr, packet.size, + ascii_out.write('%s,%s,%s,%s,%s' % (cmd, packet.addr, packet.size, packet.flags, packet.tick)) else: - ascii_out.write('%s,%s,%s,%s\n' % (cmd, packet.addr, packet.size, + ascii_out.write('%s,%s,%s,%s' % (cmd, packet.addr, packet.size, packet.tick)) + if packet.HasField('pc'): + ascii_out.write(',%s\n' % (packet.pc)) + else: + ascii_out.write('\n') print "Parsed packets:", num_packets