decode_packet_trace.py revision 10065
19617Sandreas.hansson@arm.com#!/usr/bin/env python 29617Sandreas.hansson@arm.com 310065Sandreas.hansson@arm.com# Copyright (c) 2013-2014 ARM Limited 49617Sandreas.hansson@arm.com# All rights reserved 59617Sandreas.hansson@arm.com# 69617Sandreas.hansson@arm.com# The license below extends only to copyright in the software and shall 79617Sandreas.hansson@arm.com# not be construed as granting a license to any other intellectual 89617Sandreas.hansson@arm.com# property including but not limited to intellectual property relating 99617Sandreas.hansson@arm.com# to a hardware implementation of the functionality of the software 109617Sandreas.hansson@arm.com# licensed hereunder. You may use the software subject to the license 119617Sandreas.hansson@arm.com# terms below provided that you ensure that this notice is replicated 129617Sandreas.hansson@arm.com# unmodified and in its entirety in all distributions of the software, 139617Sandreas.hansson@arm.com# modified or unmodified, in source code or in binary form. 149617Sandreas.hansson@arm.com# 159617Sandreas.hansson@arm.com# Redistribution and use in source and binary forms, with or without 169617Sandreas.hansson@arm.com# modification, are permitted provided that the following conditions are 179617Sandreas.hansson@arm.com# met: redistributions of source code must retain the above copyright 189617Sandreas.hansson@arm.com# notice, this list of conditions and the following disclaimer; 199617Sandreas.hansson@arm.com# redistributions in binary form must reproduce the above copyright 209617Sandreas.hansson@arm.com# notice, this list of conditions and the following disclaimer in the 219617Sandreas.hansson@arm.com# documentation and/or other materials provided with the distribution; 229617Sandreas.hansson@arm.com# neither the name of the copyright holders nor the names of its 239617Sandreas.hansson@arm.com# contributors may be used to endorse or promote products derived from 249617Sandreas.hansson@arm.com# this software without specific prior written permission. 259617Sandreas.hansson@arm.com# 269617Sandreas.hansson@arm.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 279617Sandreas.hansson@arm.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 289617Sandreas.hansson@arm.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 299617Sandreas.hansson@arm.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 309617Sandreas.hansson@arm.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 319617Sandreas.hansson@arm.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 329617Sandreas.hansson@arm.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 339617Sandreas.hansson@arm.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 349617Sandreas.hansson@arm.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 359617Sandreas.hansson@arm.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 369617Sandreas.hansson@arm.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 379617Sandreas.hansson@arm.com# 389617Sandreas.hansson@arm.com# Copyright 2008 Google Inc. All rights reserved. 399617Sandreas.hansson@arm.com# http://code.google.com/p/protobuf/ 409617Sandreas.hansson@arm.com# 419617Sandreas.hansson@arm.com# Redistribution and use in source and binary forms, with or without 429617Sandreas.hansson@arm.com# modification, are permitted provided that the following conditions are 439617Sandreas.hansson@arm.com# met: 449617Sandreas.hansson@arm.com# 459617Sandreas.hansson@arm.com# * Redistributions of source code must retain the above copyright 469617Sandreas.hansson@arm.com# notice, this list of conditions and the following disclaimer. 479617Sandreas.hansson@arm.com# * Redistributions in binary form must reproduce the above 489617Sandreas.hansson@arm.com# copyright notice, this list of conditions and the following disclaimer 499617Sandreas.hansson@arm.com# in the documentation and/or other materials provided with the 509617Sandreas.hansson@arm.com# distribution. 519617Sandreas.hansson@arm.com# * Neither the name of Google Inc. nor the names of its 529617Sandreas.hansson@arm.com# contributors may be used to endorse or promote products derived from 539617Sandreas.hansson@arm.com# this software without specific prior written permission. 549617Sandreas.hansson@arm.com# 559617Sandreas.hansson@arm.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 569617Sandreas.hansson@arm.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 579617Sandreas.hansson@arm.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 589617Sandreas.hansson@arm.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 599617Sandreas.hansson@arm.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 609617Sandreas.hansson@arm.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 619617Sandreas.hansson@arm.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 629617Sandreas.hansson@arm.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 639617Sandreas.hansson@arm.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 649617Sandreas.hansson@arm.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 659617Sandreas.hansson@arm.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 669617Sandreas.hansson@arm.com# 679617Sandreas.hansson@arm.com# Authors: Andreas Hansson 689617Sandreas.hansson@arm.com# 699617Sandreas.hansson@arm.com 709617Sandreas.hansson@arm.com# This script is used to dump protobuf packet traces to ASCII 719617Sandreas.hansson@arm.com# format. It assumes that protoc has been executed and already 729617Sandreas.hansson@arm.com# generated the Python package for the packet messages. This can 739617Sandreas.hansson@arm.com# be done manually using: 749617Sandreas.hansson@arm.com# protoc --python_out=. --proto_path=src/proto src/proto/packet.proto 759617Sandreas.hansson@arm.com# 769617Sandreas.hansson@arm.com# The ASCII trace format uses one line per request on the format cmd, 779617Sandreas.hansson@arm.com# addr, size, tick,flags. For example: 789617Sandreas.hansson@arm.com# r,128,64,4000,0 799617Sandreas.hansson@arm.com# w,232123,64,500000,0 809617Sandreas.hansson@arm.com 819617Sandreas.hansson@arm.comimport struct 829617Sandreas.hansson@arm.comimport sys 839706Sandreas.hansson@arm.com 849706Sandreas.hansson@arm.com# Import the packet proto definitions. If they are not found, attempt 859706Sandreas.hansson@arm.com# to generate them automatically. This assumes that the script is 869706Sandreas.hansson@arm.com# executed from the gem5 root. 879706Sandreas.hansson@arm.comtry: 889706Sandreas.hansson@arm.com import packet_pb2 899706Sandreas.hansson@arm.comexcept: 909706Sandreas.hansson@arm.com print "Did not find packet proto definitions, attempting to generate" 919706Sandreas.hansson@arm.com from subprocess import call 929706Sandreas.hansson@arm.com error = call(['protoc', '--python_out=util', '--proto_path=src/proto', 939706Sandreas.hansson@arm.com 'src/proto/packet.proto']) 949706Sandreas.hansson@arm.com if not error: 9510065Sandreas.hansson@arm.com print "Generated packet proto definitions" 9610065Sandreas.hansson@arm.com 9710065Sandreas.hansson@arm.com try: 9810065Sandreas.hansson@arm.com import google.protobuf 9910065Sandreas.hansson@arm.com except: 10010065Sandreas.hansson@arm.com print "Please install Python protobuf module" 10110065Sandreas.hansson@arm.com exit(-1) 10210065Sandreas.hansson@arm.com 1039706Sandreas.hansson@arm.com import packet_pb2 1049706Sandreas.hansson@arm.com else: 1059706Sandreas.hansson@arm.com print "Failed to import packet proto definitions" 1069706Sandreas.hansson@arm.com exit(-1) 1079617Sandreas.hansson@arm.com 1089617Sandreas.hansson@arm.comdef DecodeVarint(in_file): 1099617Sandreas.hansson@arm.com """ 1109617Sandreas.hansson@arm.com The decoding of the Varint32 is copied from 1119617Sandreas.hansson@arm.com google.protobuf.internal.decoder and is only repeated here to 1129617Sandreas.hansson@arm.com avoid depending on the internal functions in the library. If the 1139617Sandreas.hansson@arm.com end of file is reached, return (0, 0). 1149617Sandreas.hansson@arm.com """ 1159617Sandreas.hansson@arm.com result = 0 1169617Sandreas.hansson@arm.com shift = 0 1179617Sandreas.hansson@arm.com pos = 0 1189617Sandreas.hansson@arm.com # Use a 32-bit mask 1199617Sandreas.hansson@arm.com mask = 0xffffffff 1209617Sandreas.hansson@arm.com while 1: 1219617Sandreas.hansson@arm.com c = in_file.read(1) 1229617Sandreas.hansson@arm.com if len(c) == 0: 1239617Sandreas.hansson@arm.com return (0, 0) 1249617Sandreas.hansson@arm.com b = struct.unpack('<B', c)[0] 1259617Sandreas.hansson@arm.com result |= ((b & 0x7f) << shift) 1269617Sandreas.hansson@arm.com pos += 1 1279617Sandreas.hansson@arm.com if not (b & 0x80): 1289617Sandreas.hansson@arm.com if result > 0x7fffffffffffffff: 1299617Sandreas.hansson@arm.com result -= (1 << 64) 1309617Sandreas.hansson@arm.com result |= ~mask 1319617Sandreas.hansson@arm.com else: 1329617Sandreas.hansson@arm.com result &= mask 1339617Sandreas.hansson@arm.com return (result, pos) 1349617Sandreas.hansson@arm.com shift += 7 1359617Sandreas.hansson@arm.com if shift >= 64: 1369617Sandreas.hansson@arm.com raise IOError('Too many bytes when decoding varint.') 1379617Sandreas.hansson@arm.com 1389617Sandreas.hansson@arm.comdef decodeMessage(in_file, message): 1399617Sandreas.hansson@arm.com """ 1409617Sandreas.hansson@arm.com Attempt to read a message from the file and decode it. Return 1419617Sandreas.hansson@arm.com False if no message could be read. 1429617Sandreas.hansson@arm.com """ 1439617Sandreas.hansson@arm.com try: 1449617Sandreas.hansson@arm.com size, pos = DecodeVarint(in_file) 1459617Sandreas.hansson@arm.com if size == 0: 1469617Sandreas.hansson@arm.com return False 1479617Sandreas.hansson@arm.com buf = in_file.read(size) 1489617Sandreas.hansson@arm.com message.ParseFromString(buf) 1499617Sandreas.hansson@arm.com return True 1509617Sandreas.hansson@arm.com except IOError: 1519617Sandreas.hansson@arm.com return False 1529617Sandreas.hansson@arm.com 1539617Sandreas.hansson@arm.comdef main(): 1549617Sandreas.hansson@arm.com if len(sys.argv) != 3: 1559617Sandreas.hansson@arm.com print "Usage: ", sys.argv[0], " <protobuf input> <ASCII output>" 1569617Sandreas.hansson@arm.com exit(-1) 1579617Sandreas.hansson@arm.com 1589617Sandreas.hansson@arm.com try: 1599617Sandreas.hansson@arm.com proto_in = open(sys.argv[1], 'rb') 1609617Sandreas.hansson@arm.com except IOError: 1619617Sandreas.hansson@arm.com print "Failed to open ", sys.argv[1], " for reading" 1629617Sandreas.hansson@arm.com exit(-1) 1639617Sandreas.hansson@arm.com 1649617Sandreas.hansson@arm.com try: 1659617Sandreas.hansson@arm.com ascii_out = open(sys.argv[2], 'w') 1669617Sandreas.hansson@arm.com except IOError: 1679617Sandreas.hansson@arm.com print "Failed to open ", sys.argv[2], " for writing" 1689617Sandreas.hansson@arm.com exit(-1) 1699617Sandreas.hansson@arm.com 1709617Sandreas.hansson@arm.com # Read the magic number in 4-byte Little Endian 1719617Sandreas.hansson@arm.com magic_number = proto_in.read(4) 1729617Sandreas.hansson@arm.com 1739617Sandreas.hansson@arm.com if magic_number != "gem5": 1749617Sandreas.hansson@arm.com print "Unrecognized file" 1759617Sandreas.hansson@arm.com exit(-1) 1769617Sandreas.hansson@arm.com 1779617Sandreas.hansson@arm.com print "Parsing packet header" 1789617Sandreas.hansson@arm.com 1799617Sandreas.hansson@arm.com # Add the packet header 1809617Sandreas.hansson@arm.com header = packet_pb2.PacketHeader() 1819617Sandreas.hansson@arm.com decodeMessage(proto_in, header) 1829617Sandreas.hansson@arm.com 1839617Sandreas.hansson@arm.com print "Object id:", header.obj_id 1849617Sandreas.hansson@arm.com print "Tick frequency:", header.tick_freq 1859617Sandreas.hansson@arm.com 1869617Sandreas.hansson@arm.com print "Parsing packets" 1879617Sandreas.hansson@arm.com 1889617Sandreas.hansson@arm.com num_packets = 0 1899617Sandreas.hansson@arm.com ignored_flags = False 1909617Sandreas.hansson@arm.com packet = packet_pb2.Packet() 1919617Sandreas.hansson@arm.com 1929617Sandreas.hansson@arm.com # Decode the packet messages until we hit the end of the file 1939617Sandreas.hansson@arm.com while decodeMessage(proto_in, packet): 1949617Sandreas.hansson@arm.com num_packets += 1 1959617Sandreas.hansson@arm.com # ReadReq is 1 and WriteReq is 4 in src/mem/packet.hh Command enum 1969617Sandreas.hansson@arm.com cmd = 'r' if packet.cmd == 1 else ('w' if packet.cmd == 4 else 'u') 1979617Sandreas.hansson@arm.com if packet.HasField('flags'): 1989617Sandreas.hansson@arm.com # Currently not printing flags 1999617Sandreas.hansson@arm.com ignored_flags = True 2009617Sandreas.hansson@arm.com ascii_out.write('%s,%s,%s,%s\n' % (cmd, packet.addr, packet.size, 2019617Sandreas.hansson@arm.com packet.tick)) 2029617Sandreas.hansson@arm.com 2039617Sandreas.hansson@arm.com print "Parsed packets:", num_packets 2049617Sandreas.hansson@arm.com if ignored_flags: 2059617Sandreas.hansson@arm.com print "Encountered packet flags that were ignored" 2069617Sandreas.hansson@arm.com 2079617Sandreas.hansson@arm.com # We're done 2089617Sandreas.hansson@arm.com ascii_out.close() 2099617Sandreas.hansson@arm.com proto_in.close() 2109617Sandreas.hansson@arm.com 2119617Sandreas.hansson@arm.comif __name__ == "__main__": 2129617Sandreas.hansson@arm.com main() 213