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