xref: /llvm-project/lldb/test/API/functionalities/gdb_remote_client/TestPartialGPacket.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
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