1*8a7730fbSDavid Spickett"""
2*8a7730fbSDavid SpickettCheck that lldb falls back to default register layouts when the remote provides
3*8a7730fbSDavid Spickettno target XML or does not include registers in the target XML.
4*8a7730fbSDavid Spickett
5*8a7730fbSDavid SpickettGPRS are passed to the responder to create register data to send back to lldb.
6*8a7730fbSDavid SpickettRegisters in SUPPL are virtual registers based on those general ones. The tests
7*8a7730fbSDavid Spickettpass __file__ to FileCheck so any prefixes in this Python file will be checked.
8*8a7730fbSDavid Spickett"""
9*8a7730fbSDavid Spickett
10*8a7730fbSDavid Spickettimport lldb
11*8a7730fbSDavid Spickettfrom lldbsuite.test.lldbtest import *
12*8a7730fbSDavid Spickettfrom lldbsuite.test.decorators import *
13*8a7730fbSDavid Spickettfrom lldbsuite.test.gdbclientutils import *
14*8a7730fbSDavid Spickettfrom lldbsuite.test.lldbgdbclient import GDBRemoteTestBase
15*8a7730fbSDavid Spickett
16*8a7730fbSDavid Spickettimport binascii
17*8a7730fbSDavid Spickettfrom textwrap import dedent
18*8a7730fbSDavid Spickett
19*8a7730fbSDavid Spickett
20*8a7730fbSDavid Spickettclass MyResponder(MockGDBServerResponder):
21*8a7730fbSDavid Spickett    @staticmethod
22*8a7730fbSDavid Spickett    def filecheck_to_blob(fc):
23*8a7730fbSDavid Spickett        for l in fc.strip().splitlines():
24*8a7730fbSDavid Spickett            val = l.split("0x")[1]
25*8a7730fbSDavid Spickett            yield binascii.b2a_hex(bytes(reversed(binascii.a2b_hex(val)))).decode()
26*8a7730fbSDavid Spickett
27*8a7730fbSDavid Spickett    def __init__(self, architecture, has_target_xml, reg_data, halt_reason):
28*8a7730fbSDavid Spickett        super().__init__()
29*8a7730fbSDavid Spickett        self.architecture = architecture
30*8a7730fbSDavid Spickett        self.has_target_xml = has_target_xml
31*8a7730fbSDavid Spickett        self.reg_data = "".join(self.filecheck_to_blob(reg_data))
32*8a7730fbSDavid Spickett        self.halt_reason = halt_reason
33*8a7730fbSDavid Spickett
34*8a7730fbSDavid Spickett    def readRegister(self, regnum):
35*8a7730fbSDavid Spickett        return ""
36*8a7730fbSDavid Spickett
37*8a7730fbSDavid Spickett    def readRegisters(self):
38*8a7730fbSDavid Spickett        return self.reg_data
39*8a7730fbSDavid Spickett
40*8a7730fbSDavid Spickett    def haltReason(self):
41*8a7730fbSDavid Spickett        return self.halt_reason
42*8a7730fbSDavid Spickett
43*8a7730fbSDavid Spickett    def qXferRead(self, obj, annex, offset, length):
44*8a7730fbSDavid Spickett        if self.has_target_xml and annex == "target.xml":
45*8a7730fbSDavid Spickett            return (
46*8a7730fbSDavid Spickett                dedent(
47*8a7730fbSDavid Spickett                    f"""\
48*8a7730fbSDavid Spickett                    <?xml version="1.0"?>
49*8a7730fbSDavid Spickett                    <target version="1.0">
50*8a7730fbSDavid Spickett                      <architecture>{self.architecture}</architecture>
51*8a7730fbSDavid Spickett                    </target>"""
52*8a7730fbSDavid Spickett                ),
53*8a7730fbSDavid Spickett                False,
54*8a7730fbSDavid Spickett            )
55*8a7730fbSDavid Spickett
56*8a7730fbSDavid Spickett        return None, False
57*8a7730fbSDavid Spickett
58*8a7730fbSDavid Spickett
59*8a7730fbSDavid Spickettclass TestGDBServerTargetXML(GDBRemoteTestBase):
60*8a7730fbSDavid Spickett    def check_x86_64_regs(self, has_target_xml):
61*8a7730fbSDavid Spickett        GPRS = """
62*8a7730fbSDavid SpickettCHECK-AMD64-DAG: rax = 0x0807060504030201
63*8a7730fbSDavid SpickettCHECK-AMD64-DAG: rbx = 0x1817161514131211
64*8a7730fbSDavid SpickettCHECK-AMD64-DAG: rcx = 0x2827262524232221
65*8a7730fbSDavid SpickettCHECK-AMD64-DAG: rdx = 0x3837363534333231
66*8a7730fbSDavid SpickettCHECK-AMD64-DAG: rsi = 0x4847464544434241
67*8a7730fbSDavid SpickettCHECK-AMD64-DAG: rdi = 0x5857565554535251
68*8a7730fbSDavid SpickettCHECK-AMD64-DAG: rbp = 0x6867666564636261
69*8a7730fbSDavid SpickettCHECK-AMD64-DAG: rsp = 0x7877767574737271
70*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r8 = 0x8887868584838281
71*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r9 = 0x9897969594939291
72*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r10 = 0xa8a7a6a5a4a3a2a1
73*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r11 = 0xb8b7b6b5b4b3b2b1
74*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r12 = 0xc8c7c6c5c4c3c2c1
75*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r13 = 0xd8d7d6d5d4d3d2d1
76*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r14 = 0xe8e7e6e5e4e3e2e1
77*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r15 = 0xf8f7f6f5f4f3f2f1
78*8a7730fbSDavid SpickettCHECK-AMD64-DAG: rip = 0x100f0e0d0c0b0a09
79*8a7730fbSDavid SpickettCHECK-AMD64-DAG: eflags = 0x1c1b1a19
80*8a7730fbSDavid SpickettCHECK-AMD64-DAG: cs = 0x2c2b2a29
81*8a7730fbSDavid SpickettCHECK-AMD64-DAG: ss = 0x3c3b3a39
82*8a7730fbSDavid Spickett"""
83*8a7730fbSDavid Spickett
84*8a7730fbSDavid Spickett        SUPPL = """
85*8a7730fbSDavid SpickettCHECK-AMD64-DAG: eax = 0x04030201
86*8a7730fbSDavid SpickettCHECK-AMD64-DAG: ebx = 0x14131211
87*8a7730fbSDavid SpickettCHECK-AMD64-DAG: ecx = 0x24232221
88*8a7730fbSDavid SpickettCHECK-AMD64-DAG: edx = 0x34333231
89*8a7730fbSDavid SpickettCHECK-AMD64-DAG: esi = 0x44434241
90*8a7730fbSDavid SpickettCHECK-AMD64-DAG: edi = 0x54535251
91*8a7730fbSDavid SpickettCHECK-AMD64-DAG: ebp = 0x64636261
92*8a7730fbSDavid SpickettCHECK-AMD64-DAG: esp = 0x74737271
93*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r8d = 0x84838281
94*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r9d = 0x94939291
95*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r10d = 0xa4a3a2a1
96*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r11d = 0xb4b3b2b1
97*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r12d = 0xc4c3c2c1
98*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r13d = 0xd4d3d2d1
99*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r14d = 0xe4e3e2e1
100*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r15d = 0xf4f3f2f1
101*8a7730fbSDavid Spickett
102*8a7730fbSDavid SpickettCHECK-AMD64-DAG: ax = 0x0201
103*8a7730fbSDavid SpickettCHECK-AMD64-DAG: bx = 0x1211
104*8a7730fbSDavid SpickettCHECK-AMD64-DAG: cx = 0x2221
105*8a7730fbSDavid SpickettCHECK-AMD64-DAG: dx = 0x3231
106*8a7730fbSDavid SpickettCHECK-AMD64-DAG: si = 0x4241
107*8a7730fbSDavid SpickettCHECK-AMD64-DAG: di = 0x5251
108*8a7730fbSDavid SpickettCHECK-AMD64-DAG: bp = 0x6261
109*8a7730fbSDavid SpickettCHECK-AMD64-DAG: sp = 0x7271
110*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r8w = 0x8281
111*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r9w = 0x9291
112*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r10w = 0xa2a1
113*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r11w = 0xb2b1
114*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r12w = 0xc2c1
115*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r13w = 0xd2d1
116*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r14w = 0xe2e1
117*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r15w = 0xf2f1
118*8a7730fbSDavid Spickett
119*8a7730fbSDavid SpickettCHECK-AMD64-DAG: ah = 0x02
120*8a7730fbSDavid SpickettCHECK-AMD64-DAG: bh = 0x12
121*8a7730fbSDavid SpickettCHECK-AMD64-DAG: ch = 0x22
122*8a7730fbSDavid SpickettCHECK-AMD64-DAG: dh = 0x32
123*8a7730fbSDavid Spickett
124*8a7730fbSDavid SpickettCHECK-AMD64-DAG: al = 0x01
125*8a7730fbSDavid SpickettCHECK-AMD64-DAG: bl = 0x11
126*8a7730fbSDavid SpickettCHECK-AMD64-DAG: cl = 0x21
127*8a7730fbSDavid SpickettCHECK-AMD64-DAG: dl = 0x31
128*8a7730fbSDavid SpickettCHECK-AMD64-DAG: sil = 0x41
129*8a7730fbSDavid SpickettCHECK-AMD64-DAG: dil = 0x51
130*8a7730fbSDavid SpickettCHECK-AMD64-DAG: bpl = 0x61
131*8a7730fbSDavid SpickettCHECK-AMD64-DAG: spl = 0x71
132*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r8l = 0x81
133*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r9l = 0x91
134*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r10l = 0xa1
135*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r11l = 0xb1
136*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r12l = 0xc1
137*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r13l = 0xd1
138*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r14l = 0xe1
139*8a7730fbSDavid SpickettCHECK-AMD64-DAG: r15l = 0xf1
140*8a7730fbSDavid Spickett"""
141*8a7730fbSDavid Spickett
142*8a7730fbSDavid Spickett        self.server.responder = MyResponder(
143*8a7730fbSDavid Spickett            "x86-64",
144*8a7730fbSDavid Spickett            has_target_xml,
145*8a7730fbSDavid Spickett            GPRS,
146*8a7730fbSDavid Spickett            "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;",
147*8a7730fbSDavid Spickett        )
148*8a7730fbSDavid Spickett
149*8a7730fbSDavid Spickett        target = self.createTarget("basic_eh_frame.yaml")
150*8a7730fbSDavid Spickett        process = self.connect(target)
151*8a7730fbSDavid Spickett        lldbutil.expect_state_changes(
152*8a7730fbSDavid Spickett            self, self.dbg.GetListener(), process, [lldb.eStateStopped]
153*8a7730fbSDavid Spickett        )
154*8a7730fbSDavid Spickett
155*8a7730fbSDavid Spickett        # test all registers
156*8a7730fbSDavid Spickett        self.filecheck(
157*8a7730fbSDavid Spickett            "register read --all",
158*8a7730fbSDavid Spickett            __file__,
159*8a7730fbSDavid Spickett            filecheck_options="--check-prefix=CHECK-AMD64",
160*8a7730fbSDavid Spickett        )
161*8a7730fbSDavid Spickett
162*8a7730fbSDavid Spickett        # test generic aliases
163*8a7730fbSDavid Spickett        self.match("register read arg4", ["rcx = 0x2827262524232221"])
164*8a7730fbSDavid Spickett        self.match("register read arg3", ["rdx = 0x3837363534333231"])
165*8a7730fbSDavid Spickett        self.match("register read arg2", ["rsi = 0x4847464544434241"])
166*8a7730fbSDavid Spickett        self.match("register read arg1", ["rdi = 0x5857565554535251"])
167*8a7730fbSDavid Spickett        self.match("register read fp", ["rbp = 0x6867666564636261"])
168*8a7730fbSDavid Spickett        self.match("register read sp", ["rsp = 0x7877767574737271"])
169*8a7730fbSDavid Spickett        self.match("register read arg5", ["r8 = 0x8887868584838281"])
170*8a7730fbSDavid Spickett        self.match("register read arg6", ["r9 = 0x9897969594939291"])
171*8a7730fbSDavid Spickett        self.match("register read pc", ["rip = 0x100f0e0d0c0b0a09"])
172*8a7730fbSDavid Spickett        self.match("register read flags", ["eflags = 0x1c1b1a19"])
173*8a7730fbSDavid Spickett
174*8a7730fbSDavid Spickett    @skipIfRemote
175*8a7730fbSDavid Spickett    @skipIfLLVMTargetMissing("X86")
176*8a7730fbSDavid Spickett    def test_x86_64_regs_no_target_xml(self):
177*8a7730fbSDavid Spickett        """Test grabbing various x86_64 registers from gdbserver when there
178*8a7730fbSDavid Spickett        is no target XML."""
179*8a7730fbSDavid Spickett        self.check_x86_64_regs(False)
180*8a7730fbSDavid Spickett
181*8a7730fbSDavid Spickett    @skipIfXmlSupportMissing
182*8a7730fbSDavid Spickett    @skipIfRemote
183*8a7730fbSDavid Spickett    @skipIfLLVMTargetMissing("X86")
184*8a7730fbSDavid Spickett    def test_x86_64_regs_no_register_info(self):
185*8a7730fbSDavid Spickett        """Test grabbing various x86_64 registers from gdbserver when there
186*8a7730fbSDavid Spickett        is target XML but it does not include register info."""
187*8a7730fbSDavid Spickett        self.check_x86_64_regs(True)
188*8a7730fbSDavid Spickett
189*8a7730fbSDavid Spickett    def check_aarch64_regs(self, has_target_xml):
190*8a7730fbSDavid Spickett        GPRS = """
191*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x0 = 0x0001020304050607
192*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x1 = 0x0102030405060708
193*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x2 = 0x0203040506070809
194*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x3 = 0x030405060708090a
195*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x4 = 0x0405060708090a0b
196*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x5 = 0x05060708090a0b0c
197*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x6 = 0x060708090a0b0c0d
198*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x7 = 0x0708090a0b0c0d0e
199*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x8 = 0x08090a0b0c0d0e0f
200*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x9 = 0x090a0b0c0d0e0f10
201*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x10 = 0x0a0b0c0d0e0f1011
202*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x11 = 0x0b0c0d0e0f101112
203*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x12 = 0x0c0d0e0f10111213
204*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x13 = 0x0d0e0f1011121314
205*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x14 = 0x0e0f101112131415
206*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x15 = 0x0f10111213141516
207*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x16 = 0x1011121314151617
208*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x17 = 0x1112131415161718
209*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x18 = 0x1213141516171819
210*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x19 = 0x131415161718191a
211*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x20 = 0x1415161718191a1b
212*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x21 = 0x15161718191a1b1c
213*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x22 = 0x161718191a1b1c1d
214*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x23 = 0x1718191a1b1c1d1e
215*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x24 = 0x18191a1b1c1d1e1f
216*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x25 = 0x191a1b1c1d1e1f20
217*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x26 = 0x1a1b1c1d1e1f2021
218*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x27 = 0x1b1c1d1e1f202122
219*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x28 = 0x1c1d1e1f20212223
220*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x29 = 0x1d1e1f2021222324
221*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: x30 = 0x1e1f202122232425
222*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: sp = 0x1f20212223242526
223*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: pc = 0x2021222324252627
224*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: cpsr = 0x21222324
225*8a7730fbSDavid Spickett"""
226*8a7730fbSDavid Spickett
227*8a7730fbSDavid Spickett        SUPPL = """
228*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w0 = 0x04050607
229*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w1 = 0x05060708
230*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w2 = 0x06070809
231*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w3 = 0x0708090a
232*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w4 = 0x08090a0b
233*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w5 = 0x090a0b0c
234*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w6 = 0x0a0b0c0d
235*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w7 = 0x0b0c0d0e
236*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w8 = 0x0c0d0e0f
237*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w9 = 0x0d0e0f10
238*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w10 = 0x0e0f1011
239*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w11 = 0x0f101112
240*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w12 = 0x10111213
241*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w13 = 0x11121314
242*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w14 = 0x12131415
243*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w15 = 0x13141516
244*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w16 = 0x14151617
245*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w17 = 0x15161718
246*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w18 = 0x16171819
247*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w19 = 0x1718191a
248*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w20 = 0x18191a1b
249*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w21 = 0x191a1b1c
250*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w22 = 0x1a1b1c1d
251*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w23 = 0x1b1c1d1e
252*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w24 = 0x1c1d1e1f
253*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w25 = 0x1d1e1f20
254*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w26 = 0x1e1f2021
255*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w27 = 0x1f202122
256*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w28 = 0x20212223
257*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w29 = 0x21222324
258*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w30 = 0x22232425
259*8a7730fbSDavid SpickettCHECK-AARCH64-DAG: w31 = 0x23242526
260*8a7730fbSDavid Spickett"""
261*8a7730fbSDavid Spickett
262*8a7730fbSDavid Spickett        self.server.responder = MyResponder(
263*8a7730fbSDavid Spickett            "aarch64",
264*8a7730fbSDavid Spickett            has_target_xml,
265*8a7730fbSDavid Spickett            GPRS,
266*8a7730fbSDavid Spickett            "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;",
267*8a7730fbSDavid Spickett        )
268*8a7730fbSDavid Spickett
269*8a7730fbSDavid Spickett        target = self.createTarget("basic_eh_frame-aarch64.yaml")
270*8a7730fbSDavid Spickett        process = self.connect(target)
271*8a7730fbSDavid Spickett        lldbutil.expect_state_changes(
272*8a7730fbSDavid Spickett            self, self.dbg.GetListener(), process, [lldb.eStateStopped]
273*8a7730fbSDavid Spickett        )
274*8a7730fbSDavid Spickett
275*8a7730fbSDavid Spickett        # test all registers
276*8a7730fbSDavid Spickett        self.filecheck(
277*8a7730fbSDavid Spickett            "register read --all",
278*8a7730fbSDavid Spickett            __file__,
279*8a7730fbSDavid Spickett            filecheck_options="--check-prefix=CHECK-AARCH64",
280*8a7730fbSDavid Spickett        )
281*8a7730fbSDavid Spickett
282*8a7730fbSDavid Spickett        # test generic aliases
283*8a7730fbSDavid Spickett        self.match("register read arg1", ["x0 = 0x0001020304050607"])
284*8a7730fbSDavid Spickett        self.match("register read arg2", ["x1 = 0x0102030405060708"])
285*8a7730fbSDavid Spickett        self.match("register read fp", ["x29 = 0x1d1e1f2021222324"])
286*8a7730fbSDavid Spickett        self.match("register read lr", ["x30 = 0x1e1f202122232425"])
287*8a7730fbSDavid Spickett        self.match("register read ra", ["x30 = 0x1e1f202122232425"])
288*8a7730fbSDavid Spickett        self.match("register read flags", ["cpsr = 0x21222324"])
289*8a7730fbSDavid Spickett
290*8a7730fbSDavid Spickett    @skipIfRemote
291*8a7730fbSDavid Spickett    @skipIfLLVMTargetMissing("AArch64")
292*8a7730fbSDavid Spickett    def test_aarch64_regs_no_target_xml(self):
293*8a7730fbSDavid Spickett        """Test grabbing various aarch64 registers from gdbserver when there
294*8a7730fbSDavid Spickett        is no target XML."""
295*8a7730fbSDavid Spickett        self.check_aarch64_regs(False)
296*8a7730fbSDavid Spickett
297*8a7730fbSDavid Spickett    @skipIfXmlSupportMissing
298*8a7730fbSDavid Spickett    @skipIfRemote
299*8a7730fbSDavid Spickett    @skipIfLLVMTargetMissing("AArch64")
300*8a7730fbSDavid Spickett    def test_aarch64_regs_no_register_info(self):
301*8a7730fbSDavid Spickett        """Test grabbing various aarch64 registers from gdbserver when there
302*8a7730fbSDavid Spickett        is target XML but it does not include register info."""
303*8a7730fbSDavid Spickett        self.check_aarch64_regs(True)
304*8a7730fbSDavid Spickett
305*8a7730fbSDavid Spickett    def check_i386_regs(self, has_target_xml):
306*8a7730fbSDavid Spickett        GPRS = """
307*8a7730fbSDavid SpickettCHECK-I386-DAG: eax = 0x04030201
308*8a7730fbSDavid SpickettCHECK-I386-DAG: ecx = 0x14131211
309*8a7730fbSDavid SpickettCHECK-I386-DAG: edx = 0x24232221
310*8a7730fbSDavid SpickettCHECK-I386-DAG: ebx = 0x34333231
311*8a7730fbSDavid SpickettCHECK-I386-DAG: esp = 0x44434241
312*8a7730fbSDavid SpickettCHECK-I386-DAG: ebp = 0x54535251
313*8a7730fbSDavid SpickettCHECK-I386-DAG: esi = 0x64636261
314*8a7730fbSDavid SpickettCHECK-I386-DAG: edi = 0x74737271
315*8a7730fbSDavid SpickettCHECK-I386-DAG: eip = 0x84838281
316*8a7730fbSDavid SpickettCHECK-I386-DAG: eflags = 0x94939291
317*8a7730fbSDavid SpickettCHECK-I386-DAG: cs = 0xa4a3a2a1
318*8a7730fbSDavid SpickettCHECK-I386-DAG: ss = 0xb4b3b2b1
319*8a7730fbSDavid SpickettCHECK-I386-DAG: ds = 0xc4c3c2c1
320*8a7730fbSDavid SpickettCHECK-I386-DAG: es = 0xd4d3d2d1
321*8a7730fbSDavid SpickettCHECK-I386-DAG: fs = 0xe4e3e2e1
322*8a7730fbSDavid SpickettCHECK-I386-DAG: gs = 0xf4f3f2f1
323*8a7730fbSDavid Spickett"""
324*8a7730fbSDavid Spickett
325*8a7730fbSDavid Spickett        SUPPL = """
326*8a7730fbSDavid SpickettCHECK-I386-DAG: ax = 0x0201
327*8a7730fbSDavid SpickettCHECK-I386-DAG: cx = 0x1211
328*8a7730fbSDavid SpickettCHECK-I386-DAG: dx = 0x2221
329*8a7730fbSDavid SpickettCHECK-I386-DAG: bx = 0x3231
330*8a7730fbSDavid SpickettCHECK-I386-DAG: sp = 0x4241
331*8a7730fbSDavid SpickettCHECK-I386-DAG: bp = 0x5251
332*8a7730fbSDavid SpickettCHECK-I386-DAG: si = 0x6261
333*8a7730fbSDavid SpickettCHECK-I386-DAG: di = 0x7271
334*8a7730fbSDavid Spickett
335*8a7730fbSDavid SpickettCHECK-I386-DAG: ah = 0x02
336*8a7730fbSDavid SpickettCHECK-I386-DAG: ch = 0x12
337*8a7730fbSDavid SpickettCHECK-I386-DAG: dh = 0x22
338*8a7730fbSDavid SpickettCHECK-I386-DAG: bh = 0x32
339*8a7730fbSDavid Spickett
340*8a7730fbSDavid SpickettCHECK-I386-DAG: al = 0x01
341*8a7730fbSDavid SpickettCHECK-I386-DAG: cl = 0x11
342*8a7730fbSDavid SpickettCHECK-I386-DAG: dl = 0x21
343*8a7730fbSDavid SpickettCHECK-I386-DAG: bl = 0x31
344*8a7730fbSDavid SpickettCHECK-I386-DAG: spl = 0x41
345*8a7730fbSDavid SpickettCHECK-I386-DAG: bpl = 0x51
346*8a7730fbSDavid SpickettCHECK-I386-DAG: sil = 0x61
347*8a7730fbSDavid SpickettCHECK-I386-DAG: dil = 0x71
348*8a7730fbSDavid Spickett"""
349*8a7730fbSDavid Spickett
350*8a7730fbSDavid Spickett        self.server.responder = MyResponder(
351*8a7730fbSDavid Spickett            "i386",
352*8a7730fbSDavid Spickett            has_target_xml,
353*8a7730fbSDavid Spickett            GPRS,
354*8a7730fbSDavid Spickett            "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;",
355*8a7730fbSDavid Spickett        )
356*8a7730fbSDavid Spickett
357*8a7730fbSDavid Spickett        target = self.createTarget("basic_eh_frame-i386.yaml")
358*8a7730fbSDavid Spickett        process = self.connect(target)
359*8a7730fbSDavid Spickett        lldbutil.expect_state_changes(
360*8a7730fbSDavid Spickett            self, self.dbg.GetListener(), process, [lldb.eStateStopped]
361*8a7730fbSDavid Spickett        )
362*8a7730fbSDavid Spickett
363*8a7730fbSDavid Spickett        # test all registers
364*8a7730fbSDavid Spickett        self.filecheck(
365*8a7730fbSDavid Spickett            "register read --all",
366*8a7730fbSDavid Spickett            __file__,
367*8a7730fbSDavid Spickett            filecheck_options="--check-prefix=CHECK-I386",
368*8a7730fbSDavid Spickett        )
369*8a7730fbSDavid Spickett
370*8a7730fbSDavid Spickett        # test generic aliases
371*8a7730fbSDavid Spickett        self.match("register read fp", ["ebp = 0x54535251"])
372*8a7730fbSDavid Spickett        self.match("register read sp", ["esp = 0x44434241"])
373*8a7730fbSDavid Spickett        self.match("register read pc", ["eip = 0x84838281"])
374*8a7730fbSDavid Spickett        self.match("register read flags", ["eflags = 0x94939291"])
375*8a7730fbSDavid Spickett
376*8a7730fbSDavid Spickett    @skipIfRemote
377*8a7730fbSDavid Spickett    @skipIfLLVMTargetMissing("X86")
378*8a7730fbSDavid Spickett    def test_i386_regs_no_target_xml(self):
379*8a7730fbSDavid Spickett        """Test grabbing various i386 registers from gdbserver when there is
380*8a7730fbSDavid Spickett        no target XML."""
381*8a7730fbSDavid Spickett        self.check_i386_regs(False)
382*8a7730fbSDavid Spickett
383*8a7730fbSDavid Spickett    @skipIfXmlSupportMissing
384*8a7730fbSDavid Spickett    @skipIfRemote
385*8a7730fbSDavid Spickett    @skipIfLLVMTargetMissing("X86")
386*8a7730fbSDavid Spickett    def test_i386_regs_no_register_info(self):
387*8a7730fbSDavid Spickett        """Test grabbing various i386 registers from gdbserver when there is
388*8a7730fbSDavid Spickett        target XML but it does not include register info."""
389*8a7730fbSDavid Spickett        self.check_i386_regs(True)