153678317SMuhammad Omair Javaidimport lldb 253678317SMuhammad Omair Javaidfrom lldbsuite.test.lldbtest import * 353678317SMuhammad Omair Javaidfrom lldbsuite.test.decorators import * 433c0f93fSPavel Labathfrom lldbsuite.test.gdbclientutils import * 533c0f93fSPavel Labathfrom lldbsuite.test.lldbgdbclient import GDBRemoteTestBase 653678317SMuhammad Omair Javaid 753678317SMuhammad Omair Javaid 853678317SMuhammad Omair Javaidclass TestPartialGPacket(GDBRemoteTestBase): 953678317SMuhammad Omair Javaid @skipIfXmlSupportMissing 1053678317SMuhammad Omair Javaid @skipIfRemote 1153678317SMuhammad Omair Javaid def test(self): 1253678317SMuhammad Omair Javaid """ 1353678317SMuhammad Omair Javaid Test GDB remote fallback to 'p' packet when 'g' packet does not include all registers. 1453678317SMuhammad Omair Javaid """ 1553678317SMuhammad Omair Javaid 16*2238dcc3SJonas Devlieghere class MyResponder(MockGDBServerResponder): 1753678317SMuhammad Omair Javaid def qXferRead(self, obj, annex, offset, length): 1853678317SMuhammad Omair Javaid if annex == "target.xml": 19*2238dcc3SJonas Devlieghere return ( 20*2238dcc3SJonas Devlieghere """<?xml version="1.0"?> 2153678317SMuhammad Omair Javaid <!DOCTYPE feature SYSTEM "gdb-target.dtd"> 2253678317SMuhammad Omair Javaid <target> 2353678317SMuhammad Omair Javaid <architecture>arm</architecture> 2453678317SMuhammad Omair Javaid <feature name="org.gnu.gdb.arm.m-profile"> 2553678317SMuhammad Omair Javaid <reg name="r0" bitsize="32" type="uint32" group="general"/> 2653678317SMuhammad Omair Javaid <reg name="r1" bitsize="32" type="uint32" group="general"/> 2753678317SMuhammad Omair Javaid <reg name="r2" bitsize="32" type="uint32" group="general"/> 2853678317SMuhammad Omair Javaid <reg name="r3" bitsize="32" type="uint32" group="general"/> 2953678317SMuhammad Omair Javaid <reg name="r4" bitsize="32" type="uint32" group="general"/> 3053678317SMuhammad Omair Javaid <reg name="r5" bitsize="32" type="uint32" group="general"/> 3153678317SMuhammad Omair Javaid <reg name="r6" bitsize="32" type="uint32" group="general"/> 3253678317SMuhammad Omair Javaid <reg name="r7" bitsize="32" type="uint32" group="general"/> 3353678317SMuhammad Omair Javaid <reg name="r8" bitsize="32" type="uint32" group="general"/> 3453678317SMuhammad Omair Javaid <reg name="r9" bitsize="32" type="uint32" group="general"/> 3553678317SMuhammad Omair Javaid <reg name="r10" bitsize="32" type="uint32" group="general"/> 3653678317SMuhammad Omair Javaid <reg name="r11" bitsize="32" type="uint32" group="general"/> 3753678317SMuhammad Omair Javaid <reg name="r12" bitsize="32" type="uint32" group="general"/> 3853678317SMuhammad Omair Javaid <reg name="sp" bitsize="32" type="data_ptr" group="general"/> 3953678317SMuhammad Omair Javaid <reg name="lr" bitsize="32" type="uint32" group="general"/> 4053678317SMuhammad Omair Javaid <reg name="pc" bitsize="32" type="code_ptr" group="general"/> 4153678317SMuhammad Omair Javaid <reg name="xpsr" bitsize="32" regnum="25" type="uint32" group="general"/> 4253678317SMuhammad Omair Javaid <reg name="MSP" bitsize="32" regnum="26" type="uint32" group="general"/> 4353678317SMuhammad Omair Javaid <reg name="PSP" bitsize="32" regnum="27" type="uint32" group="general"/> 4453678317SMuhammad Omair Javaid <reg name="PRIMASK" bitsize="32" regnum="28" type="uint32" group="general"/> 4553678317SMuhammad Omair Javaid <reg name="BASEPRI" bitsize="32" regnum="29" type="uint32" group="general"/> 4653678317SMuhammad Omair Javaid <reg name="FAULTMASK" bitsize="32" regnum="30" type="uint32" group="general"/> 4753678317SMuhammad Omair Javaid <reg name="CONTROL" bitsize="32" regnum="31" type="uint32" group="general"/> 4853678317SMuhammad Omair Javaid </feature> 49*2238dcc3SJonas Devlieghere </target>""", 50*2238dcc3SJonas Devlieghere False, 51*2238dcc3SJonas Devlieghere ) 5253678317SMuhammad Omair Javaid else: 5353678317SMuhammad Omair Javaid return None, False 5453678317SMuhammad Omair Javaid 5553678317SMuhammad Omair Javaid def readRegister(self, regnum): 5653678317SMuhammad Omair Javaid if regnum == 31: 5753678317SMuhammad Omair Javaid return "cdcc8c3f00000000" 5853678317SMuhammad Omair Javaid return "E01" 5953678317SMuhammad Omair Javaid 6053678317SMuhammad Omair Javaid def readRegisters(self): 6153678317SMuhammad Omair Javaid return "20000000f8360020001000002fcb0008f8360020a0360020200c0020000000000000000000000000000000000000000000000000b87f0120b7d100082ed2000800000001" 6253678317SMuhammad Omair Javaid 6353678317SMuhammad Omair Javaid def haltReason(self): 6453678317SMuhammad Omair Javaid return "S05" 6553678317SMuhammad Omair Javaid 6653678317SMuhammad Omair Javaid def qfThreadInfo(self): 6753678317SMuhammad Omair Javaid return "mdead" 6853678317SMuhammad Omair Javaid 6953678317SMuhammad Omair Javaid def qC(self): 7053678317SMuhammad Omair Javaid return "" 7153678317SMuhammad Omair Javaid 7253678317SMuhammad Omair Javaid def qSupported(self, client_supported): 7353678317SMuhammad Omair Javaid return "PacketSize=4000;qXfer:memory-map:read-;QStartNoAckMode+;qXfer:threads:read+;hwbreak+;qXfer:features:read+" 7453678317SMuhammad Omair Javaid 7553678317SMuhammad Omair Javaid def QThreadSuffixSupported(self): 7653678317SMuhammad Omair Javaid return "OK" 7753678317SMuhammad Omair Javaid 7853678317SMuhammad Omair Javaid def QListThreadsInStopReply(self): 7953678317SMuhammad Omair Javaid return "OK" 8053678317SMuhammad Omair Javaid 8153678317SMuhammad Omair Javaid self.server.responder = MyResponder() 8253678317SMuhammad Omair Javaid if self.TraceOn(): 8353678317SMuhammad Omair Javaid self.runCmd("log enable gdb-remote packets") 84*2238dcc3SJonas Devlieghere self.addTearDownHook(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 97*2238dcc3SJonas Devlieghere r0_valobj = process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("r0") 9853678317SMuhammad Omair Javaid self.assertEqual(r0_valobj.GetValueAsUnsigned(), 0x20) 9953678317SMuhammad Omair Javaid 100*2238dcc3SJonas Devlieghere pc_valobj = process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("pc") 101*2238dcc3SJonas Devlieghere self.assertEqual(pc_valobj.GetValueAsUnsigned(), 0x0800D22E) 10253678317SMuhammad Omair Javaid 103*2238dcc3SJonas Devlieghere pc_valobj = ( 104*2238dcc3SJonas Devlieghere process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("CONTROL") 105*2238dcc3SJonas Devlieghere ) 106*2238dcc3SJonas Devlieghere self.assertEqual(pc_valobj.GetValueAsUnsigned(), 0x3F8CCCCD) 107