199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtUse lldb Python API to disassemble raw machine code bytes 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprechtfrom __future__ import print_function 699451b44SJordan Rupprecht 799451b44SJordan Rupprechtfrom io import StringIO 899451b44SJordan Rupprechtimport sys 999451b44SJordan Rupprecht 1099451b44SJordan Rupprechtimport lldb 1199451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 1299451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 1399451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1499451b44SJordan Rupprecht 1599451b44SJordan Rupprecht 1699451b44SJordan Rupprechtclass Disassemble_VST1_64(TestBase): 1799451b44SJordan Rupprecht 1899451b44SJordan Rupprecht @no_debug_info_test 1999451b44SJordan Rupprecht @skipIfLLVMTargetMissing("ARM") 2099451b44SJordan Rupprecht def test_disassemble_invalid_vst_1_64_raw_data(self): 2199451b44SJordan Rupprecht """Test disassembling invalid vst1.64 raw bytes with the API.""" 2299451b44SJordan Rupprecht # Create a target from the debugger. 2399451b44SJordan Rupprecht target = self.dbg.CreateTargetWithFileAndTargetTriple("", "thumbv7-apple-macosx") 2499451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 2599451b44SJordan Rupprecht 2699451b44SJordan Rupprecht raw_bytes = bytearray([0xf0, 0xb5, 0x03, 0xaf, 2799451b44SJordan Rupprecht 0x2d, 0xe9, 0x00, 0x0d, 2899451b44SJordan Rupprecht 0xad, 0xf1, 0x40, 0x04, 2999451b44SJordan Rupprecht 0x24, 0xf0, 0x0f, 0x04, 3099451b44SJordan Rupprecht 0xa5, 0x46]) 3199451b44SJordan Rupprecht 3299451b44SJordan Rupprecht assembly = """ 3399451b44SJordan Rupprecht push {r4, r5, r6, r7, lr} 3499451b44SJordan Rupprecht add r7, sp, #0xc 3599451b44SJordan Rupprecht push.w {r8, r10, r11} 3699451b44SJordan Rupprecht sub.w r4, sp, #0x40 3799451b44SJordan Rupprecht bic r4, r4, #0xf 3899451b44SJordan Rupprecht mov sp, r4 3999451b44SJordan Rupprecht """ 4099451b44SJordan Rupprecht def split(s): 4199451b44SJordan Rupprecht return [x.strip() for x in s.strip().splitlines()] 4299451b44SJordan Rupprecht 4399451b44SJordan Rupprecht insts = target.GetInstructions(lldb.SBAddress(), raw_bytes) 4499451b44SJordan Rupprecht 4599451b44SJordan Rupprecht if self.TraceOn(): 4699451b44SJordan Rupprecht print() 4799451b44SJordan Rupprecht for i in insts: 4899451b44SJordan Rupprecht print("Disassembled %s" % str(i)) 4999451b44SJordan Rupprecht 5099451b44SJordan Rupprecht sio = StringIO() 5199451b44SJordan Rupprecht insts.Print(sio) 5299451b44SJordan Rupprecht self.assertEqual(split(assembly), split(sio.getvalue())) 5399451b44SJordan Rupprecht 5499451b44SJordan Rupprecht self.assertEqual(insts.GetSize(), len(split(assembly))) 5599451b44SJordan Rupprecht 5699451b44SJordan Rupprecht for i,asm in enumerate(split(assembly)): 5799451b44SJordan Rupprecht inst = insts.GetInstructionAtIndex(i) 5899451b44SJordan Rupprecht sio = StringIO() 5999451b44SJordan Rupprecht inst.Print(sio) 6099451b44SJordan Rupprecht self.assertEqual(asm, sio.getvalue().strip()) 6199451b44SJordan Rupprecht 6299451b44SJordan Rupprecht raw_bytes = bytearray([0x04, 0xf9, 0xed, 0x82]) 6399451b44SJordan Rupprecht 6499451b44SJordan Rupprecht insts = target.GetInstructions(lldb.SBAddress(), raw_bytes) 6599451b44SJordan Rupprecht 6699451b44SJordan Rupprecht inst = insts.GetInstructionAtIndex(0) 6799451b44SJordan Rupprecht 6899451b44SJordan Rupprecht if self.TraceOn(): 6999451b44SJordan Rupprecht print() 7099451b44SJordan Rupprecht print("Raw bytes: ", [hex(x) for x in raw_bytes]) 7199451b44SJordan Rupprecht print("Disassembled%s" % str(inst)) 7299451b44SJordan Rupprecht 73*619e2e09SDave Lee self.assertEqual(inst.GetMnemonic(target), "vst1.64") 74