1from __future__ import print_function 2import lldb 3from lldbsuite.test.lldbtest import * 4from lldbsuite.test.decorators import * 5from gdbclientutils import * 6 7 8class TestGDBServerTargetXML(GDBRemoteTestBase): 9 10 @skipIfXmlSupportMissing 11 @skipIfRemote 12 @skipIfLLVMTargetMissing("X86") 13 def test_x86_64_regs(self): 14 """Test grabbing various x86_64 registers from gdbserver.""" 15 reg_data = [ 16 "0102030405060708", # rcx 17 "1112131415161718", # rdx 18 "2122232425262728", # rsi 19 "3132333435363738", # rdi 20 "4142434445464748", # rbp 21 "5152535455565758", # rsp 22 "6162636465666768", # r8 23 "7172737475767778", # r9 24 "8182838485868788", # rip 25 "91929394", # eflags 26 "0102030405060708090a", # st0 27 "1112131415161718191a", # st1 28 ] + 6 * [ 29 "2122232425262728292a" # st2..st7 30 ] + [ 31 "8182838485868788898a8b8c8d8e8f90", # xmm0 32 "9192939495969798999a9b9c9d9e9fa0", # xmm1 33 ] + 14 * [ 34 "a1a2a3a4a5a6a7a8a9aaabacadaeafb0", # xmm2..xmm15 35 ] + [ 36 "00000000", # mxcsr 37 ] + [ 38 "b1b2b3b4b5b6b7b8b9babbbcbdbebfc0", # ymm0h 39 "c1c2c3c4c5c6c7c8c9cacbcccdcecfd0", # ymm1h 40 ] + 14 * [ 41 "d1d2d3d4d5d6d7d8d9dadbdcdddedfe0", # ymm2h..ymm15h 42 ] 43 44 class MyResponder(MockGDBServerResponder): 45 def qXferRead(self, obj, annex, offset, length): 46 if annex == "target.xml": 47 return """<?xml version="1.0"?> 48 <!DOCTYPE feature SYSTEM "gdb-target.dtd"> 49 <target> 50 <architecture>i386:x86-64</architecture> 51 <osabi>GNU/Linux</osabi> 52 <feature name="org.gnu.gdb.i386.core"> 53 <reg name="rcx" bitsize="64" type="int64" regnum="2"/> 54 <reg name="rdx" bitsize="64" type="int64" regnum="3"/> 55 <reg name="rsi" bitsize="64" type="int64" regnum="4"/> 56 <reg name="rdi" bitsize="64" type="int64" regnum="5"/> 57 <reg name="rbp" bitsize="64" type="data_ptr" regnum="6"/> 58 <reg name="rsp" bitsize="64" type="data_ptr" regnum="7"/> 59 <reg name="r8" bitsize="64" type="int64" regnum="8"/> 60 <reg name="r9" bitsize="64" type="int64" regnum="9"/> 61 <reg name="rip" bitsize="64" type="code_ptr" regnum="16"/> 62 <reg name="eflags" bitsize="32" type="i386_eflags" regnum="17"/> 63 <reg name="st0" bitsize="80" type="i387_ext" regnum="24"/> 64 <reg name="st1" bitsize="80" type="i387_ext" regnum="25"/> 65 <reg name="st2" bitsize="80" type="i387_ext" regnum="26"/> 66 <reg name="st3" bitsize="80" type="i387_ext" regnum="27"/> 67 <reg name="st4" bitsize="80" type="i387_ext" regnum="28"/> 68 <reg name="st5" bitsize="80" type="i387_ext" regnum="29"/> 69 <reg name="st6" bitsize="80" type="i387_ext" regnum="30"/> 70 <reg name="st7" bitsize="80" type="i387_ext" regnum="31"/> 71 </feature> 72 <feature name="org.gnu.gdb.i386.sse"> 73 <reg name="xmm0" bitsize="128" type="vec128" regnum="40"/> 74 <reg name="xmm1" bitsize="128" type="vec128" regnum="41"/> 75 <reg name="xmm2" bitsize="128" type="vec128" regnum="42"/> 76 <reg name="xmm3" bitsize="128" type="vec128" regnum="43"/> 77 <reg name="xmm4" bitsize="128" type="vec128" regnum="44"/> 78 <reg name="xmm5" bitsize="128" type="vec128" regnum="45"/> 79 <reg name="xmm6" bitsize="128" type="vec128" regnum="46"/> 80 <reg name="xmm7" bitsize="128" type="vec128" regnum="47"/> 81 <reg name="xmm8" bitsize="128" type="vec128" regnum="48"/> 82 <reg name="xmm9" bitsize="128" type="vec128" regnum="49"/> 83 <reg name="xmm10" bitsize="128" type="vec128" regnum="50"/> 84 <reg name="xmm11" bitsize="128" type="vec128" regnum="51"/> 85 <reg name="xmm12" bitsize="128" type="vec128" regnum="52"/> 86 <reg name="xmm13" bitsize="128" type="vec128" regnum="53"/> 87 <reg name="xmm14" bitsize="128" type="vec128" regnum="54"/> 88 <reg name="xmm15" bitsize="128" type="vec128" regnum="55"/> 89 <reg name="mxcsr" bitsize="32" type="i386_mxcsr" regnum="56" group="vector"/> 90 </feature> 91 <feature name="org.gnu.gdb.i386.avx"> 92 <reg name="ymm0h" bitsize="128" type="uint128" regnum="60"/> 93 <reg name="ymm1h" bitsize="128" type="uint128" regnum="61"/> 94 <reg name="ymm2h" bitsize="128" type="uint128" regnum="62"/> 95 <reg name="ymm3h" bitsize="128" type="uint128" regnum="63"/> 96 <reg name="ymm4h" bitsize="128" type="uint128" regnum="64"/> 97 <reg name="ymm5h" bitsize="128" type="uint128" regnum="65"/> 98 <reg name="ymm6h" bitsize="128" type="uint128" regnum="66"/> 99 <reg name="ymm7h" bitsize="128" type="uint128" regnum="67"/> 100 <reg name="ymm8h" bitsize="128" type="uint128" regnum="68"/> 101 <reg name="ymm9h" bitsize="128" type="uint128" regnum="69"/> 102 <reg name="ymm10h" bitsize="128" type="uint128" regnum="70"/> 103 <reg name="ymm11h" bitsize="128" type="uint128" regnum="71"/> 104 <reg name="ymm12h" bitsize="128" type="uint128" regnum="72"/> 105 <reg name="ymm13h" bitsize="128" type="uint128" regnum="73"/> 106 <reg name="ymm14h" bitsize="128" type="uint128" regnum="74"/> 107 <reg name="ymm15h" bitsize="128" type="uint128" regnum="75"/> 108 </feature> 109 </target>""", False 110 else: 111 return None, False 112 113 def readRegister(self, regnum): 114 return "" 115 116 def readRegisters(self): 117 return "".join(reg_data) 118 119 def writeRegisters(self, reg_hex): 120 return "OK" 121 122 def haltReason(self): 123 return "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;" 124 125 self.server.responder = MyResponder() 126 127 target = self.createTarget("basic_eh_frame.yaml") 128 process = self.connect(target) 129 lldbutil.expect_state_changes(self, self.dbg.GetListener(), process, 130 [lldb.eStateStopped]) 131 132 # test generic aliases 133 self.match("register read arg4", 134 ["rcx = 0x0807060504030201"]) 135 self.match("register read arg3", 136 ["rdx = 0x1817161514131211"]) 137 self.match("register read arg2", 138 ["rsi = 0x2827262524232221"]) 139 self.match("register read arg1", 140 ["rdi = 0x3837363534333231"]) 141 self.match("register read fp", 142 ["rbp = 0x4847464544434241"]) 143 self.match("register read sp", 144 ["rsp = 0x5857565554535251"]) 145 self.match("register read arg5", 146 ["r8 = 0x6867666564636261"]) 147 self.match("register read arg6", 148 ["r9 = 0x7877767574737271"]) 149 self.match("register read pc", 150 ["rip = 0x8887868584838281"]) 151 self.match("register read flags", 152 ["eflags = 0x94939291"]) 153