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