blob: d6832a38667b603e3c12629881ebc70e1f135a0e [file] [log] [blame]
#! /usr/bin/python
import os, sys, string
if sys.stdout.isatty():
OKBLUE = '\033[94m'
OKGREEN = '\033[92m'
WARNING = '\033[93m'
FAIL = '\033[91m'
ENDC = '\033[0m'
BOLD = "\033[1m"
else:
OKBLUE = ''
OKGREEN = ''
WARNING = ''
FAIL = ''
ENDC = ''
BOLD = ''
def hex_conv(s):
return int(s, 16)
def parse_objdump(objdump_cmd):
syms = {}
for line in os.popen(objdump_cmd):
fields = line.split()
if len(fields) == 6:
if fields[3] == fields[5]:
start = hex_conv(fields[0])
else:
symbol = fields[5].replace("class_", "")
symbol = symbol.replace("util_", "")
symbol = symbol.replace("tmu_", "")
symbol = symbol.replace("mailbox", "mbox")
syms[symbol] = (hex_conv(fields[0]), hex_conv(fields[4]))
for sym in syms.keys():
(addr, size) = syms[sym]
syms[sym] = (addr-start, size)
return syms
def one_way_compare(filename1, syms1, filename2, syms2):
list1 = syms1.keys()
list2 = syms2.keys()
err = 0
for sym in list1:
if sym not in list2:
print(WARNING + "ERROR: symbol " + sym + " present in " + filename1 + " but not in " +filename2 + ENDC)
err += 1
else:
(addr1, size1) = syms1[sym]
(addr2, size2) = syms2[sym]
if addr1 != addr2:
print(WARNING + "ERROR: symbol "+ sym + " at address " + str(addr1) + " in " + filename1 + ", at address " + str(addr2) + " in " + filename2 + ENDC)
syms2.pop(sym)
err += 1
if size1 != size2:
print(WARNING + "ERROR: symbol "+ sym + " has size " + str(size1) + " in " + filename1 + ", but size " + str(size2) + " in " + filename2 + ENDC)
syms2.pop(sym)
err += 1
return err
def compare_shared_mem(ctrl_filename, pe, filename):
print("Comparing memory for "+ pe + " shared memory...")
sym_ctrl = parse_objdump("objdump -j ." + pe + "_dmem_sh -t " + sys.argv[1])
sym_pfe = parse_objdump("objdump -j .dmem_sh -t "+ filename)
err1 = one_way_compare(ctrl_filename, sym_ctrl, filename, sym_pfe)
err2 = one_way_compare(filename, sym_pfe, ctrl_filename, sym_ctrl)
if (err1 + err2) != 0:
print(FAIL + BOLD + pe + " ERROR: " + ctrl_filename + " and " + filename + " don't match." + ENDC)
else:
print(OKGREEN + BOLD + pe + " OK." + ENDC)
print("")
return err1 + err2
# Main
if __name__=="__main__":
if len(sys.argv)<3:
print("Usage: " + sys.argv[0] + " <pfe.ko file> <class ELF file> <tmu ELF file> <util ELF file>")
sys.exit(1)
compare_list = []
compare_list.append(("class", sys.argv[2]))
compare_list.append(("tmu", sys.argv[3]))
compare_list.append(("util", sys.argv[4]))
ret = 0
for (pe, filename) in compare_list:
ret += compare_shared_mem(sys.argv[1], pe, filename)
exit(ret)