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