153678317SMuhammad Omair Javaidfrom __future__ import print_function 253678317SMuhammad Omair Javaidimport lldb 353678317SMuhammad Omair Javaidfrom lldbsuite.test.lldbtest import * 453678317SMuhammad Omair Javaidfrom lldbsuite.test.decorators import * 5*33c0f93fSPavel Labathfrom lldbsuite.test.gdbclientutils import * 6*33c0f93fSPavel Labathfrom lldbsuite.test.lldbgdbclient import GDBRemoteTestBase 753678317SMuhammad Omair Javaid 853678317SMuhammad Omair Javaid 953678317SMuhammad Omair Javaidclass TestPartialGPacket(GDBRemoteTestBase): 1053678317SMuhammad Omair Javaid 1153678317SMuhammad Omair Javaid @skipIfXmlSupportMissing 1253678317SMuhammad Omair Javaid @skipIfRemote 1353678317SMuhammad Omair Javaid def test(self): 1453678317SMuhammad Omair Javaid """ 1553678317SMuhammad Omair Javaid Test GDB remote fallback to 'p' packet when 'g' packet does not include all registers. 1653678317SMuhammad Omair Javaid """ 1753678317SMuhammad Omair Javaid class MyResponder(MockGDBServerResponder): 1853678317SMuhammad Omair Javaid 1953678317SMuhammad Omair Javaid def qXferRead(self, obj, annex, offset, length): 2053678317SMuhammad Omair Javaid if annex == "target.xml": 2153678317SMuhammad Omair Javaid return """<?xml version="1.0"?> 2253678317SMuhammad Omair Javaid <!DOCTYPE feature SYSTEM "gdb-target.dtd"> 2353678317SMuhammad Omair Javaid <target> 2453678317SMuhammad Omair Javaid <architecture>arm</architecture> 2553678317SMuhammad Omair Javaid <feature name="org.gnu.gdb.arm.m-profile"> 2653678317SMuhammad Omair Javaid <reg name="r0" bitsize="32" type="uint32" group="general"/> 2753678317SMuhammad Omair Javaid <reg name="r1" bitsize="32" type="uint32" group="general"/> 2853678317SMuhammad Omair Javaid <reg name="r2" bitsize="32" type="uint32" group="general"/> 2953678317SMuhammad Omair Javaid <reg name="r3" bitsize="32" type="uint32" group="general"/> 3053678317SMuhammad Omair Javaid <reg name="r4" bitsize="32" type="uint32" group="general"/> 3153678317SMuhammad Omair Javaid <reg name="r5" bitsize="32" type="uint32" group="general"/> 3253678317SMuhammad Omair Javaid <reg name="r6" bitsize="32" type="uint32" group="general"/> 3353678317SMuhammad Omair Javaid <reg name="r7" bitsize="32" type="uint32" group="general"/> 3453678317SMuhammad Omair Javaid <reg name="r8" bitsize="32" type="uint32" group="general"/> 3553678317SMuhammad Omair Javaid <reg name="r9" bitsize="32" type="uint32" group="general"/> 3653678317SMuhammad Omair Javaid <reg name="r10" bitsize="32" type="uint32" group="general"/> 3753678317SMuhammad Omair Javaid <reg name="r11" bitsize="32" type="uint32" group="general"/> 3853678317SMuhammad Omair Javaid <reg name="r12" bitsize="32" type="uint32" group="general"/> 3953678317SMuhammad Omair Javaid <reg name="sp" bitsize="32" type="data_ptr" group="general"/> 4053678317SMuhammad Omair Javaid <reg name="lr" bitsize="32" type="uint32" group="general"/> 4153678317SMuhammad Omair Javaid <reg name="pc" bitsize="32" type="code_ptr" group="general"/> 4253678317SMuhammad Omair Javaid <reg name="xpsr" bitsize="32" regnum="25" type="uint32" group="general"/> 4353678317SMuhammad Omair Javaid <reg name="MSP" bitsize="32" regnum="26" type="uint32" group="general"/> 4453678317SMuhammad Omair Javaid <reg name="PSP" bitsize="32" regnum="27" type="uint32" group="general"/> 4553678317SMuhammad Omair Javaid <reg name="PRIMASK" bitsize="32" regnum="28" type="uint32" group="general"/> 4653678317SMuhammad Omair Javaid <reg name="BASEPRI" bitsize="32" regnum="29" type="uint32" group="general"/> 4753678317SMuhammad Omair Javaid <reg name="FAULTMASK" bitsize="32" regnum="30" type="uint32" group="general"/> 4853678317SMuhammad Omair Javaid <reg name="CONTROL" bitsize="32" regnum="31" type="uint32" group="general"/> 4953678317SMuhammad Omair Javaid </feature> 5053678317SMuhammad Omair Javaid </target>""", False 5153678317SMuhammad Omair Javaid else: 5253678317SMuhammad Omair Javaid return None, False 5353678317SMuhammad Omair Javaid 5453678317SMuhammad Omair Javaid def readRegister(self, regnum): 5553678317SMuhammad Omair Javaid if regnum == 31: 5653678317SMuhammad Omair Javaid return "cdcc8c3f00000000" 5753678317SMuhammad Omair Javaid return "E01" 5853678317SMuhammad Omair Javaid 5953678317SMuhammad Omair Javaid def readRegisters(self): 6053678317SMuhammad Omair Javaid return "20000000f8360020001000002fcb0008f8360020a0360020200c0020000000000000000000000000000000000000000000000000b87f0120b7d100082ed2000800000001" 6153678317SMuhammad Omair Javaid 6253678317SMuhammad Omair Javaid def haltReason(self): 6353678317SMuhammad Omair Javaid return "S05" 6453678317SMuhammad Omair Javaid 6553678317SMuhammad Omair Javaid def qfThreadInfo(self): 6653678317SMuhammad Omair Javaid return "mdead" 6753678317SMuhammad Omair Javaid 6853678317SMuhammad Omair Javaid def qC(self): 6953678317SMuhammad Omair Javaid return "" 7053678317SMuhammad Omair Javaid 7153678317SMuhammad Omair Javaid def qSupported(self, client_supported): 7253678317SMuhammad Omair Javaid return "PacketSize=4000;qXfer:memory-map:read-;QStartNoAckMode+;qXfer:threads:read+;hwbreak+;qXfer:features:read+" 7353678317SMuhammad Omair Javaid 7453678317SMuhammad Omair Javaid def QThreadSuffixSupported(self): 7553678317SMuhammad Omair Javaid return "OK" 7653678317SMuhammad Omair Javaid 7753678317SMuhammad Omair Javaid def QListThreadsInStopReply(self): 7853678317SMuhammad Omair Javaid return "OK" 7953678317SMuhammad Omair Javaid 8053678317SMuhammad Omair Javaid self.server.responder = MyResponder() 8153678317SMuhammad Omair Javaid if self.TraceOn(): 8253678317SMuhammad Omair Javaid self.runCmd("log enable gdb-remote packets") 8353678317SMuhammad Omair Javaid self.addTearDownHook( 8453678317SMuhammad Omair Javaid lambda: self.runCmd("log disable gdb-remote packets")) 8553678317SMuhammad Omair Javaid 8653678317SMuhammad Omair Javaid self.dbg.SetDefaultArchitecture("armv7em") 8753678317SMuhammad Omair Javaid target = self.dbg.CreateTargetWithFileAndArch(None, None) 8853678317SMuhammad Omair Javaid 8953678317SMuhammad Omair Javaid process = self.connect(target) 9053678317SMuhammad Omair Javaid 9153678317SMuhammad Omair Javaid if self.TraceOn(): 9253678317SMuhammad Omair Javaid interp = self.dbg.GetCommandInterpreter() 9353678317SMuhammad Omair Javaid result = lldb.SBCommandReturnObject() 9453678317SMuhammad Omair Javaid interp.HandleCommand("target list", result) 9553678317SMuhammad Omair Javaid print(result.GetOutput()) 9653678317SMuhammad Omair Javaid 9753678317SMuhammad Omair Javaid r0_valobj = process.GetThreadAtIndex( 9853678317SMuhammad Omair Javaid 0).GetFrameAtIndex(0).FindRegister("r0") 9953678317SMuhammad Omair Javaid self.assertEqual(r0_valobj.GetValueAsUnsigned(), 0x20) 10053678317SMuhammad Omair Javaid 10153678317SMuhammad Omair Javaid pc_valobj = process.GetThreadAtIndex( 10253678317SMuhammad Omair Javaid 0).GetFrameAtIndex(0).FindRegister("pc") 10353678317SMuhammad Omair Javaid self.assertEqual(pc_valobj.GetValueAsUnsigned(), 0x0800d22e) 10453678317SMuhammad Omair Javaid 10553678317SMuhammad Omair Javaid pc_valobj = process.GetThreadAtIndex( 10653678317SMuhammad Omair Javaid 0).GetFrameAtIndex(0).FindRegister("CONTROL") 10753678317SMuhammad Omair Javaid self.assertEqual(pc_valobj.GetValueAsUnsigned(), 0x3f8ccccd) 108