1/* 2 * Copyright (c) 2015 ARM Limited 3 * All rights reserved 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software 9 * licensed hereunder. You may use the software subject to the license 10 * terms below provided that you ensure that this notice is replicated 11 * unmodified and in its entirety in all distributions of the software, 12 * modified or unmodified, in source code or in binary form. 13 * 14 * Redistribution and use in source and binary forms, with or without 15 * modification, are permitted provided that the following conditions are 16 * met: redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer; 18 * redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution; 21 * neither the name of the copyright holders nor the names of its 22 * contributors may be used to endorse or promote products derived from 23 * this software without specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 36 * 37 * Authors: Andreas Hansson 38 * Andreas Sandberg 39 */ 40 41#include "mem/probes/mem_trace.hh" 42 43#include "base/callback.hh" 44#include "base/output.hh" 45#include "params/MemTraceProbe.hh" 46#include "proto/packet.pb.h" 47#include "sim/system.hh" 48 49MemTraceProbe::MemTraceProbe(MemTraceProbeParams *p) 50 : BaseMemProbe(p), 51 traceStream(nullptr), 52 system(p->system), 53 withPC(p->with_pc) 54{ 55 std::string filename; 56 if (p->trace_file != "") { 57 // If the trace file is not specified as an absolute path, 58 // append the current simulation output directory 59 filename = simout.resolve(p->trace_file); 60 61 const std::string suffix = ".gz"; 62 // If trace_compress has been set, check the suffix. Append 63 // accordingly. 64 if (p->trace_compress && 65 filename.compare(filename.size() - suffix.size(), suffix.size(), 66 suffix) != 0) 67 filename = filename + suffix; 68 } else { 69 // Generate a filename from the name of the SimObject. Append .trc 70 // and .gz if we want compression enabled. 71 filename = simout.resolve(name() + ".trc" + 72 (p->trace_compress ? ".gz" : "")); 73 } 74 75 traceStream = new ProtoOutputStream(filename); 76 77 // Register a callback to compensate for the destructor not 78 // being called. The callback forces the stream to flush and 79 // closes the output file. 80 registerExitCallback( 81 new MakeCallback<MemTraceProbe, &MemTraceProbe::closeStreams>(this)); 82} 83 84void 85MemTraceProbe::startup() 86{ 87 // Create a protobuf message for the header and write it to 88 // the stream 89 ProtoMessage::PacketHeader header_msg; 90 header_msg.set_obj_id(name()); 91 header_msg.set_tick_freq(SimClock::Frequency); 92 93 for (int i = 0; i < system->maxMasters(); i++) { 94 auto id_string = header_msg.add_id_strings(); 95 id_string->set_key(i); 96 id_string->set_value(system->getMasterName(i)); 97 } 98 99 traceStream->write(header_msg); 100} 101 102void 103MemTraceProbe::closeStreams() 104{ 105 if (traceStream != NULL) 106 delete traceStream; 107} 108 109void 110MemTraceProbe::handleRequest(const ProbePoints::PacketInfo &pkt_info) 111{ 112 ProtoMessage::Packet pkt_msg; 113 114 pkt_msg.set_tick(curTick()); 115 pkt_msg.set_cmd(pkt_info.cmd.toInt()); 116 pkt_msg.set_flags(pkt_info.flags); 117 pkt_msg.set_addr(pkt_info.addr); 118 pkt_msg.set_size(pkt_info.size); 119 if (withPC && pkt_info.pc != 0) 120 pkt_msg.set_pc(pkt_info.pc); 121 pkt_msg.set_pkt_id(pkt_info.master); 122 123 traceStream->write(pkt_msg); 124} 125 126 127MemTraceProbe * 128MemTraceProbeParams::create() 129{ 130 return new MemTraceProbe(this); 131} 132