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 Rupprecht
899451b44SJordan Rupprechtimport re
999451b44SJordan Rupprechtimport lldb
1099451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
1199451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1299451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1399451b44SJordan Rupprecht
1499451b44SJordan Rupprecht
1599451b44SJordan Rupprechtclass DisassembleRawDataTestCase(TestBase):
1699451b44SJordan Rupprecht
1799451b44SJordan Rupprecht    @no_debug_info_test
1899451b44SJordan Rupprecht    @skipIfRemote
1999451b44SJordan Rupprecht    def test_disassemble_raw_data(self):
2099451b44SJordan Rupprecht        """Test disassembling raw bytes with the API."""
2199451b44SJordan Rupprecht        # Create a target from the debugger.
2299451b44SJordan Rupprecht        arch = self.getArchitecture()
2399451b44SJordan Rupprecht        if re.match("mips*el", arch):
2499451b44SJordan Rupprecht            target = self.dbg.CreateTargetWithFileAndTargetTriple("", "mipsel")
2599451b44SJordan Rupprecht            raw_bytes = bytearray([0x21, 0xf0, 0xa0, 0x03])
2699451b44SJordan Rupprecht        elif re.match("mips", arch):
2799451b44SJordan Rupprecht            target = self.dbg.CreateTargetWithFileAndTargetTriple("", "mips")
2899451b44SJordan Rupprecht            raw_bytes = bytearray([0x03, 0xa0, 0xf0, 0x21])
2999451b44SJordan Rupprecht        elif re.match("powerpc64le", arch):
3099451b44SJordan Rupprecht            target = self.dbg.CreateTargetWithFileAndTargetTriple("", "powerpc64le")
3199451b44SJordan Rupprecht            raw_bytes = bytearray([0x00, 0x00, 0x80, 0x38])
32*aad27a89SDave Lee        elif arch in ("aarch64", "arm64"):
3396c82166SDavid Spickett            target = self.dbg.CreateTargetWithFileAndTargetTriple("", "aarch64")
3496c82166SDavid Spickett            raw_bytes = bytearray([0x60, 0x0c, 0x80, 0x52])
3596c82166SDavid Spickett        elif arch == "arm":
3696c82166SDavid Spickett            target = self.dbg.CreateTargetWithFileAndTargetTriple("", "arm")
3796c82166SDavid Spickett            raw_bytes = bytearray([0x63, 0x30, 0xa0, 0xe3])
3899451b44SJordan Rupprecht        else:
3999451b44SJordan Rupprecht            target = self.dbg.CreateTargetWithFileAndTargetTriple("", "x86_64")
4099451b44SJordan Rupprecht            raw_bytes = bytearray([0x48, 0x89, 0xe5])
4199451b44SJordan Rupprecht
4299451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
4399451b44SJordan Rupprecht        insts = target.GetInstructions(lldb.SBAddress(0, target), raw_bytes)
4499451b44SJordan Rupprecht
4599451b44SJordan Rupprecht        inst = insts.GetInstructionAtIndex(0)
4699451b44SJordan Rupprecht
4799451b44SJordan Rupprecht        if self.TraceOn():
4899451b44SJordan Rupprecht            print()
4999451b44SJordan Rupprecht            print("Raw bytes:    ", [hex(x) for x in raw_bytes])
5099451b44SJordan Rupprecht            print("Disassembled%s" % str(inst))
5199451b44SJordan Rupprecht        if re.match("mips", arch):
52619e2e09SDave Lee            self.assertEqual(inst.GetMnemonic(target), "move")
53619e2e09SDave Lee            self.assertEqual(inst.GetOperands(target),
5499451b44SJordan Rupprecht                            '$' + "fp, " + '$' + "sp")
5599451b44SJordan Rupprecht        elif re.match("powerpc64le", arch):
56619e2e09SDave Lee            self.assertEqual(inst.GetMnemonic(target), "li")
57619e2e09SDave Lee            self.assertEqual(inst.GetOperands(target), "4, 0")
58*aad27a89SDave Lee        elif arch in ("aarch64", "arm64"):
5996c82166SDavid Spickett            self.assertEqual(inst.GetMnemonic(target), "mov")
6096c82166SDavid Spickett            self.assertEqual(inst.GetOperands(target), "w0, #0x63")
6196c82166SDavid Spickett        elif arch == "arm":
6296c82166SDavid Spickett            self.assertEqual(inst.GetMnemonic(target), "mov")
6396c82166SDavid Spickett            self.assertEqual(inst.GetOperands(target), "r3, #99")
6499451b44SJordan Rupprecht        else:
65619e2e09SDave Lee            self.assertEqual(inst.GetMnemonic(target), "movq")
66619e2e09SDave Lee            self.assertEqual(inst.GetOperands(target),
6799451b44SJordan Rupprecht                            '%' + "rsp, " + '%' + "rbp")
68