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