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