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)