brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.4 KiB · f9f2ba8 Raw
169 lines · python
1import lldb2import time3from lldbsuite.test.lldbtest import *4from lldbsuite.test.decorators import *5from lldbsuite.test.gdbclientutils import *6from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase7 8 9class TestRegDefinitionInParts(GDBRemoteTestBase):10    @skipIfXmlSupportMissing11    @skipIfRemote12    def test(self):13        """14        Test that lldb correctly fetches the target definition file15        in multiple chunks if the remote server only provides the16        content in small parts, and the small parts it provides is17        smaller than the maximum packet size that it declared at18        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 copyright41     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, False119 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