brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.3 KiB · 84ba7ba Raw
102 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 8# This test case is testing three things:9#10#  1. three register values will be provided in the ? stop packet (T11) -11#     registers 0 ("rax"), 1 ("rbx"), and 3 ("rip")12#  2. ReadRegister packet will provide the value of register 2 ("rsi")13#  3. The "g" read-all-registers packet is not supported; p must be used14#     to get the value of register 2 ("rsi")15#16# Forcing lldb to use the expedited registers in the stop packet and17# marking it an error to request that register value is to prevent18# performance regressions.19#20# Some gdb RSP stubs only implement p/P, they do not support g/G.21# lldb must be able to work with either.22 23 24class TestNoGPacketSupported(GDBRemoteTestBase):25    @skipIfXmlSupportMissing26    def test(self):27        class MyResponder(MockGDBServerResponder):28            def haltReason(self):29                return "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;00:7882773ce0ffffff;01:1122334455667788;03:00bc010001000000;"30 31            def threadStopInfo(self, threadnum):32                return "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;00:7882773ce0ffffff;01:1122334455667788;03:00bc010001000000;"33 34            def writeRegisters(self):35                return "E02"36 37            def readRegisters(self):38                return "E01"39 40            def readRegister(self, regnum):41                # lldb will try sending "p0" to see if the p packet is supported,42                # give a bogus value; in theory lldb could use this value in the43                # register context and that would be valid behavior.44 45                # notably, don't give values for registers 1 & 3 -- lldb should46                # get those from the ? stop packet ("T11") and it is a pref regression47                # if lldb is asking for these register values.48                if regnum == 0:49                    return "5555555555555555"50                if regnum == 2:51                    return "c04825ebfe7f0000"  # 0x00007ffeeb2548c052 53                return "E03"54 55            def writeRegister(self, regnum):56                return "OK"57 58            def qXferRead(self, obj, annex, offset, length):59                if annex == "target.xml":60                    return (61                        """<?xml version="1.0"?>62                        <target version="1.0">63                          <architecture>i386:x86-64</architecture>64                          <feature name="org.gnu.gdb.i386.core">65                            <reg name="rax" bitsize="64" regnum="0" type="code_ptr" group="general"/>66                            <reg name="rbx" bitsize="64" regnum="1" type="code_ptr" group="general"/>67                            <reg name="rsi" bitsize="64" regnum="2" type="code_ptr" group="general"/>68                            <reg name="rip" bitsize="64" regnum="3" type="code_ptr" group="general" altname="pc" generic="pc"/>69                          </feature>70                        </target>""",71                        False,72                    )73                else:74                    return None, False75 76        self.server.responder = MyResponder()77        target = self.dbg.CreateTarget("")78        if self.TraceOn():79            self.runCmd("log enable gdb-remote packets")80            self.addTearDownHook(lambda: self.runCmd("log disable gdb-remote packets"))81        process = self.connect(target)82 83        thread = process.GetThreadAtIndex(0)84        frame = thread.GetFrameAtIndex(0)85        rax = frame.FindRegister("rax").GetValueAsUnsigned()86        rbx = frame.FindRegister("rbx").GetValueAsUnsigned()87        rsi = frame.FindRegister("rsi").GetValueAsUnsigned()88        pc = frame.GetPC()89        rip = frame.FindRegister("rip").GetValueAsUnsigned()90 91        if self.TraceOn():92            print(93                "Register values: rax == 0x%x, rbx == 0x%x, rsi == 0x%x, pc == 0x%x, rip == 0x%x"94                % (rax, rbx, rsi, pc, rip)95            )96 97        self.assertEqual(rax, 0xFFFFFFE03C778278)98        self.assertEqual(rbx, 0x8877665544332211)99        self.assertEqual(rsi, 0x00007FFEEB2548C0)100        self.assertEqual(pc, 0x10001BC00)101        self.assertEqual(rip, 0x10001BC00)102