51 lines
1.9 KiB
Python
51 lines
1.9 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import sys, re, subprocess
|
|
|
|
trace_filename = sys.argv[1]
|
|
elf_filename = sys.argv[2]
|
|
|
|
insns = dict()
|
|
|
|
with subprocess.Popen(["riscv32-unknown-elf-objdump", "-d", elf_filename], stdout=subprocess.PIPE) as proc:
|
|
while True:
|
|
line = proc.stdout.readline().decode("ascii")
|
|
if line == '': break
|
|
match = re.match(r'^\s*([0-9a-f]+):\s+(\S+)\s*(.*)', line)
|
|
if match: insns[int(match.group(1), 16)] = (int(match.group(2), 16), match.group(3).replace("\t", " "))
|
|
|
|
with open(trace_filename, "r") as f:
|
|
pc = -1
|
|
last_irq = False
|
|
for line in f:
|
|
raw_data = int(line.replace("x", "0"), 16)
|
|
payload = raw_data & 0xffffffff
|
|
irq_active = (raw_data & 0x800000000) != 0
|
|
is_addr = (raw_data & 0x200000000) != 0
|
|
is_branch = (raw_data & 0x100000000) != 0
|
|
|
|
if irq_active and not last_irq:
|
|
pc = 0x10
|
|
|
|
if pc >= 0:
|
|
if pc in insns:
|
|
insn_opcode, insn_desc = insns[pc]
|
|
opcode_fmt = "%08x" if (insn_opcode & 3) == 3 else " %04x"
|
|
print(("%s %s%08x | %08x | " + opcode_fmt + " | %s") % ("IRQ" if irq_active else " ",
|
|
">" if is_branch else "@" if is_addr else "=", payload, pc, insn_opcode, insn_desc))
|
|
if not is_addr:
|
|
pc += 4 if (insn_opcode & 3) == 3 else 2
|
|
else:
|
|
print("%s %s%08x ** NO INFORMATION ON INSN AT %08x! **" % ("IRQ" if irq_active else " ",
|
|
">" if is_branch else "@" if is_addr else "=", payload, pc))
|
|
pc = -1
|
|
else:
|
|
print("%s %s%08x ** SKIPPING DATA UNTIL NEXT BRANCH **" % ("IRQ" if irq_active else " ",
|
|
">" if is_branch else "@" if is_addr else "=", payload))
|
|
|
|
if is_branch:
|
|
pc = payload
|
|
|
|
last_irq = irq_active
|
|
|