diff --git a/.gitignore b/.gitignore index 3990c3823..f0afc3a98 100644 --- a/.gitignore +++ b/.gitignore @@ -42,6 +42,8 @@ tests/linux-testgen/buildroot-image-output tests/linux-testgen/buildroot-config-src/main.config.old tests/linux-testgen/buildroot-config-src/linux.config.old tests/linux-testgen/buildroot-config-src/busybox.config.old +linux/testvector-generation/boottrace.S +linux/testvector-generation/boottrace_disasm.log sim/slack-notifier/slack-webhook-url.txt sim/logs fpga/generator/IP diff --git a/linux/bootmem.txt b/linux/bootmem.txt index 047cf5529..7cf7d8453 100644 --- a/linux/bootmem.txt +++ b/linux/bootmem.txt @@ -5,7 +5,7 @@ 00001010: 0182b283 ld t0, 24(t0) # t0 = 80000000 - start of firmware 00001014: 00028067 jr t0 # jump to firmware 00001018: 0000000080000000 # firmware start address -00001020: 0000000087000000 # flattened device tree load address +00001020: 000000008fe00000 # flattened device tree load address 00001028: 000000004942534f # a2 points to this 8 dword data structure 00001030: 0000000000000002 00001038: 0000000080200000 diff --git a/linux/testvector-generation/disassembleBootTrace.py b/linux/testvector-generation/disassembleBootTrace.py new file mode 100755 index 000000000..12e2202cb --- /dev/null +++ b/linux/testvector-generation/disassembleBootTrace.py @@ -0,0 +1,74 @@ +#!/usr/bin/python3 +# +# disassembleBootTrace.py +# David_Harris@hmc.edu 22 November 2023 +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +# +# Reads boottrace.log and disassembles the machine code +# + +import csv +import os +import re + +# read a file from sim/logs/boottrace.log and extract the second comma-separated field containing the instruction +print("Reading boottrace.log") +trace = [] +count = 0 +with open('../../sim/logs/boottrace.log') as f: + reader = csv.reader(f, delimiter=',') + for row in reader: + trace.append(row) + count = count + 1 + if count > 50000000: + break +f.close() + +print("Disassembling boottrace.log instructions") +# Write an assembly language file with the machine code +with (open('boottrace.S', 'w')) as f: + f.write('main:\n') + for row in trace: + instr = row[1] + # scrape off leading white space from instr + instr = instr.lstrip() + # check if last character indicates an compressed or uncompressed instruction + lastNibble = instr[-1] + if (lastNibble == '3' or lastNibble == '7' or lastNibble == 'b' or lastNibble == 'f'): + # uncompressed + f.write('.word 0x' + instr + '\n') + else: + # compressed + instr = instr[-4:] + f.write('.hword 0x' + instr + '\n') +f.close() + +# Then assemble and disassemble the file +os.system('riscv64-unknown-elf-gcc -march=rv64gqc_zba_zbb_zbc_zbs_zfh_zicboz_zicbop_zicbom -mabi=lp64d -c boottrace.S') +os.system('riscv64-unknown-elf-objdump -D boottrace.o > boottrace.objdump') + +# Patch disassembly back into boottrace +print("Inserting disassembly into trace") +dumpedLines = [] +with (open('boottrace.objdump', 'r')) as f: + lines = f.readlines() + f.close() +lines = lines[7:] # skip header +p = r'[^:]*:\s*(\S*)\s*(.*)' +for line in lines: + match = re.search(p, line) + if (match): + dump = [match.group(1), match.group(2)] + dumpedLines.append(dump) + +linenum = 0 +for i in range(len(trace)): + row = trace[i] + row.insert(2, dumpedLines[i][1]) + +# write trace back to csv file +print("Writing trace back to boottrace_disasm.log") +with (open('boottrace_disasm.log', 'w')) as f: + writer = csv.writer(f) + writer.writerows(trace) +f.close()