389 lines · python
1"""2Check that lldb falls back to default register layouts when the remote provides3no target XML or does not include registers in the target XML.4 5GPRS are passed to the responder to create register data to send back to lldb.6Registers in SUPPL are virtual registers based on those general ones. The tests7pass __file__ to FileCheck so any prefixes in this Python file will be checked.8"""9 10import lldb11from lldbsuite.test.lldbtest import *12from lldbsuite.test.decorators import *13from lldbsuite.test.gdbclientutils import *14from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase15 16import binascii17from textwrap import dedent18 19 20class MyResponder(MockGDBServerResponder):21 @staticmethod22 def filecheck_to_blob(fc):23 for l in fc.strip().splitlines():24 val = l.split("0x")[1]25 yield binascii.b2a_hex(bytes(reversed(binascii.a2b_hex(val)))).decode()26 27 def __init__(self, architecture, has_target_xml, reg_data, halt_reason):28 super().__init__()29 self.architecture = architecture30 self.has_target_xml = has_target_xml31 self.reg_data = "".join(self.filecheck_to_blob(reg_data))32 self.halt_reason = halt_reason33 34 def readRegister(self, regnum):35 return ""36 37 def readRegisters(self):38 return self.reg_data39 40 def haltReason(self):41 return self.halt_reason42 43 def qXferRead(self, obj, annex, offset, length):44 if self.has_target_xml and annex == "target.xml":45 return (46 dedent(47 f"""\48 <?xml version="1.0"?>49 <target version="1.0">50 <architecture>{self.architecture}</architecture>51 </target>"""52 ),53 False,54 )55 56 return None, False57 58 59class TestGDBServerTargetXML(GDBRemoteTestBase):60 def check_x86_64_regs(self, has_target_xml):61 GPRS = """62CHECK-AMD64-DAG: rax = 0x080706050403020163CHECK-AMD64-DAG: rbx = 0x181716151413121164CHECK-AMD64-DAG: rcx = 0x282726252423222165CHECK-AMD64-DAG: rdx = 0x383736353433323166CHECK-AMD64-DAG: rsi = 0x484746454443424167CHECK-AMD64-DAG: rdi = 0x585756555453525168CHECK-AMD64-DAG: rbp = 0x686766656463626169CHECK-AMD64-DAG: rsp = 0x787776757473727170CHECK-AMD64-DAG: r8 = 0x888786858483828171CHECK-AMD64-DAG: r9 = 0x989796959493929172CHECK-AMD64-DAG: r10 = 0xa8a7a6a5a4a3a2a173CHECK-AMD64-DAG: r11 = 0xb8b7b6b5b4b3b2b174CHECK-AMD64-DAG: r12 = 0xc8c7c6c5c4c3c2c175CHECK-AMD64-DAG: r13 = 0xd8d7d6d5d4d3d2d176CHECK-AMD64-DAG: r14 = 0xe8e7e6e5e4e3e2e177CHECK-AMD64-DAG: r15 = 0xf8f7f6f5f4f3f2f178CHECK-AMD64-DAG: rip = 0x100f0e0d0c0b0a0979CHECK-AMD64-DAG: eflags = 0x1c1b1a1980CHECK-AMD64-DAG: cs = 0x2c2b2a2981CHECK-AMD64-DAG: ss = 0x3c3b3a3982"""83 84 SUPPL = """85CHECK-AMD64-DAG: eax = 0x0403020186CHECK-AMD64-DAG: ebx = 0x1413121187CHECK-AMD64-DAG: ecx = 0x2423222188CHECK-AMD64-DAG: edx = 0x3433323189CHECK-AMD64-DAG: esi = 0x4443424190CHECK-AMD64-DAG: edi = 0x5453525191CHECK-AMD64-DAG: ebp = 0x6463626192CHECK-AMD64-DAG: esp = 0x7473727193CHECK-AMD64-DAG: r8d = 0x8483828194CHECK-AMD64-DAG: r9d = 0x9493929195CHECK-AMD64-DAG: r10d = 0xa4a3a2a196CHECK-AMD64-DAG: r11d = 0xb4b3b2b197CHECK-AMD64-DAG: r12d = 0xc4c3c2c198CHECK-AMD64-DAG: r13d = 0xd4d3d2d199CHECK-AMD64-DAG: r14d = 0xe4e3e2e1100CHECK-AMD64-DAG: r15d = 0xf4f3f2f1101 102CHECK-AMD64-DAG: ax = 0x0201103CHECK-AMD64-DAG: bx = 0x1211104CHECK-AMD64-DAG: cx = 0x2221105CHECK-AMD64-DAG: dx = 0x3231106CHECK-AMD64-DAG: si = 0x4241107CHECK-AMD64-DAG: di = 0x5251108CHECK-AMD64-DAG: bp = 0x6261109CHECK-AMD64-DAG: sp = 0x7271110CHECK-AMD64-DAG: r8w = 0x8281111CHECK-AMD64-DAG: r9w = 0x9291112CHECK-AMD64-DAG: r10w = 0xa2a1113CHECK-AMD64-DAG: r11w = 0xb2b1114CHECK-AMD64-DAG: r12w = 0xc2c1115CHECK-AMD64-DAG: r13w = 0xd2d1116CHECK-AMD64-DAG: r14w = 0xe2e1117CHECK-AMD64-DAG: r15w = 0xf2f1118 119CHECK-AMD64-DAG: ah = 0x02120CHECK-AMD64-DAG: bh = 0x12121CHECK-AMD64-DAG: ch = 0x22122CHECK-AMD64-DAG: dh = 0x32123 124CHECK-AMD64-DAG: al = 0x01125CHECK-AMD64-DAG: bl = 0x11126CHECK-AMD64-DAG: cl = 0x21127CHECK-AMD64-DAG: dl = 0x31128CHECK-AMD64-DAG: sil = 0x41129CHECK-AMD64-DAG: dil = 0x51130CHECK-AMD64-DAG: bpl = 0x61131CHECK-AMD64-DAG: spl = 0x71132CHECK-AMD64-DAG: r8l = 0x81133CHECK-AMD64-DAG: r9l = 0x91134CHECK-AMD64-DAG: r10l = 0xa1135CHECK-AMD64-DAG: r11l = 0xb1136CHECK-AMD64-DAG: r12l = 0xc1137CHECK-AMD64-DAG: r13l = 0xd1138CHECK-AMD64-DAG: r14l = 0xe1139CHECK-AMD64-DAG: r15l = 0xf1140"""141 142 self.server.responder = MyResponder(143 "x86-64",144 has_target_xml,145 GPRS,146 "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;",147 )148 149 target = self.createTarget("basic_eh_frame.yaml")150 process = self.connect(target)151 lldbutil.expect_state_changes(152 self, self.dbg.GetListener(), process, [lldb.eStateStopped]153 )154 155 # test all registers156 self.filecheck(157 "register read --all",158 __file__,159 filecheck_options="--check-prefix=CHECK-AMD64",160 )161 162 # test generic aliases163 self.match("register read arg4", ["rcx = 0x2827262524232221"])164 self.match("register read arg3", ["rdx = 0x3837363534333231"])165 self.match("register read arg2", ["rsi = 0x4847464544434241"])166 self.match("register read arg1", ["rdi = 0x5857565554535251"])167 self.match("register read fp", ["rbp = 0x6867666564636261"])168 self.match("register read sp", ["rsp = 0x7877767574737271"])169 self.match("register read arg5", ["r8 = 0x8887868584838281"])170 self.match("register read arg6", ["r9 = 0x9897969594939291"])171 self.match("register read pc", ["rip = 0x100f0e0d0c0b0a09"])172 self.match("register read flags", ["eflags = 0x1c1b1a19"])173 174 @skipIfRemote175 @skipIfLLVMTargetMissing("X86")176 def test_x86_64_regs_no_target_xml(self):177 """Test grabbing various x86_64 registers from gdbserver when there178 is no target XML."""179 self.check_x86_64_regs(False)180 181 @skipIfXmlSupportMissing182 @skipIfRemote183 @skipIfLLVMTargetMissing("X86")184 def test_x86_64_regs_no_register_info(self):185 """Test grabbing various x86_64 registers from gdbserver when there186 is target XML but it does not include register info."""187 self.check_x86_64_regs(True)188 189 def check_aarch64_regs(self, has_target_xml):190 GPRS = """191CHECK-AARCH64-DAG: x0 = 0x0001020304050607192CHECK-AARCH64-DAG: x1 = 0x0102030405060708193CHECK-AARCH64-DAG: x2 = 0x0203040506070809194CHECK-AARCH64-DAG: x3 = 0x030405060708090a195CHECK-AARCH64-DAG: x4 = 0x0405060708090a0b196CHECK-AARCH64-DAG: x5 = 0x05060708090a0b0c197CHECK-AARCH64-DAG: x6 = 0x060708090a0b0c0d198CHECK-AARCH64-DAG: x7 = 0x0708090a0b0c0d0e199CHECK-AARCH64-DAG: x8 = 0x08090a0b0c0d0e0f200CHECK-AARCH64-DAG: x9 = 0x090a0b0c0d0e0f10201CHECK-AARCH64-DAG: x10 = 0x0a0b0c0d0e0f1011202CHECK-AARCH64-DAG: x11 = 0x0b0c0d0e0f101112203CHECK-AARCH64-DAG: x12 = 0x0c0d0e0f10111213204CHECK-AARCH64-DAG: x13 = 0x0d0e0f1011121314205CHECK-AARCH64-DAG: x14 = 0x0e0f101112131415206CHECK-AARCH64-DAG: x15 = 0x0f10111213141516207CHECK-AARCH64-DAG: x16 = 0x1011121314151617208CHECK-AARCH64-DAG: x17 = 0x1112131415161718209CHECK-AARCH64-DAG: x18 = 0x1213141516171819210CHECK-AARCH64-DAG: x19 = 0x131415161718191a211CHECK-AARCH64-DAG: x20 = 0x1415161718191a1b212CHECK-AARCH64-DAG: x21 = 0x15161718191a1b1c213CHECK-AARCH64-DAG: x22 = 0x161718191a1b1c1d214CHECK-AARCH64-DAG: x23 = 0x1718191a1b1c1d1e215CHECK-AARCH64-DAG: x24 = 0x18191a1b1c1d1e1f216CHECK-AARCH64-DAG: x25 = 0x191a1b1c1d1e1f20217CHECK-AARCH64-DAG: x26 = 0x1a1b1c1d1e1f2021218CHECK-AARCH64-DAG: x27 = 0x1b1c1d1e1f202122219CHECK-AARCH64-DAG: x28 = 0x1c1d1e1f20212223220CHECK-AARCH64-DAG: x29 = 0x1d1e1f2021222324221CHECK-AARCH64-DAG: x30 = 0x1e1f202122232425222CHECK-AARCH64-DAG: sp = 0x1f20212223242526223CHECK-AARCH64-DAG: pc = 0x2021222324252627224CHECK-AARCH64-DAG: cpsr = 0x21222324225"""226 227 SUPPL = """228CHECK-AARCH64-DAG: w0 = 0x04050607229CHECK-AARCH64-DAG: w1 = 0x05060708230CHECK-AARCH64-DAG: w2 = 0x06070809231CHECK-AARCH64-DAG: w3 = 0x0708090a232CHECK-AARCH64-DAG: w4 = 0x08090a0b233CHECK-AARCH64-DAG: w5 = 0x090a0b0c234CHECK-AARCH64-DAG: w6 = 0x0a0b0c0d235CHECK-AARCH64-DAG: w7 = 0x0b0c0d0e236CHECK-AARCH64-DAG: w8 = 0x0c0d0e0f237CHECK-AARCH64-DAG: w9 = 0x0d0e0f10238CHECK-AARCH64-DAG: w10 = 0x0e0f1011239CHECK-AARCH64-DAG: w11 = 0x0f101112240CHECK-AARCH64-DAG: w12 = 0x10111213241CHECK-AARCH64-DAG: w13 = 0x11121314242CHECK-AARCH64-DAG: w14 = 0x12131415243CHECK-AARCH64-DAG: w15 = 0x13141516244CHECK-AARCH64-DAG: w16 = 0x14151617245CHECK-AARCH64-DAG: w17 = 0x15161718246CHECK-AARCH64-DAG: w18 = 0x16171819247CHECK-AARCH64-DAG: w19 = 0x1718191a248CHECK-AARCH64-DAG: w20 = 0x18191a1b249CHECK-AARCH64-DAG: w21 = 0x191a1b1c250CHECK-AARCH64-DAG: w22 = 0x1a1b1c1d251CHECK-AARCH64-DAG: w23 = 0x1b1c1d1e252CHECK-AARCH64-DAG: w24 = 0x1c1d1e1f253CHECK-AARCH64-DAG: w25 = 0x1d1e1f20254CHECK-AARCH64-DAG: w26 = 0x1e1f2021255CHECK-AARCH64-DAG: w27 = 0x1f202122256CHECK-AARCH64-DAG: w28 = 0x20212223257CHECK-AARCH64-DAG: w29 = 0x21222324258CHECK-AARCH64-DAG: w30 = 0x22232425259CHECK-AARCH64-DAG: w31 = 0x23242526260"""261 262 self.server.responder = MyResponder(263 "aarch64",264 has_target_xml,265 GPRS,266 "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;",267 )268 269 target = self.createTarget("basic_eh_frame-aarch64.yaml")270 process = self.connect(target)271 lldbutil.expect_state_changes(272 self, self.dbg.GetListener(), process, [lldb.eStateStopped]273 )274 275 # test all registers276 self.filecheck(277 "register read --all",278 __file__,279 filecheck_options="--check-prefix=CHECK-AARCH64",280 )281 282 # test generic aliases283 self.match("register read arg1", ["x0 = 0x0001020304050607"])284 self.match("register read arg2", ["x1 = 0x0102030405060708"])285 self.match("register read fp", ["x29 = 0x1d1e1f2021222324"])286 self.match("register read lr", ["x30 = 0x1e1f202122232425"])287 self.match("register read ra", ["x30 = 0x1e1f202122232425"])288 self.match("register read flags", ["cpsr = 0x21222324"])289 290 @skipIfRemote291 @skipIfLLVMTargetMissing("AArch64")292 def test_aarch64_regs_no_target_xml(self):293 """Test grabbing various aarch64 registers from gdbserver when there294 is no target XML."""295 self.check_aarch64_regs(False)296 297 @skipIfXmlSupportMissing298 @skipIfRemote299 @skipIfLLVMTargetMissing("AArch64")300 def test_aarch64_regs_no_register_info(self):301 """Test grabbing various aarch64 registers from gdbserver when there302 is target XML but it does not include register info."""303 self.check_aarch64_regs(True)304 305 def check_i386_regs(self, has_target_xml):306 GPRS = """307CHECK-I386-DAG: eax = 0x04030201308CHECK-I386-DAG: ecx = 0x14131211309CHECK-I386-DAG: edx = 0x24232221310CHECK-I386-DAG: ebx = 0x34333231311CHECK-I386-DAG: esp = 0x44434241312CHECK-I386-DAG: ebp = 0x54535251313CHECK-I386-DAG: esi = 0x64636261314CHECK-I386-DAG: edi = 0x74737271315CHECK-I386-DAG: eip = 0x84838281316CHECK-I386-DAG: eflags = 0x94939291317CHECK-I386-DAG: cs = 0xa4a3a2a1318CHECK-I386-DAG: ss = 0xb4b3b2b1319CHECK-I386-DAG: ds = 0xc4c3c2c1320CHECK-I386-DAG: es = 0xd4d3d2d1321CHECK-I386-DAG: fs = 0xe4e3e2e1322CHECK-I386-DAG: gs = 0xf4f3f2f1323"""324 325 SUPPL = """326CHECK-I386-DAG: ax = 0x0201327CHECK-I386-DAG: cx = 0x1211328CHECK-I386-DAG: dx = 0x2221329CHECK-I386-DAG: bx = 0x3231330CHECK-I386-DAG: sp = 0x4241331CHECK-I386-DAG: bp = 0x5251332CHECK-I386-DAG: si = 0x6261333CHECK-I386-DAG: di = 0x7271334 335CHECK-I386-DAG: ah = 0x02336CHECK-I386-DAG: ch = 0x12337CHECK-I386-DAG: dh = 0x22338CHECK-I386-DAG: bh = 0x32339 340CHECK-I386-DAG: al = 0x01341CHECK-I386-DAG: cl = 0x11342CHECK-I386-DAG: dl = 0x21343CHECK-I386-DAG: bl = 0x31344CHECK-I386-DAG: spl = 0x41345CHECK-I386-DAG: bpl = 0x51346CHECK-I386-DAG: sil = 0x61347CHECK-I386-DAG: dil = 0x71348"""349 350 self.server.responder = MyResponder(351 "i386",352 has_target_xml,353 GPRS,354 "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;",355 )356 357 target = self.createTarget("basic_eh_frame-i386.yaml")358 process = self.connect(target)359 lldbutil.expect_state_changes(360 self, self.dbg.GetListener(), process, [lldb.eStateStopped]361 )362 363 # test all registers364 self.filecheck(365 "register read --all",366 __file__,367 filecheck_options="--check-prefix=CHECK-I386",368 )369 370 # test generic aliases371 self.match("register read fp", ["ebp = 0x54535251"])372 self.match("register read sp", ["esp = 0x44434241"])373 self.match("register read pc", ["eip = 0x84838281"])374 self.match("register read flags", ["eflags = 0x94939291"])375 376 @skipIfRemote377 @skipIfLLVMTargetMissing("X86")378 def test_i386_regs_no_target_xml(self):379 """Test grabbing various i386 registers from gdbserver when there is380 no target XML."""381 self.check_i386_regs(False)382 383 @skipIfXmlSupportMissing384 @skipIfRemote385 @skipIfLLVMTargetMissing("X86")386 def test_i386_regs_no_register_info(self):387 """Test grabbing various i386 registers from gdbserver when there is388 target XML but it does not include register info."""389 self.check_i386_regs(True)