1import lldb 2import time 3from lldbsuite.test.lldbtest import * 4from lldbsuite.test.decorators import * 5from lldbsuite.test.gdbclientutils import * 6from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase 7 8 9class TestRegDefinitionInParts(GDBRemoteTestBase): 10 @skipIfXmlSupportMissing 11 @skipIfRemote 12 def test(self): 13 """ 14 Test that lldb correctly fetches the target definition file 15 in multiple chunks if the remote server only provides the 16 content in small parts, and the small parts it provides is 17 smaller than the maximum packet size that it declared at 18 the start of the debug session. qemu does this. 19 """ 20 21 class MyResponder(MockGDBServerResponder): 22 def qXferRead(self, obj, annex, offset, length): 23 if annex == "target.xml": 24 return ( 25 """<?xml version="1.0"?> 26 <!DOCTYPE feature SYSTEM "gdb-target.dtd"> 27 <target version="1.0"> 28 <architecture>i386:x86-64</architecture> 29 <xi:include href="i386-64bit-core.xml"/> 30 </target>""", 31 False, 32 ) 33 34 if annex == "i386-64bit-core.xml" and offset == 0: 35 return ( 36 """<?xml version="1.0"?> 37<!-- Copyright (C) 2010-2015 Free Software Foundation, Inc. 38 39 Copying and distribution of this file, with or without modification, 40 are permitted in any medium without royalty provided the copyright 41 notice and this notice are preserved. --> 42 43<!DOCTYPE feature SYSTEM "gdb-target.dtd"> 44<feature name="org.gnu.gdb.i386.core"> 45 <flags id="i386_eflags" size="4"> 46 <field name="CF" start="0" end="0"/> 47 <field name="" start="1" end="1"/> 48 <field name="PF" start="2" end="2"/> 49 <field name="AF" start="4" end="4"/> 50 <field name="ZF" start="6" end="6"/> 51 <field name="SF" start="7" end="7"/> 52 <field name="TF" start="8" end="8"/> 53 <field name="IF" start="9" end="9"/> 54 <field name="DF" start="10" end="10"/> 55 <field name="OF" start="11" end="11"/> 56 <field name="NT" start="14" end="14"/> 57 <field name="RF" start="16" end="16"/> 58 <field name="VM" start="17" end="17"/> 59 <field name="AC" start="18" end="18"/> 60 <field name="VIF" start="19" end="19"/> 61 <field name="VIP" start="20" end="20"/> 62 <field name="ID" start="21" end="21"/> 63 </flags> 64 65 <reg name="rax" bitsize="64" type="int64"/> 66 <reg name="rbx" bitsize="64" type="int64"/> 67 <reg name="rcx" bitsize="64" type="int64"/> 68 <reg name="rdx" bitsize="64" type="int64"/> 69 <reg name="rsi" bitsize="64" type="int64"/> 70 <reg name="rdi" bitsize="64" type="int64"/> 71 <reg name="rbp" bitsize="64" type="data_ptr"/> 72 <reg name="rsp" bitsize="64" type="data_ptr"/> 73 <reg name="r8" bitsize="64" type="int64"/> 74 <reg name="r9" bitsize="64" type="int64"/> 75 <reg name="r10" bitsize="64" type="int64"/> 76 <reg name="r11" bitsize="64" type="int64"/> 77 <reg name="r12" bitsize="64" type="int64"/> 78 <reg name="r13" bitsize="64" type="int64"/> 79 <reg name="r14" bitsize="64" type="int64"/> 80 <reg name="r15" bitsize="64" type="int64"/> 81 82 <reg name="rip" bitsize="64" type="code_ptr"/> 83 <reg name="eflags" bitsize="32" type="i386_eflags"/> 84 <reg name="cs" bitsize="32" type="int32"/> 85 <reg name="ss" bitsize="32" ty""", 86 True, 87 ) 88 89 if annex == "i386-64bit-core.xml" and offset == 2045: 90 return ( 91 """pe="int32"/> 92 <reg name="ds" bitsize="32" type="int32"/> 93 <reg name="es" bitsize="32" type="int32"/> 94 <reg name="fs" bitsize="32" type="int32"/> 95 <reg name="gs" bitsize="32" type="int32"/> 96 97 <reg name="st0" bitsize="80" type="i387_ext"/> 98 <reg name="st1" bitsize="80" type="i387_ext"/> 99 <reg name="st2" bitsize="80" type="i387_ext"/> 100 <reg name="st3" bitsize="80" type="i387_ext"/> 101 <reg name="st4" bitsize="80" type="i387_ext"/> 102 <reg name="st5" bitsize="80" type="i387_ext"/> 103 <reg name="st6" bitsize="80" type="i387_ext"/> 104 <reg name="st7" bitsize="80" type="i387_ext"/> 105 106 <reg name="fctrl" bitsize="32" type="int" group="float"/> 107 <reg name="fstat" bitsize="32" type="int" group="float"/> 108 <reg name="ftag" bitsize="32" type="int" group="float"/> 109 <reg name="fiseg" bitsize="32" type="int" group="float"/> 110 <reg name="fioff" bitsize="32" type="int" group="float"/> 111 <reg name="foseg" bitsize="32" type="int" group="float"/> 112 <reg name="fooff" bitsize="32" type="int" group="float"/> 113 <reg name="fop" bitsize="32" type="int" group="float"/> 114</feature>""", 115 False, 116 ) 117 118 return None, False 119 120 def readRegister(self, regnum): 121 return "" 122 123 def readRegisters(self): 124 return "0600000000000000c0b7c00080fffffff021c60080ffffff1a00000000000000020000000000000078b7c00080ffffff203f8ca090ffffff103f8ca090ffffff3025990a80ffffff809698000000000070009f0a80ffffff020000000000000000eae10080ffffff00000000000000001822d74f1a00000078b7c00080ffffff0e12410080ffff004602000011111111222222223333333300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801f0000" 125 126 def haltReason(self): 127 return "T02thread:dead;threads:dead;" 128 129 def qfThreadInfo(self): 130 return "mdead" 131 132 def qC(self): 133 return "" 134 135 def qSupported(self, client_supported): 136 return "PacketSize=1000;qXfer:features:read+" 137 138 def QThreadSuffixSupported(self): 139 return "OK" 140 141 def QListThreadsInStopReply(self): 142 return "OK" 143 144 self.server.responder = MyResponder() 145 if self.TraceOn(): 146 self.runCmd("log enable gdb-remote packets") 147 time.sleep(10) 148 self.addTearDownHook(lambda: self.runCmd("log disable gdb-remote packets")) 149 150 target = self.dbg.CreateTargetWithFileAndArch(None, None) 151 152 process = self.connect(target) 153 154 if self.TraceOn(): 155 interp = self.dbg.GetCommandInterpreter() 156 result = lldb.SBCommandReturnObject() 157 interp.HandleCommand("target list", result) 158 print(result.GetOutput()) 159 160 rip_valobj = process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("rip") 161 self.assertEqual(rip_valobj.GetValueAsUnsigned(), 0x00FFFF800041120E) 162 163 ss_valobj = process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("ss") 164 self.assertEqual(ss_valobj.GetValueAsUnsigned(), 0x22222222) 165 166 if self.TraceOn(): 167 print("rip is 0x%x" % rip_valobj.GetValueAsUnsigned()) 168 print("ss is 0x%x" % ss_valobj.GetValueAsUnsigned()) 169