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