199451b44SJordan Rupprechtfrom __future__ import print_function 299451b44SJordan Rupprechtimport lldb 399451b44SJordan Rupprechtimport time 499451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 599451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 6*33c0f93fSPavel Labathfrom lldbsuite.test.gdbclientutils import * 7*33c0f93fSPavel Labathfrom lldbsuite.test.lldbgdbclient import GDBRemoteTestBase 899451b44SJordan Rupprecht 999451b44SJordan Rupprechtclass TestRegDefinitionInParts(GDBRemoteTestBase): 1099451b44SJordan Rupprecht 11*33c0f93fSPavel Labath mydir = TestBase.compute_mydir(__file__) 12*33c0f93fSPavel Labath 1399451b44SJordan Rupprecht @skipIfXmlSupportMissing 1499451b44SJordan Rupprecht @skipIfRemote 1599451b44SJordan Rupprecht def test(self): 1699451b44SJordan Rupprecht """ 1799451b44SJordan Rupprecht Test that lldb correctly fetches the target definition file 1899451b44SJordan Rupprecht in multiple chunks if the remote server only provides the 1999451b44SJordan Rupprecht content in small parts, and the small parts it provides is 2099451b44SJordan Rupprecht smaller than the maximum packet size that it declared at 2199451b44SJordan Rupprecht the start of the debug session. qemu does this. 2299451b44SJordan Rupprecht """ 2399451b44SJordan Rupprecht class MyResponder(MockGDBServerResponder): 2499451b44SJordan Rupprecht 2599451b44SJordan Rupprecht def qXferRead(self, obj, annex, offset, length): 2699451b44SJordan Rupprecht if annex == "target.xml": 2799451b44SJordan Rupprecht return """<?xml version="1.0"?> 2899451b44SJordan Rupprecht <!DOCTYPE feature SYSTEM "gdb-target.dtd"> 2999451b44SJordan Rupprecht <target version="1.0"> 3099451b44SJordan Rupprecht <architecture>i386:x86-64</architecture> 3199451b44SJordan Rupprecht <xi:include href="i386-64bit-core.xml"/> 3299451b44SJordan Rupprecht </target>""", False 3399451b44SJordan Rupprecht 3499451b44SJordan Rupprecht if annex == "i386-64bit-core.xml" and offset == 0: 3599451b44SJordan Rupprecht return """<?xml version="1.0"?> 3699451b44SJordan Rupprecht<!-- Copyright (C) 2010-2015 Free Software Foundation, Inc. 3799451b44SJordan Rupprecht 3899451b44SJordan Rupprecht Copying and distribution of this file, with or without modification, 3999451b44SJordan Rupprecht are permitted in any medium without royalty provided the copyright 4099451b44SJordan Rupprecht notice and this notice are preserved. --> 4199451b44SJordan Rupprecht 4299451b44SJordan Rupprecht<!DOCTYPE feature SYSTEM "gdb-target.dtd"> 4399451b44SJordan Rupprecht<feature name="org.gnu.gdb.i386.core"> 4499451b44SJordan Rupprecht <flags id="i386_eflags" size="4"> 4599451b44SJordan Rupprecht <field name="CF" start="0" end="0"/> 4699451b44SJordan Rupprecht <field name="" start="1" end="1"/> 4799451b44SJordan Rupprecht <field name="PF" start="2" end="2"/> 4899451b44SJordan Rupprecht <field name="AF" start="4" end="4"/> 4999451b44SJordan Rupprecht <field name="ZF" start="6" end="6"/> 5099451b44SJordan Rupprecht <field name="SF" start="7" end="7"/> 5199451b44SJordan Rupprecht <field name="TF" start="8" end="8"/> 5299451b44SJordan Rupprecht <field name="IF" start="9" end="9"/> 5399451b44SJordan Rupprecht <field name="DF" start="10" end="10"/> 5499451b44SJordan Rupprecht <field name="OF" start="11" end="11"/> 5599451b44SJordan Rupprecht <field name="NT" start="14" end="14"/> 5699451b44SJordan Rupprecht <field name="RF" start="16" end="16"/> 5799451b44SJordan Rupprecht <field name="VM" start="17" end="17"/> 5899451b44SJordan Rupprecht <field name="AC" start="18" end="18"/> 5999451b44SJordan Rupprecht <field name="VIF" start="19" end="19"/> 6099451b44SJordan Rupprecht <field name="VIP" start="20" end="20"/> 6199451b44SJordan Rupprecht <field name="ID" start="21" end="21"/> 6299451b44SJordan Rupprecht </flags> 6399451b44SJordan Rupprecht 6499451b44SJordan Rupprecht <reg name="rax" bitsize="64" type="int64"/> 6599451b44SJordan Rupprecht <reg name="rbx" bitsize="64" type="int64"/> 6699451b44SJordan Rupprecht <reg name="rcx" bitsize="64" type="int64"/> 6799451b44SJordan Rupprecht <reg name="rdx" bitsize="64" type="int64"/> 6899451b44SJordan Rupprecht <reg name="rsi" bitsize="64" type="int64"/> 6999451b44SJordan Rupprecht <reg name="rdi" bitsize="64" type="int64"/> 7099451b44SJordan Rupprecht <reg name="rbp" bitsize="64" type="data_ptr"/> 7199451b44SJordan Rupprecht <reg name="rsp" bitsize="64" type="data_ptr"/> 7299451b44SJordan Rupprecht <reg name="r8" bitsize="64" type="int64"/> 7399451b44SJordan Rupprecht <reg name="r9" bitsize="64" type="int64"/> 7499451b44SJordan Rupprecht <reg name="r10" bitsize="64" type="int64"/> 7599451b44SJordan Rupprecht <reg name="r11" bitsize="64" type="int64"/> 7699451b44SJordan Rupprecht <reg name="r12" bitsize="64" type="int64"/> 7799451b44SJordan Rupprecht <reg name="r13" bitsize="64" type="int64"/> 7899451b44SJordan Rupprecht <reg name="r14" bitsize="64" type="int64"/> 7999451b44SJordan Rupprecht <reg name="r15" bitsize="64" type="int64"/> 8099451b44SJordan Rupprecht 8199451b44SJordan Rupprecht <reg name="rip" bitsize="64" type="code_ptr"/> 8299451b44SJordan Rupprecht <reg name="eflags" bitsize="32" type="i386_eflags"/> 8399451b44SJordan Rupprecht <reg name="cs" bitsize="32" type="int32"/> 8499451b44SJordan Rupprecht <reg name="ss" bitsize="32" ty""", True 8599451b44SJordan Rupprecht 8699451b44SJordan Rupprecht if annex == "i386-64bit-core.xml" and offset == 2045: 8799451b44SJordan Rupprecht return """pe="int32"/> 8899451b44SJordan Rupprecht <reg name="ds" bitsize="32" type="int32"/> 8999451b44SJordan Rupprecht <reg name="es" bitsize="32" type="int32"/> 9099451b44SJordan Rupprecht <reg name="fs" bitsize="32" type="int32"/> 9199451b44SJordan Rupprecht <reg name="gs" bitsize="32" type="int32"/> 9299451b44SJordan Rupprecht 9399451b44SJordan Rupprecht <reg name="st0" bitsize="80" type="i387_ext"/> 9499451b44SJordan Rupprecht <reg name="st1" bitsize="80" type="i387_ext"/> 9599451b44SJordan Rupprecht <reg name="st2" bitsize="80" type="i387_ext"/> 9699451b44SJordan Rupprecht <reg name="st3" bitsize="80" type="i387_ext"/> 9799451b44SJordan Rupprecht <reg name="st4" bitsize="80" type="i387_ext"/> 9899451b44SJordan Rupprecht <reg name="st5" bitsize="80" type="i387_ext"/> 9999451b44SJordan Rupprecht <reg name="st6" bitsize="80" type="i387_ext"/> 10099451b44SJordan Rupprecht <reg name="st7" bitsize="80" type="i387_ext"/> 10199451b44SJordan Rupprecht 10299451b44SJordan Rupprecht <reg name="fctrl" bitsize="32" type="int" group="float"/> 10399451b44SJordan Rupprecht <reg name="fstat" bitsize="32" type="int" group="float"/> 10499451b44SJordan Rupprecht <reg name="ftag" bitsize="32" type="int" group="float"/> 10599451b44SJordan Rupprecht <reg name="fiseg" bitsize="32" type="int" group="float"/> 10699451b44SJordan Rupprecht <reg name="fioff" bitsize="32" type="int" group="float"/> 10799451b44SJordan Rupprecht <reg name="foseg" bitsize="32" type="int" group="float"/> 10899451b44SJordan Rupprecht <reg name="fooff" bitsize="32" type="int" group="float"/> 10999451b44SJordan Rupprecht <reg name="fop" bitsize="32" type="int" group="float"/> 11099451b44SJordan Rupprecht</feature>""", False 11199451b44SJordan Rupprecht 11299451b44SJordan Rupprecht return None, False 11399451b44SJordan Rupprecht 11499451b44SJordan Rupprecht def readRegister(self, regnum): 11599451b44SJordan Rupprecht return "" 11699451b44SJordan Rupprecht 11799451b44SJordan Rupprecht def readRegisters(self): 11899451b44SJordan Rupprecht return "0600000000000000c0b7c00080fffffff021c60080ffffff1a00000000000000020000000000000078b7c00080ffffff203f8ca090ffffff103f8ca090ffffff3025990a80ffffff809698000000000070009f0a80ffffff020000000000000000eae10080ffffff00000000000000001822d74f1a00000078b7c00080ffffff0e12410080ffff004602000011111111222222223333333300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801f0000" 11999451b44SJordan Rupprecht 12099451b44SJordan Rupprecht def haltReason(self): 12199451b44SJordan Rupprecht return "T02thread:dead;threads:dead;" 12299451b44SJordan Rupprecht 12399451b44SJordan Rupprecht def qfThreadInfo(self): 12499451b44SJordan Rupprecht return "mdead" 12599451b44SJordan Rupprecht 12699451b44SJordan Rupprecht def qC(self): 12799451b44SJordan Rupprecht return "" 12899451b44SJordan Rupprecht 12999451b44SJordan Rupprecht def qSupported(self, client_supported): 13099451b44SJordan Rupprecht return "PacketSize=1000;qXfer:features:read+" 13199451b44SJordan Rupprecht 13299451b44SJordan Rupprecht def QThreadSuffixSupported(self): 13399451b44SJordan Rupprecht return "OK" 13499451b44SJordan Rupprecht 13599451b44SJordan Rupprecht def QListThreadsInStopReply(self): 13699451b44SJordan Rupprecht return "OK" 13799451b44SJordan Rupprecht 13899451b44SJordan Rupprecht self.server.responder = MyResponder() 13999451b44SJordan Rupprecht if self.TraceOn(): 14099451b44SJordan Rupprecht self.runCmd("log enable gdb-remote packets") 14199451b44SJordan Rupprecht time.sleep(10) 14299451b44SJordan Rupprecht self.addTearDownHook( 14399451b44SJordan Rupprecht lambda: self.runCmd("log disable gdb-remote packets")) 14499451b44SJordan Rupprecht 14599451b44SJordan Rupprecht target = self.dbg.CreateTargetWithFileAndArch(None, None) 14699451b44SJordan Rupprecht 14799451b44SJordan Rupprecht process = self.connect(target) 14899451b44SJordan Rupprecht 14999451b44SJordan Rupprecht if self.TraceOn(): 15099451b44SJordan Rupprecht interp = self.dbg.GetCommandInterpreter() 15199451b44SJordan Rupprecht result = lldb.SBCommandReturnObject() 15299451b44SJordan Rupprecht interp.HandleCommand("target list", result) 15399451b44SJordan Rupprecht print(result.GetOutput()) 15499451b44SJordan Rupprecht 15599451b44SJordan Rupprecht rip_valobj = process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("rip") 15699451b44SJordan Rupprecht self.assertEqual(rip_valobj.GetValueAsUnsigned(), 0x00ffff800041120e) 15799451b44SJordan Rupprecht 15899451b44SJordan Rupprecht ss_valobj = process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("ss") 15999451b44SJordan Rupprecht self.assertEqual(ss_valobj.GetValueAsUnsigned(), 0x22222222) 16099451b44SJordan Rupprecht 16199451b44SJordan Rupprecht if self.TraceOn(): 16299451b44SJordan Rupprecht print("rip is 0x%x" % rip_valobj.GetValueAsUnsigned()) 16399451b44SJordan Rupprecht print("ss is 0x%x" % ss_valobj.GetValueAsUnsigned()) 164