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