brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.0 KiB · 84301f5 Raw
107 lines · python
1import lldb2from lldbsuite.test.lldbtest import *3from lldbsuite.test.decorators import *4from lldbsuite.test.gdbclientutils import *5from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase6 7 8class TestPartialGPacket(GDBRemoteTestBase):9    @skipIfXmlSupportMissing10    @skipIfRemote11    def test(self):12        """13        Test GDB remote fallback to 'p' packet when 'g' packet does not include all registers.14        """15 16        class MyResponder(MockGDBServerResponder):17            def qXferRead(self, obj, annex, offset, length):18                if annex == "target.xml":19                    return (20                        """<?xml version="1.0"?>21                        <!DOCTYPE feature SYSTEM "gdb-target.dtd">22                        <target>23                        <architecture>arm</architecture>24                        <feature name="org.gnu.gdb.arm.m-profile">25                        <reg name="r0" bitsize="32" type="uint32" group="general"/>26                        <reg name="r1" bitsize="32" type="uint32" group="general"/>27                        <reg name="r2" bitsize="32" type="uint32" group="general"/>28                        <reg name="r3" bitsize="32" type="uint32" group="general"/>29                        <reg name="r4" bitsize="32" type="uint32" group="general"/>30                        <reg name="r5" bitsize="32" type="uint32" group="general"/>31                        <reg name="r6" bitsize="32" type="uint32" group="general"/>32                        <reg name="r7" bitsize="32" type="uint32" group="general"/>33                        <reg name="r8" bitsize="32" type="uint32" group="general"/>34                        <reg name="r9" bitsize="32" type="uint32" group="general"/>35                        <reg name="r10" bitsize="32" type="uint32" group="general"/>36                        <reg name="r11" bitsize="32" type="uint32" group="general"/>37                        <reg name="r12" bitsize="32" type="uint32" group="general"/>38                        <reg name="sp" bitsize="32" type="data_ptr" group="general"/>39                        <reg name="lr" bitsize="32" type="uint32" group="general"/>40                        <reg name="pc" bitsize="32" type="code_ptr" group="general"/>41                        <reg name="xpsr" bitsize="32" regnum="25" type="uint32" group="general"/>42                        <reg name="MSP" bitsize="32" regnum="26" type="uint32" group="general"/>43                        <reg name="PSP" bitsize="32" regnum="27" type="uint32" group="general"/>44                        <reg name="PRIMASK" bitsize="32" regnum="28" type="uint32" group="general"/>45                        <reg name="BASEPRI" bitsize="32" regnum="29" type="uint32" group="general"/>46                        <reg name="FAULTMASK" bitsize="32" regnum="30" type="uint32" group="general"/>47                        <reg name="CONTROL" bitsize="32" regnum="31" type="uint32" group="general"/>48                        </feature>49                        </target>""",50                        False,51                    )52                else:53                    return None, False54 55            def readRegister(self, regnum):56                if regnum == 31:57                    return "cdcc8c3f00000000"58                return "E01"59 60            def readRegisters(self):61                return "20000000f8360020001000002fcb0008f8360020a0360020200c0020000000000000000000000000000000000000000000000000b87f0120b7d100082ed2000800000001"62 63            def haltReason(self):64                return "S05"65 66            def qfThreadInfo(self):67                return "mdead"68 69            def qC(self):70                return ""71 72            def qSupported(self, client_supported):73                return "PacketSize=4000;qXfer:memory-map:read-;QStartNoAckMode+;qXfer:threads:read+;hwbreak+;qXfer:features:read+"74 75            def QThreadSuffixSupported(self):76                return "OK"77 78            def QListThreadsInStopReply(self):79                return "OK"80 81        self.server.responder = MyResponder()82        if self.TraceOn():83            self.runCmd("log enable gdb-remote packets")84            self.addTearDownHook(lambda: self.runCmd("log disable gdb-remote packets"))85 86        self.dbg.SetDefaultArchitecture("armv7em")87        target = self.dbg.CreateTargetWithFileAndArch(None, None)88 89        process = self.connect(target)90 91        if self.TraceOn():92            interp = self.dbg.GetCommandInterpreter()93            result = lldb.SBCommandReturnObject()94            interp.HandleCommand("target list", result)95            print(result.GetOutput())96 97        r0_valobj = process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("r0")98        self.assertEqual(r0_valobj.GetValueAsUnsigned(), 0x20)99 100        pc_valobj = process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("pc")101        self.assertEqual(pc_valobj.GetValueAsUnsigned(), 0x0800D22E)102 103        pc_valobj = (104            process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("CONTROL")105        )106        self.assertEqual(pc_valobj.GetValueAsUnsigned(), 0x3F8CCCCD)107