xref: /llvm-project/lldb/test/API/functionalities/gdb_remote_client/TestRegDefinitionInParts.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
1import lldb
2import time
3from lldbsuite.test.lldbtest import *
4from lldbsuite.test.decorators import *
5from lldbsuite.test.gdbclientutils import *
6from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase
7
8
9class TestRegDefinitionInParts(GDBRemoteTestBase):
10    @skipIfXmlSupportMissing
11    @skipIfRemote
12    def test(self):
13        """
14        Test that lldb correctly fetches the target definition file
15        in multiple chunks if the remote server only provides the
16        content in small parts, and the small parts it provides is
17        smaller than the maximum packet size that it declared at
18        the start of the debug session.  qemu does this.
19        """
20
21        class MyResponder(MockGDBServerResponder):
22            def qXferRead(self, obj, annex, offset, length):
23                if annex == "target.xml":
24                    return (
25                        """<?xml version="1.0"?>
26                              <!DOCTYPE feature SYSTEM "gdb-target.dtd">
27                              <target version="1.0">
28                              <architecture>i386:x86-64</architecture>
29                              <xi:include href="i386-64bit-core.xml"/>
30                              </target>""",
31                        False,
32                    )
33
34                if annex == "i386-64bit-core.xml" and offset == 0:
35                    return (
36                        """<?xml version="1.0"?>
37<!-- Copyright (C) 2010-2015 Free Software Foundation, Inc.
38
39     Copying and distribution of this file, with or without modification,
40     are permitted in any medium without royalty provided the copyright
41     notice and this notice are preserved.  -->
42
43<!DOCTYPE feature SYSTEM "gdb-target.dtd">
44<feature name="org.gnu.gdb.i386.core">
45  <flags id="i386_eflags" size="4">
46    <field name="CF" start="0" end="0"/>
47    <field name="" start="1" end="1"/>
48    <field name="PF" start="2" end="2"/>
49    <field name="AF" start="4" end="4"/>
50    <field name="ZF" start="6" end="6"/>
51    <field name="SF" start="7" end="7"/>
52    <field name="TF" start="8" end="8"/>
53    <field name="IF" start="9" end="9"/>
54    <field name="DF" start="10" end="10"/>
55    <field name="OF" start="11" end="11"/>
56    <field name="NT" start="14" end="14"/>
57    <field name="RF" start="16" end="16"/>
58    <field name="VM" start="17" end="17"/>
59    <field name="AC" start="18" end="18"/>
60    <field name="VIF" start="19" end="19"/>
61    <field name="VIP" start="20" end="20"/>
62    <field name="ID" start="21" end="21"/>
63  </flags>
64
65  <reg name="rax" bitsize="64" type="int64"/>
66  <reg name="rbx" bitsize="64" type="int64"/>
67  <reg name="rcx" bitsize="64" type="int64"/>
68  <reg name="rdx" bitsize="64" type="int64"/>
69  <reg name="rsi" bitsize="64" type="int64"/>
70  <reg name="rdi" bitsize="64" type="int64"/>
71  <reg name="rbp" bitsize="64" type="data_ptr"/>
72  <reg name="rsp" bitsize="64" type="data_ptr"/>
73  <reg name="r8" bitsize="64" type="int64"/>
74  <reg name="r9" bitsize="64" type="int64"/>
75  <reg name="r10" bitsize="64" type="int64"/>
76  <reg name="r11" bitsize="64" type="int64"/>
77  <reg name="r12" bitsize="64" type="int64"/>
78  <reg name="r13" bitsize="64" type="int64"/>
79  <reg name="r14" bitsize="64" type="int64"/>
80  <reg name="r15" bitsize="64" type="int64"/>
81
82  <reg name="rip" bitsize="64" type="code_ptr"/>
83  <reg name="eflags" bitsize="32" type="i386_eflags"/>
84  <reg name="cs" bitsize="32" type="int32"/>
85  <reg name="ss" bitsize="32" ty""",
86                        True,
87                    )
88
89                if annex == "i386-64bit-core.xml" and offset == 2045:
90                    return (
91                        """pe="int32"/>
92  <reg name="ds" bitsize="32" type="int32"/>
93  <reg name="es" bitsize="32" type="int32"/>
94  <reg name="fs" bitsize="32" type="int32"/>
95  <reg name="gs" bitsize="32" type="int32"/>
96
97  <reg name="st0" bitsize="80" type="i387_ext"/>
98  <reg name="st1" bitsize="80" type="i387_ext"/>
99  <reg name="st2" bitsize="80" type="i387_ext"/>
100  <reg name="st3" bitsize="80" type="i387_ext"/>
101  <reg name="st4" bitsize="80" type="i387_ext"/>
102  <reg name="st5" bitsize="80" type="i387_ext"/>
103  <reg name="st6" bitsize="80" type="i387_ext"/>
104  <reg name="st7" bitsize="80" type="i387_ext"/>
105
106  <reg name="fctrl" bitsize="32" type="int" group="float"/>
107  <reg name="fstat" bitsize="32" type="int" group="float"/>
108  <reg name="ftag" bitsize="32" type="int" group="float"/>
109  <reg name="fiseg" bitsize="32" type="int" group="float"/>
110  <reg name="fioff" bitsize="32" type="int" group="float"/>
111  <reg name="foseg" bitsize="32" type="int" group="float"/>
112  <reg name="fooff" bitsize="32" type="int" group="float"/>
113  <reg name="fop" bitsize="32" type="int" group="float"/>
114</feature>""",
115                        False,
116                    )
117
118                return None, False
119
120            def readRegister(self, regnum):
121                return ""
122
123            def readRegisters(self):
124                return "0600000000000000c0b7c00080fffffff021c60080ffffff1a00000000000000020000000000000078b7c00080ffffff203f8ca090ffffff103f8ca090ffffff3025990a80ffffff809698000000000070009f0a80ffffff020000000000000000eae10080ffffff00000000000000001822d74f1a00000078b7c00080ffffff0e12410080ffff004602000011111111222222223333333300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801f0000"
125
126            def haltReason(self):
127                return "T02thread:dead;threads:dead;"
128
129            def qfThreadInfo(self):
130                return "mdead"
131
132            def qC(self):
133                return ""
134
135            def qSupported(self, client_supported):
136                return "PacketSize=1000;qXfer:features:read+"
137
138            def QThreadSuffixSupported(self):
139                return "OK"
140
141            def QListThreadsInStopReply(self):
142                return "OK"
143
144        self.server.responder = MyResponder()
145        if self.TraceOn():
146            self.runCmd("log enable gdb-remote packets")
147            time.sleep(10)
148            self.addTearDownHook(lambda: self.runCmd("log disable gdb-remote packets"))
149
150        target = self.dbg.CreateTargetWithFileAndArch(None, None)
151
152        process = self.connect(target)
153
154        if self.TraceOn():
155            interp = self.dbg.GetCommandInterpreter()
156            result = lldb.SBCommandReturnObject()
157            interp.HandleCommand("target list", result)
158            print(result.GetOutput())
159
160        rip_valobj = process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("rip")
161        self.assertEqual(rip_valobj.GetValueAsUnsigned(), 0x00FFFF800041120E)
162
163        ss_valobj = process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("ss")
164        self.assertEqual(ss_valobj.GetValueAsUnsigned(), 0x22222222)
165
166        if self.TraceOn():
167            print("rip is 0x%x" % rip_valobj.GetValueAsUnsigned())
168            print("ss is 0x%x" % ss_valobj.GetValueAsUnsigned())
169