summaryrefslogtreecommitdiff
path: root/arch/arm64/test_disasm.py
diff options
context:
space:
mode:
authorRusty Wagner <rusty.wagner@gmail.com>2024-03-05 19:50:13 -0500
committerRusty Wagner <rusty.wagner@gmail.com>2024-03-05 20:34:34 -0500
commite093c21ed880ac3eb72119be15093ee04f8ce299 (patch)
tree9f720ebdc0ae415734b1199ed341668c69710a94 /arch/arm64/test_disasm.py
parent0609276712622908254065546102381466033141 (diff)
Move architecture modules into the API repo
Diffstat (limited to 'arch/arm64/test_disasm.py')
-rwxr-xr-xarch/arm64/test_disasm.py58
1 files changed, 58 insertions, 0 deletions
diff --git a/arch/arm64/test_disasm.py b/arch/arm64/test_disasm.py
new file mode 100755
index 00000000..77cf4b6c
--- /dev/null
+++ b/arch/arm64/test_disasm.py
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+
+# this tests disassembly through the binja API, ensuring binja <- arch <- disassembler
+#
+# that's an important distinction versus testing just the disassembler
+
+import re, struct, os, sys, ctypes
+
+import binaryninja
+print("binaryninja.__file__:", binaryninja.__file__)
+
+sys.path.append('./disassembler')
+import disasm_test
+
+
+arch = None
+def disassemble(addr, insnum):
+ global arch
+ if not arch:
+ arch = binaryninja.Architecture['aarch64']
+ data = struct.pack('<I', insnum)
+ (tokens, length) = arch.get_instruction_text(data, addr)
+ if not tokens or length==0:
+ return None
+ return disasm_test.normalize(''.join([x.text for x in tokens]))
+
+def main():
+ if sys.argv[1:]:
+ if sys.argv[1] in ['strain', 'strainer', 'stress', 'stresser']:
+ for insnum in range(0, 2**32):
+ result = disassemble(0, insnum)
+ if insnum & 0xFFFFFF == 0:
+ print('%08X: %s' % (insnum, result))
+ else:
+ insnum = int(sys.argv[1], 16)
+ print(disassemble(0, insnum))
+
+ else:
+ with open('./disassembler/test_cases.txt') as fp:
+ lines = fp.readlines()
+
+ for (i,line) in enumerate(lines):
+ if line.startswith('// '): continue
+ assert line[8] == ' '
+ insnum = int(line[0:8], 16)
+ actual = disassemble(disasm_test.ADDRESS_TEST, insnum)
+ expected = line[9:].rstrip()
+ print('0x%08X -%s- vs. -%s-' % (insnum, actual, expected))
+ if disasm_test.compare_disassembly(actual, expected):
+ if actual and disasm_test.excusable_difference(actual, expected):
+ continue
+ print('line %d/%d (%.2f%%)' % (i, len(lines), i/len(lines)*100))
+ sys.exit(-1)
+
+ print('PASS')
+
+if __name__ == '__main__':
+ main()