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