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