summaryrefslogtreecommitdiff
path: root/arch/armv7/thumb2_disasm/test.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/armv7/thumb2_disasm/test.py
parent0609276712622908254065546102381466033141 (diff)
Move architecture modules into the API repo
Diffstat (limited to 'arch/armv7/thumb2_disasm/test.py')
-rwxr-xr-xarch/armv7/thumb2_disasm/test.py53
1 files changed, 53 insertions, 0 deletions
diff --git a/arch/armv7/thumb2_disasm/test.py b/arch/armv7/thumb2_disasm/test.py
new file mode 100755
index 00000000..65e4bd22
--- /dev/null
+++ b/arch/armv7/thumb2_disasm/test.py
@@ -0,0 +1,53 @@
+#!/usr/bin/env python
+
+# (bytes, expected_disassembly, options)
+test_cases = (
+ (b'\x00\xbf', 'nop', {}),
+ (b'\xef\xf3\x09\x80', 'mrs r0, psp', {}),
+ (b'\x80\xf3\x09\x88', 'msr psp, r0', {}),
+ (b'\xef\xf3\x08\x80', 'mrs r0, msp', {}),
+ (b'\x80\xf3\x08\x88', 'msr msp, r0', {}),
+ (b'\xef\xf3\x00\x80', 'mrs r0, apsr', {}),
+ (b'\xef\xf3\x10\x80', 'mrs r0, primask', {}),
+ (b'\xef\xf3\x11\x80', 'mrs r0, basepri', {}),
+ (b'\xef\xf3\x13\x80', 'mrs r0, faultmask', {}),
+ (b'\xef\xf3\x14\x80', 'mrs r0, control', {}),
+ (b'\x80\xf3\x00\x88', 'msr apsr_nzcvq, r0', {}),
+ (b'\x80\xf3\x10\x88', 'msr primask, r0', {}),
+ (b'\x80\xf3\x11\x88', 'msr basepri, r0', {}),
+ (b'\x80\xf3\x13\x88', 'msr faultmask, r0', {}),
+ (b'\x80\xf3\x14\x88', 'msr control, r0', {}),
+)
+
+import sys, re
+import binaryninja
+
+arch = None
+def disassemble_binja(data, addr):
+ global arch
+ if not arch:
+ arch = binaryninja.Architecture['thumb2']
+ (tokens, length) = arch.get_instruction_text(data, addr)
+ if not tokens or length==0:
+ return 'disassembly failed'
+ strs = map(lambda x: x.text, tokens)
+ instxt = ''.join(strs)
+ instxt = re.sub(r'\s+', ' ', instxt)
+ return instxt
+
+if __name__ == '__main__':
+ for (test_i, (data, expected, options)) in enumerate(test_cases):
+ addr = options.get('addr', 0)
+ actual = disassemble_binja(data, addr)
+ if actual != expected:
+ print('MISMATCH AT TEST %d!' % test_i)
+ print('\t data: %s' % repr(data))
+ print('\t address: %08X' % addr)
+ print('\tinsvalue: 0x%08X' % insvalue)
+ print('\texpected: %s' % expected)
+ print('\t actual: %s' % actual)
+ sys.exit(-1)
+
+ print('success!')
+ sys.exit(0)
+