1
2
3import gdbremote_testcase
4import textwrap
5from lldbsuite.test.decorators import *
6from lldbsuite.test.lldbtest import *
7from lldbsuite.test import lldbutil
8import re
9import xml.etree.ElementTree as ET
10
11class TestGdbRemoteTargetXmlPacket(gdbremote_testcase.GdbRemoteTestCaseBase):
12
13    @llgs_test
14    def test_g_target_xml_returns_correct_data(self):
15        self.build()
16        self.set_inferior_startup_launch()
17
18        procs = self.prep_debug_monitor_and_inferior()
19
20        OFFSET = 0
21        LENGTH = 0x1ffff0
22        self.test_sequence.add_log_lines([
23            "read packet: $qXfer:features:read:target.xml:{:x},{:x}#00".format(
24                    OFFSET,
25                    LENGTH),
26            {
27                "direction": "send",
28                "regex": re.compile("^\$l(.+)#[0-9a-fA-F]{2}$", flags=re.DOTALL),
29                "capture": {1: "target_xml"}
30            }],
31            True)
32        context = self.expect_gdbremote_sequence()
33
34        target_xml = context.get("target_xml")
35
36        root = ET.fromstring(target_xml)
37        self.assertIsNotNone(root)
38        self.assertEqual(root.tag, "target")
39
40        architecture = root.find("architecture")
41        self.assertIsNotNone(architecture)
42        self.assertIn(self.getArchitecture(), architecture.text)
43
44        feature = root.find("feature")
45        self.assertIsNotNone(feature)
46
47        target_xml_registers = feature.findall("reg")
48        self.assertTrue(len(target_xml_registers) > 0)
49
50        # registers info collected by qRegisterInfo
51        self.add_register_info_collection_packets()
52        context = self.expect_gdbremote_sequence()
53        self.assertIsNotNone(context)
54        q_info_registers = self.parse_register_info_packets(context)
55
56        self.assertEqual(len(target_xml_registers), len(q_info_registers))
57        for register in zip(target_xml_registers, q_info_registers):
58            xml_info_reg = register[0]
59            q_info_reg = register[1]
60            self.assertEqual(q_info_reg["name"], xml_info_reg.get("name"))
61            self.assertEqual(q_info_reg["set"], xml_info_reg.get("group"))
62            self.assertEqual(q_info_reg["format"], xml_info_reg.get("format"))
63            self.assertEqual(q_info_reg["bitsize"], xml_info_reg.get("bitsize"))
64
65            if not self.isAArch64():
66                self.assertEqual(q_info_reg["offset"], xml_info_reg.get("offset"))
67
68            self.assertEqual(q_info_reg["encoding"], xml_info_reg.get("encoding"))
69