xref: /llvm-project/lldb/test/API/functionalities/gdb_remote_client/TestGDBServerTargetXML.py (revision 8567f4d4b9a79f041406026011fb8151b24b8c99)
1from __future__ import print_function
2import lldb
3from lldbsuite.test.lldbtest import *
4from lldbsuite.test.decorators import *
5from gdbclientutils import *
6
7
8class TestGDBServerTargetXML(GDBRemoteTestBase):
9
10    @skipIfXmlSupportMissing
11    @skipIfRemote
12    @skipIfLLVMTargetMissing("X86")
13    def test_x86_64_regs(self):
14        """Test grabbing various x86_64 registers from gdbserver."""
15        reg_data = [
16            "0102030405060708",  # rcx
17            "1112131415161718",  # rdx
18            "2122232425262728",  # rsi
19            "3132333435363738",  # rdi
20            "4142434445464748",  # rbp
21            "5152535455565758",  # rsp
22            "6162636465666768",  # r8
23            "7172737475767778",  # r9
24            "8182838485868788",  # rip
25            "91929394",  # eflags
26            "0102030405060708090a",  # st0
27            "1112131415161718191a",  # st1
28        ] + 6 * [
29            "2122232425262728292a"  # st2..st7
30        ] + [
31            "8182838485868788898a8b8c8d8e8f90",  # xmm0
32            "9192939495969798999a9b9c9d9e9fa0",  # xmm1
33        ] + 14 * [
34            "a1a2a3a4a5a6a7a8a9aaabacadaeafb0",  # xmm2..xmm15
35        ] + [
36            "00000000",  # mxcsr
37        ] + [
38            "b1b2b3b4b5b6b7b8b9babbbcbdbebfc0",  # ymm0h
39            "c1c2c3c4c5c6c7c8c9cacbcccdcecfd0",  # ymm1h
40        ] + 14 * [
41            "d1d2d3d4d5d6d7d8d9dadbdcdddedfe0",  # ymm2h..ymm15h
42        ]
43
44        class MyResponder(MockGDBServerResponder):
45            def qXferRead(self, obj, annex, offset, length):
46                if annex == "target.xml":
47                    return """<?xml version="1.0"?>
48                        <!DOCTYPE feature SYSTEM "gdb-target.dtd">
49                        <target>
50                          <architecture>i386:x86-64</architecture>
51                          <osabi>GNU/Linux</osabi>
52                          <feature name="org.gnu.gdb.i386.core">
53                            <reg name="rcx" bitsize="64" type="int64" regnum="2"/>
54                            <reg name="rdx" bitsize="64" type="int64" regnum="3"/>
55                            <reg name="rsi" bitsize="64" type="int64" regnum="4"/>
56                            <reg name="rdi" bitsize="64" type="int64" regnum="5"/>
57                            <reg name="rbp" bitsize="64" type="data_ptr" regnum="6"/>
58                            <reg name="rsp" bitsize="64" type="data_ptr" regnum="7"/>
59                            <reg name="r8" bitsize="64" type="int64" regnum="8"/>
60                            <reg name="r9" bitsize="64" type="int64" regnum="9"/>
61                            <reg name="rip" bitsize="64" type="code_ptr" regnum="16"/>
62                            <reg name="eflags" bitsize="32" type="i386_eflags" regnum="17"/>
63                            <reg name="st0" bitsize="80" type="i387_ext" regnum="24"/>
64                            <reg name="st1" bitsize="80" type="i387_ext" regnum="25"/>
65                            <reg name="st2" bitsize="80" type="i387_ext" regnum="26"/>
66                            <reg name="st3" bitsize="80" type="i387_ext" regnum="27"/>
67                            <reg name="st4" bitsize="80" type="i387_ext" regnum="28"/>
68                            <reg name="st5" bitsize="80" type="i387_ext" regnum="29"/>
69                            <reg name="st6" bitsize="80" type="i387_ext" regnum="30"/>
70                            <reg name="st7" bitsize="80" type="i387_ext" regnum="31"/>
71                          </feature>
72                          <feature name="org.gnu.gdb.i386.sse">
73                            <reg name="xmm0" bitsize="128" type="vec128" regnum="40"/>
74                            <reg name="xmm1" bitsize="128" type="vec128" regnum="41"/>
75                            <reg name="xmm2" bitsize="128" type="vec128" regnum="42"/>
76                            <reg name="xmm3" bitsize="128" type="vec128" regnum="43"/>
77                            <reg name="xmm4" bitsize="128" type="vec128" regnum="44"/>
78                            <reg name="xmm5" bitsize="128" type="vec128" regnum="45"/>
79                            <reg name="xmm6" bitsize="128" type="vec128" regnum="46"/>
80                            <reg name="xmm7" bitsize="128" type="vec128" regnum="47"/>
81                            <reg name="xmm8" bitsize="128" type="vec128" regnum="48"/>
82                            <reg name="xmm9" bitsize="128" type="vec128" regnum="49"/>
83                            <reg name="xmm10" bitsize="128" type="vec128" regnum="50"/>
84                            <reg name="xmm11" bitsize="128" type="vec128" regnum="51"/>
85                            <reg name="xmm12" bitsize="128" type="vec128" regnum="52"/>
86                            <reg name="xmm13" bitsize="128" type="vec128" regnum="53"/>
87                            <reg name="xmm14" bitsize="128" type="vec128" regnum="54"/>
88                            <reg name="xmm15" bitsize="128" type="vec128" regnum="55"/>
89                            <reg name="mxcsr" bitsize="32" type="i386_mxcsr" regnum="56" group="vector"/>
90                          </feature>
91                          <feature name="org.gnu.gdb.i386.avx">
92                            <reg name="ymm0h" bitsize="128" type="uint128" regnum="60"/>
93                            <reg name="ymm1h" bitsize="128" type="uint128" regnum="61"/>
94                            <reg name="ymm2h" bitsize="128" type="uint128" regnum="62"/>
95                            <reg name="ymm3h" bitsize="128" type="uint128" regnum="63"/>
96                            <reg name="ymm4h" bitsize="128" type="uint128" regnum="64"/>
97                            <reg name="ymm5h" bitsize="128" type="uint128" regnum="65"/>
98                            <reg name="ymm6h" bitsize="128" type="uint128" regnum="66"/>
99                            <reg name="ymm7h" bitsize="128" type="uint128" regnum="67"/>
100                            <reg name="ymm8h" bitsize="128" type="uint128" regnum="68"/>
101                            <reg name="ymm9h" bitsize="128" type="uint128" regnum="69"/>
102                            <reg name="ymm10h" bitsize="128" type="uint128" regnum="70"/>
103                            <reg name="ymm11h" bitsize="128" type="uint128" regnum="71"/>
104                            <reg name="ymm12h" bitsize="128" type="uint128" regnum="72"/>
105                            <reg name="ymm13h" bitsize="128" type="uint128" regnum="73"/>
106                            <reg name="ymm14h" bitsize="128" type="uint128" regnum="74"/>
107                            <reg name="ymm15h" bitsize="128" type="uint128" regnum="75"/>
108                          </feature>
109                        </target>""", False
110                else:
111                    return None, False
112
113            def readRegister(self, regnum):
114                return ""
115
116            def readRegisters(self):
117                return "".join(reg_data)
118
119            def writeRegisters(self, reg_hex):
120                return "OK"
121
122            def haltReason(self):
123                return "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;"
124
125        self.server.responder = MyResponder()
126
127        target = self.createTarget("basic_eh_frame.yaml")
128        process = self.connect(target)
129        lldbutil.expect_state_changes(self, self.dbg.GetListener(), process,
130                                      [lldb.eStateStopped])
131
132        # test generic aliases
133        self.match("register read arg4",
134                   ["rcx = 0x0807060504030201"])
135        self.match("register read arg3",
136                   ["rdx = 0x1817161514131211"])
137        self.match("register read arg2",
138                   ["rsi = 0x2827262524232221"])
139        self.match("register read arg1",
140                   ["rdi = 0x3837363534333231"])
141        self.match("register read fp",
142                   ["rbp = 0x4847464544434241"])
143        self.match("register read sp",
144                   ["rsp = 0x5857565554535251"])
145        self.match("register read arg5",
146                   ["r8 = 0x6867666564636261"])
147        self.match("register read arg6",
148                   ["r9 = 0x7877767574737271"])
149        self.match("register read pc",
150                   ["rip = 0x8887868584838281"])
151        self.match("register read flags",
152                   ["eflags = 0x94939291"])
153