xref: /llvm-project/lldb/test/API/functionalities/gdb_remote_client/TestRegDefinitionInParts.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
199451b44SJordan Rupprechtimport lldb
299451b44SJordan Rupprechtimport time
399451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
499451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
533c0f93fSPavel Labathfrom lldbsuite.test.gdbclientutils import *
633c0f93fSPavel Labathfrom lldbsuite.test.lldbgdbclient import GDBRemoteTestBase
799451b44SJordan Rupprecht
899451b44SJordan Rupprecht
9*2238dcc3SJonas Devlieghereclass TestRegDefinitionInParts(GDBRemoteTestBase):
1099451b44SJordan Rupprecht    @skipIfXmlSupportMissing
1199451b44SJordan Rupprecht    @skipIfRemote
1299451b44SJordan Rupprecht    def test(self):
1399451b44SJordan Rupprecht        """
1499451b44SJordan Rupprecht        Test that lldb correctly fetches the target definition file
1599451b44SJordan Rupprecht        in multiple chunks if the remote server only provides the
1699451b44SJordan Rupprecht        content in small parts, and the small parts it provides is
1799451b44SJordan Rupprecht        smaller than the maximum packet size that it declared at
1899451b44SJordan Rupprecht        the start of the debug session.  qemu does this.
1999451b44SJordan Rupprecht        """
2099451b44SJordan Rupprecht
21*2238dcc3SJonas Devlieghere        class MyResponder(MockGDBServerResponder):
2299451b44SJordan Rupprecht            def qXferRead(self, obj, annex, offset, length):
2399451b44SJordan Rupprecht                if annex == "target.xml":
24*2238dcc3SJonas Devlieghere                    return (
25*2238dcc3SJonas Devlieghere                        """<?xml version="1.0"?>
2699451b44SJordan Rupprecht                              <!DOCTYPE feature SYSTEM "gdb-target.dtd">
2799451b44SJordan Rupprecht                              <target version="1.0">
2899451b44SJordan Rupprecht                              <architecture>i386:x86-64</architecture>
2999451b44SJordan Rupprecht                              <xi:include href="i386-64bit-core.xml"/>
30*2238dcc3SJonas Devlieghere                              </target>""",
31*2238dcc3SJonas Devlieghere                        False,
32*2238dcc3SJonas Devlieghere                    )
3399451b44SJordan Rupprecht
3499451b44SJordan Rupprecht                if annex == "i386-64bit-core.xml" and offset == 0:
35*2238dcc3SJonas Devlieghere                    return (
36*2238dcc3SJonas Devlieghere                        """<?xml version="1.0"?>
3799451b44SJordan Rupprecht<!-- Copyright (C) 2010-2015 Free Software Foundation, Inc.
3899451b44SJordan Rupprecht
3999451b44SJordan Rupprecht     Copying and distribution of this file, with or without modification,
4099451b44SJordan Rupprecht     are permitted in any medium without royalty provided the copyright
4199451b44SJordan Rupprecht     notice and this notice are preserved.  -->
4299451b44SJordan Rupprecht
4399451b44SJordan Rupprecht<!DOCTYPE feature SYSTEM "gdb-target.dtd">
4499451b44SJordan Rupprecht<feature name="org.gnu.gdb.i386.core">
4599451b44SJordan Rupprecht  <flags id="i386_eflags" size="4">
4699451b44SJordan Rupprecht    <field name="CF" start="0" end="0"/>
4799451b44SJordan Rupprecht    <field name="" start="1" end="1"/>
4899451b44SJordan Rupprecht    <field name="PF" start="2" end="2"/>
4999451b44SJordan Rupprecht    <field name="AF" start="4" end="4"/>
5099451b44SJordan Rupprecht    <field name="ZF" start="6" end="6"/>
5199451b44SJordan Rupprecht    <field name="SF" start="7" end="7"/>
5299451b44SJordan Rupprecht    <field name="TF" start="8" end="8"/>
5399451b44SJordan Rupprecht    <field name="IF" start="9" end="9"/>
5499451b44SJordan Rupprecht    <field name="DF" start="10" end="10"/>
5599451b44SJordan Rupprecht    <field name="OF" start="11" end="11"/>
5699451b44SJordan Rupprecht    <field name="NT" start="14" end="14"/>
5799451b44SJordan Rupprecht    <field name="RF" start="16" end="16"/>
5899451b44SJordan Rupprecht    <field name="VM" start="17" end="17"/>
5999451b44SJordan Rupprecht    <field name="AC" start="18" end="18"/>
6099451b44SJordan Rupprecht    <field name="VIF" start="19" end="19"/>
6199451b44SJordan Rupprecht    <field name="VIP" start="20" end="20"/>
6299451b44SJordan Rupprecht    <field name="ID" start="21" end="21"/>
6399451b44SJordan Rupprecht  </flags>
6499451b44SJordan Rupprecht
6599451b44SJordan Rupprecht  <reg name="rax" bitsize="64" type="int64"/>
6699451b44SJordan Rupprecht  <reg name="rbx" bitsize="64" type="int64"/>
6799451b44SJordan Rupprecht  <reg name="rcx" bitsize="64" type="int64"/>
6899451b44SJordan Rupprecht  <reg name="rdx" bitsize="64" type="int64"/>
6999451b44SJordan Rupprecht  <reg name="rsi" bitsize="64" type="int64"/>
7099451b44SJordan Rupprecht  <reg name="rdi" bitsize="64" type="int64"/>
7199451b44SJordan Rupprecht  <reg name="rbp" bitsize="64" type="data_ptr"/>
7299451b44SJordan Rupprecht  <reg name="rsp" bitsize="64" type="data_ptr"/>
7399451b44SJordan Rupprecht  <reg name="r8" bitsize="64" type="int64"/>
7499451b44SJordan Rupprecht  <reg name="r9" bitsize="64" type="int64"/>
7599451b44SJordan Rupprecht  <reg name="r10" bitsize="64" type="int64"/>
7699451b44SJordan Rupprecht  <reg name="r11" bitsize="64" type="int64"/>
7799451b44SJordan Rupprecht  <reg name="r12" bitsize="64" type="int64"/>
7899451b44SJordan Rupprecht  <reg name="r13" bitsize="64" type="int64"/>
7999451b44SJordan Rupprecht  <reg name="r14" bitsize="64" type="int64"/>
8099451b44SJordan Rupprecht  <reg name="r15" bitsize="64" type="int64"/>
8199451b44SJordan Rupprecht
8299451b44SJordan Rupprecht  <reg name="rip" bitsize="64" type="code_ptr"/>
8399451b44SJordan Rupprecht  <reg name="eflags" bitsize="32" type="i386_eflags"/>
8499451b44SJordan Rupprecht  <reg name="cs" bitsize="32" type="int32"/>
85*2238dcc3SJonas Devlieghere  <reg name="ss" bitsize="32" ty""",
86*2238dcc3SJonas Devlieghere                        True,
87*2238dcc3SJonas Devlieghere                    )
8899451b44SJordan Rupprecht
8999451b44SJordan Rupprecht                if annex == "i386-64bit-core.xml" and offset == 2045:
90*2238dcc3SJonas Devlieghere                    return (
91*2238dcc3SJonas Devlieghere                        """pe="int32"/>
9299451b44SJordan Rupprecht  <reg name="ds" bitsize="32" type="int32"/>
9399451b44SJordan Rupprecht  <reg name="es" bitsize="32" type="int32"/>
9499451b44SJordan Rupprecht  <reg name="fs" bitsize="32" type="int32"/>
9599451b44SJordan Rupprecht  <reg name="gs" bitsize="32" type="int32"/>
9699451b44SJordan Rupprecht
9799451b44SJordan Rupprecht  <reg name="st0" bitsize="80" type="i387_ext"/>
9899451b44SJordan Rupprecht  <reg name="st1" bitsize="80" type="i387_ext"/>
9999451b44SJordan Rupprecht  <reg name="st2" bitsize="80" type="i387_ext"/>
10099451b44SJordan Rupprecht  <reg name="st3" bitsize="80" type="i387_ext"/>
10199451b44SJordan Rupprecht  <reg name="st4" bitsize="80" type="i387_ext"/>
10299451b44SJordan Rupprecht  <reg name="st5" bitsize="80" type="i387_ext"/>
10399451b44SJordan Rupprecht  <reg name="st6" bitsize="80" type="i387_ext"/>
10499451b44SJordan Rupprecht  <reg name="st7" bitsize="80" type="i387_ext"/>
10599451b44SJordan Rupprecht
10699451b44SJordan Rupprecht  <reg name="fctrl" bitsize="32" type="int" group="float"/>
10799451b44SJordan Rupprecht  <reg name="fstat" bitsize="32" type="int" group="float"/>
10899451b44SJordan Rupprecht  <reg name="ftag" bitsize="32" type="int" group="float"/>
10999451b44SJordan Rupprecht  <reg name="fiseg" bitsize="32" type="int" group="float"/>
11099451b44SJordan Rupprecht  <reg name="fioff" bitsize="32" type="int" group="float"/>
11199451b44SJordan Rupprecht  <reg name="foseg" bitsize="32" type="int" group="float"/>
11299451b44SJordan Rupprecht  <reg name="fooff" bitsize="32" type="int" group="float"/>
11399451b44SJordan Rupprecht  <reg name="fop" bitsize="32" type="int" group="float"/>
114*2238dcc3SJonas Devlieghere</feature>""",
115*2238dcc3SJonas Devlieghere                        False,
116*2238dcc3SJonas Devlieghere                    )
11799451b44SJordan Rupprecht
11899451b44SJordan Rupprecht                return None, False
11999451b44SJordan Rupprecht
12099451b44SJordan Rupprecht            def readRegister(self, regnum):
12199451b44SJordan Rupprecht                return ""
12299451b44SJordan Rupprecht
12399451b44SJordan Rupprecht            def readRegisters(self):
12499451b44SJordan Rupprecht                return "0600000000000000c0b7c00080fffffff021c60080ffffff1a00000000000000020000000000000078b7c00080ffffff203f8ca090ffffff103f8ca090ffffff3025990a80ffffff809698000000000070009f0a80ffffff020000000000000000eae10080ffffff00000000000000001822d74f1a00000078b7c00080ffffff0e12410080ffff004602000011111111222222223333333300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801f0000"
12599451b44SJordan Rupprecht
12699451b44SJordan Rupprecht            def haltReason(self):
12799451b44SJordan Rupprecht                return "T02thread:dead;threads:dead;"
12899451b44SJordan Rupprecht
12999451b44SJordan Rupprecht            def qfThreadInfo(self):
13099451b44SJordan Rupprecht                return "mdead"
13199451b44SJordan Rupprecht
13299451b44SJordan Rupprecht            def qC(self):
13399451b44SJordan Rupprecht                return ""
13499451b44SJordan Rupprecht
13599451b44SJordan Rupprecht            def qSupported(self, client_supported):
13699451b44SJordan Rupprecht                return "PacketSize=1000;qXfer:features:read+"
13799451b44SJordan Rupprecht
13899451b44SJordan Rupprecht            def QThreadSuffixSupported(self):
13999451b44SJordan Rupprecht                return "OK"
14099451b44SJordan Rupprecht
14199451b44SJordan Rupprecht            def QListThreadsInStopReply(self):
14299451b44SJordan Rupprecht                return "OK"
14399451b44SJordan Rupprecht
14499451b44SJordan Rupprecht        self.server.responder = MyResponder()
14599451b44SJordan Rupprecht        if self.TraceOn():
14699451b44SJordan Rupprecht            self.runCmd("log enable gdb-remote packets")
14799451b44SJordan Rupprecht            time.sleep(10)
148*2238dcc3SJonas Devlieghere            self.addTearDownHook(lambda: self.runCmd("log disable gdb-remote packets"))
14999451b44SJordan Rupprecht
15099451b44SJordan Rupprecht        target = self.dbg.CreateTargetWithFileAndArch(None, None)
15199451b44SJordan Rupprecht
15299451b44SJordan Rupprecht        process = self.connect(target)
15399451b44SJordan Rupprecht
15499451b44SJordan Rupprecht        if self.TraceOn():
15599451b44SJordan Rupprecht            interp = self.dbg.GetCommandInterpreter()
15699451b44SJordan Rupprecht            result = lldb.SBCommandReturnObject()
15799451b44SJordan Rupprecht            interp.HandleCommand("target list", result)
15899451b44SJordan Rupprecht            print(result.GetOutput())
15999451b44SJordan Rupprecht
16099451b44SJordan Rupprecht        rip_valobj = process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("rip")
161*2238dcc3SJonas Devlieghere        self.assertEqual(rip_valobj.GetValueAsUnsigned(), 0x00FFFF800041120E)
16299451b44SJordan Rupprecht
16399451b44SJordan Rupprecht        ss_valobj = process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("ss")
16499451b44SJordan Rupprecht        self.assertEqual(ss_valobj.GetValueAsUnsigned(), 0x22222222)
16599451b44SJordan Rupprecht
16699451b44SJordan Rupprecht        if self.TraceOn():
16799451b44SJordan Rupprecht            print("rip is 0x%x" % rip_valobj.GetValueAsUnsigned())
16899451b44SJordan Rupprecht            print("ss is 0x%x" % ss_valobj.GetValueAsUnsigned())
169