199451b44SJordan Rupprechtfrom __future__ import print_function 299451b44SJordan Rupprechtimport lldb 399451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 499451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 5*33c0f93fSPavel Labathfrom lldbsuite.test.gdbclientutils import * 6*33c0f93fSPavel Labathfrom lldbsuite.test.lldbgdbclient import GDBRemoteTestBase 799451b44SJordan Rupprecht 899451b44SJordan Rupprechtclass TestNestedRegDefinitions(GDBRemoteTestBase): 999451b44SJordan Rupprecht 1099451b44SJordan Rupprecht @skipIfXmlSupportMissing 1199451b44SJordan Rupprecht @skipIfRemote 1299451b44SJordan Rupprecht def test(self): 1399451b44SJordan Rupprecht """ 1499451b44SJordan Rupprecht Test lldb's parsing of the <architecture> tag in the target.xml register 1599451b44SJordan Rupprecht description packet. 1699451b44SJordan Rupprecht """ 1799451b44SJordan Rupprecht class MyResponder(MockGDBServerResponder): 1899451b44SJordan Rupprecht 1999451b44SJordan Rupprecht def qXferRead(self, obj, annex, offset, length): 2099451b44SJordan Rupprecht if annex == "target.xml": 2199451b44SJordan Rupprecht return """<?xml version="1.0"?><!DOCTYPE target SYSTEM "gdb-target.dtd"><target><architecture>i386:x86-64</architecture><xi:include href="i386-64bit.xml"/></target>""", False 2299451b44SJordan Rupprecht 2399451b44SJordan Rupprecht if annex == "i386-64bit.xml": 2499451b44SJordan Rupprecht return """<?xml version="1.0"?> 2599451b44SJordan Rupprecht<!-- Copyright (C) 2010-2017 Free Software Foundation, Inc. 2699451b44SJordan Rupprecht 2799451b44SJordan Rupprecht Copying and distribution of this file, with or without modification, 2899451b44SJordan Rupprecht are permitted in any medium without royalty provided the copyright 2999451b44SJordan Rupprecht notice and this notice are preserved. --> 3099451b44SJordan Rupprecht 3199451b44SJordan Rupprecht<!-- I386 64bit --> 3299451b44SJordan Rupprecht 3399451b44SJordan Rupprecht<!DOCTYPE target SYSTEM "gdb-target.dtd"> 3499451b44SJordan Rupprecht<feature name="org.gnu.gdb.i386.64bit"> 3599451b44SJordan Rupprecht <xi:include href="i386-64bit-core.xml"/> 3699451b44SJordan Rupprecht <xi:include href="i386-64bit-sse.xml"/> 3799451b44SJordan Rupprecht</feature>""", False 3899451b44SJordan Rupprecht 3999451b44SJordan Rupprecht if annex == "i386-64bit-core.xml": 4099451b44SJordan Rupprecht return """<?xml version="1.0"?> 4199451b44SJordan Rupprecht<!-- Copyright (C) 2010-2015 Free Software Foundation, Inc. 4299451b44SJordan Rupprecht 4399451b44SJordan Rupprecht Copying and distribution of this file, with or without modification, 4499451b44SJordan Rupprecht are permitted in any medium without royalty provided the copyright 4599451b44SJordan Rupprecht notice and this notice are preserved. --> 4699451b44SJordan Rupprecht 4799451b44SJordan Rupprecht<!DOCTYPE feature SYSTEM "gdb-target.dtd"> 4899451b44SJordan Rupprecht<feature name="org.gnu.gdb.i386.core"> 4999451b44SJordan Rupprecht <flags id="i386_eflags" size="4"> 5099451b44SJordan Rupprecht <field name="CF" start="0" end="0"/> 5199451b44SJordan Rupprecht <field name="" start="1" end="1"/> 5299451b44SJordan Rupprecht <field name="PF" start="2" end="2"/> 5399451b44SJordan Rupprecht <field name="AF" start="4" end="4"/> 5499451b44SJordan Rupprecht <field name="ZF" start="6" end="6"/> 5599451b44SJordan Rupprecht <field name="SF" start="7" end="7"/> 5699451b44SJordan Rupprecht <field name="TF" start="8" end="8"/> 5799451b44SJordan Rupprecht <field name="IF" start="9" end="9"/> 5899451b44SJordan Rupprecht <field name="DF" start="10" end="10"/> 5999451b44SJordan Rupprecht <field name="OF" start="11" end="11"/> 6099451b44SJordan Rupprecht <field name="NT" start="14" end="14"/> 6199451b44SJordan Rupprecht <field name="RF" start="16" end="16"/> 6299451b44SJordan Rupprecht <field name="VM" start="17" end="17"/> 6399451b44SJordan Rupprecht <field name="AC" start="18" end="18"/> 6499451b44SJordan Rupprecht <field name="VIF" start="19" end="19"/> 6599451b44SJordan Rupprecht <field name="VIP" start="20" end="20"/> 6699451b44SJordan Rupprecht <field name="ID" start="21" end="21"/> 6799451b44SJordan Rupprecht </flags> 6899451b44SJordan Rupprecht 6999451b44SJordan Rupprecht <reg name="rax" bitsize="64" type="int64"/> 7099451b44SJordan Rupprecht <reg name="rbx" bitsize="64" type="int64"/> 7199451b44SJordan Rupprecht <reg name="rcx" bitsize="64" type="int64"/> 7299451b44SJordan Rupprecht <reg name="rdx" bitsize="64" type="int64"/> 7399451b44SJordan Rupprecht <reg name="rsi" bitsize="64" type="int64"/> 7499451b44SJordan Rupprecht <reg name="rdi" bitsize="64" type="int64"/> 7599451b44SJordan Rupprecht <reg name="rbp" bitsize="64" type="data_ptr"/> 7699451b44SJordan Rupprecht <reg name="rsp" bitsize="64" type="data_ptr"/> 7799451b44SJordan Rupprecht <reg name="r8" bitsize="64" type="int64"/> 7899451b44SJordan Rupprecht <reg name="r9" bitsize="64" type="int64"/> 7999451b44SJordan Rupprecht <reg name="r10" bitsize="64" type="int64"/> 8099451b44SJordan Rupprecht <reg name="r11" bitsize="64" type="int64"/> 8199451b44SJordan Rupprecht <reg name="r12" bitsize="64" type="int64"/> 8299451b44SJordan Rupprecht <reg name="r13" bitsize="64" type="int64"/> 8399451b44SJordan Rupprecht <reg name="r14" bitsize="64" type="int64"/> 8499451b44SJordan Rupprecht <reg name="r15" bitsize="64" type="int64"/> 8599451b44SJordan Rupprecht 8699451b44SJordan Rupprecht <reg name="rip" bitsize="64" type="code_ptr"/> 8799451b44SJordan Rupprecht <reg name="eflags" bitsize="32" type="i386_eflags"/> 8899451b44SJordan Rupprecht <reg name="cs" bitsize="32" type="int32"/> 8999451b44SJordan Rupprecht <reg name="ss" bitsize="32" type="int32"/> 9099451b44SJordan Rupprecht <reg name="ds" bitsize="32" type="int32"/> 9199451b44SJordan Rupprecht <reg name="es" bitsize="32" type="int32"/> 9299451b44SJordan Rupprecht <reg name="fs" bitsize="32" type="int32"/> 9399451b44SJordan Rupprecht <reg name="gs" bitsize="32" type="int32"/> 9499451b44SJordan Rupprecht 9599451b44SJordan Rupprecht <reg name="st0" bitsize="80" type="i387_ext"/> 9699451b44SJordan Rupprecht <reg name="st1" bitsize="80" type="i387_ext"/> 9799451b44SJordan Rupprecht <reg name="st2" bitsize="80" type="i387_ext"/> 9899451b44SJordan Rupprecht <reg name="st3" bitsize="80" type="i387_ext"/> 9999451b44SJordan Rupprecht <reg name="st4" bitsize="80" type="i387_ext"/> 10099451b44SJordan Rupprecht <reg name="st5" bitsize="80" type="i387_ext"/> 10199451b44SJordan Rupprecht <reg name="st6" bitsize="80" type="i387_ext"/> 10299451b44SJordan Rupprecht <reg name="st7" bitsize="80" type="i387_ext"/> 10399451b44SJordan Rupprecht 10499451b44SJordan Rupprecht <reg name="fctrl" bitsize="32" type="int" group="float"/> 10599451b44SJordan Rupprecht <reg name="fstat" bitsize="32" type="int" group="float"/> 10699451b44SJordan Rupprecht <reg name="ftag" bitsize="32" type="int" group="float"/> 10799451b44SJordan Rupprecht <reg name="fiseg" bitsize="32" type="int" group="float"/> 10899451b44SJordan Rupprecht <reg name="fioff" bitsize="32" type="int" group="float"/> 10999451b44SJordan Rupprecht <reg name="foseg" bitsize="32" type="int" group="float"/> 11099451b44SJordan Rupprecht <reg name="fooff" bitsize="32" type="int" group="float"/> 11199451b44SJordan Rupprecht <reg name="fop" bitsize="32" type="int" group="float"/> 11299451b44SJordan Rupprecht</feature>""", False 11399451b44SJordan Rupprecht 11499451b44SJordan Rupprecht if annex == "i386-64bit-sse.xml": 11599451b44SJordan Rupprecht return """<?xml version="1.0"?> 11699451b44SJordan Rupprecht<!-- Copyright (C) 2010-2017 Free Software Foundation, Inc. 11799451b44SJordan Rupprecht 11899451b44SJordan Rupprecht Copying and distribution of this file, with or without modification, 11999451b44SJordan Rupprecht are permitted in any medium without royalty provided the copyright 12099451b44SJordan Rupprecht notice and this notice are preserved. --> 12199451b44SJordan Rupprecht 12299451b44SJordan Rupprecht<!DOCTYPE feature SYSTEM "gdb-target.dtd"> 12399451b44SJordan Rupprecht<feature name="org.gnu.gdb.i386.64bit.sse"> 12499451b44SJordan Rupprecht <vector id="v4f" type="ieee_single" count="4"/> 12599451b44SJordan Rupprecht <vector id="v2d" type="ieee_double" count="2"/> 12699451b44SJordan Rupprecht <vector id="v16i8" type="int8" count="16"/> 12799451b44SJordan Rupprecht <vector id="v8i16" type="int16" count="8"/> 12899451b44SJordan Rupprecht <vector id="v4i32" type="int32" count="4"/> 12999451b44SJordan Rupprecht <vector id="v2i64" type="int64" count="2"/> 13099451b44SJordan Rupprecht <union id="vec128"> 13199451b44SJordan Rupprecht <field name="v4_float" type="v4f"/> 13299451b44SJordan Rupprecht <field name="v2_double" type="v2d"/> 13399451b44SJordan Rupprecht <field name="v16_int8" type="v16i8"/> 13499451b44SJordan Rupprecht <field name="v8_int16" type="v8i16"/> 13599451b44SJordan Rupprecht <field name="v4_int32" type="v4i32"/> 13699451b44SJordan Rupprecht <field name="v2_int64" type="v2i64"/> 13799451b44SJordan Rupprecht <field name="uint128" type="uint128"/> 13899451b44SJordan Rupprecht </union> 13999451b44SJordan Rupprecht <flags id="i386_mxcsr" size="4"> 14099451b44SJordan Rupprecht <field name="IE" start="0" end="0"/> 14199451b44SJordan Rupprecht <field name="DE" start="1" end="1"/> 14299451b44SJordan Rupprecht <field name="ZE" start="2" end="2"/> 14399451b44SJordan Rupprecht <field name="OE" start="3" end="3"/> 14499451b44SJordan Rupprecht <field name="UE" start="4" end="4"/> 14599451b44SJordan Rupprecht <field name="PE" start="5" end="5"/> 14699451b44SJordan Rupprecht <field name="DAZ" start="6" end="6"/> 14799451b44SJordan Rupprecht <field name="IM" start="7" end="7"/> 14899451b44SJordan Rupprecht <field name="DM" start="8" end="8"/> 14999451b44SJordan Rupprecht <field name="ZM" start="9" end="9"/> 15099451b44SJordan Rupprecht <field name="OM" start="10" end="10"/> 15199451b44SJordan Rupprecht <field name="UM" start="11" end="11"/> 15299451b44SJordan Rupprecht <field name="PM" start="12" end="12"/> 15399451b44SJordan Rupprecht <field name="FZ" start="15" end="15"/> 15499451b44SJordan Rupprecht </flags> 15599451b44SJordan Rupprecht 15699451b44SJordan Rupprecht <reg name="xmm0" bitsize="128" type="vec128" regnum="40"/> 15799451b44SJordan Rupprecht <reg name="xmm1" bitsize="128" type="vec128"/> 15899451b44SJordan Rupprecht <reg name="xmm2" bitsize="128" type="vec128"/> 15999451b44SJordan Rupprecht <reg name="xmm3" bitsize="128" type="vec128"/> 16099451b44SJordan Rupprecht <reg name="xmm4" bitsize="128" type="vec128"/> 16199451b44SJordan Rupprecht <reg name="xmm5" bitsize="128" type="vec128"/> 16299451b44SJordan Rupprecht <reg name="xmm6" bitsize="128" type="vec128"/> 16399451b44SJordan Rupprecht <reg name="xmm7" bitsize="128" type="vec128"/> 16499451b44SJordan Rupprecht <reg name="xmm8" bitsize="128" type="vec128"/> 16599451b44SJordan Rupprecht <reg name="xmm9" bitsize="128" type="vec128"/> 16699451b44SJordan Rupprecht <reg name="xmm10" bitsize="128" type="vec128"/> 16799451b44SJordan Rupprecht <reg name="xmm11" bitsize="128" type="vec128"/> 16899451b44SJordan Rupprecht <reg name="xmm12" bitsize="128" type="vec128"/> 16999451b44SJordan Rupprecht <reg name="xmm13" bitsize="128" type="vec128"/> 17099451b44SJordan Rupprecht <reg name="xmm14" bitsize="128" type="vec128"/> 17199451b44SJordan Rupprecht <reg name="xmm15" bitsize="128" type="vec128"/> 17299451b44SJordan Rupprecht 17399451b44SJordan Rupprecht <reg name="mxcsr" bitsize="32" type="i386_mxcsr" group="vector"/> 17499451b44SJordan Rupprecht</feature>""", False 17599451b44SJordan Rupprecht 17699451b44SJordan Rupprecht return None, False 17799451b44SJordan Rupprecht 17899451b44SJordan Rupprecht def readRegister(self, regnum): 17999451b44SJordan Rupprecht return "" 18099451b44SJordan Rupprecht 18199451b44SJordan Rupprecht def readRegisters(self): 18299451b44SJordan Rupprecht return "0600000000000000c0b7c00080fffffff021c60080ffffff1a00000000000000020000000000000078b7c00080ffffff203f8ca090ffffff103f8ca090ffffff3025990a80ffffff809698000000000070009f0a80ffffff020000000000000000eae10080ffffff00000000000000001822d74f1a00000078b7c00080ffffff0e12410080ffff004602000008000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801f0000" 18399451b44SJordan Rupprecht 18499451b44SJordan Rupprecht def haltReason(self): 18599451b44SJordan Rupprecht return "T02thread:dead;threads:dead;" 18699451b44SJordan Rupprecht 18799451b44SJordan Rupprecht def qfThreadInfo(self): 18899451b44SJordan Rupprecht return "mdead" 18999451b44SJordan Rupprecht 19099451b44SJordan Rupprecht def qC(self): 19199451b44SJordan Rupprecht return "" 19299451b44SJordan Rupprecht 19399451b44SJordan Rupprecht def qSupported(self, client_supported): 19499451b44SJordan Rupprecht return "PacketSize=4000;qXfer:features:read+" 19599451b44SJordan Rupprecht 19699451b44SJordan Rupprecht def QThreadSuffixSupported(self): 19799451b44SJordan Rupprecht return "OK" 19899451b44SJordan Rupprecht 19999451b44SJordan Rupprecht def QListThreadsInStopReply(self): 20099451b44SJordan Rupprecht return "OK" 20199451b44SJordan Rupprecht 20299451b44SJordan Rupprecht self.server.responder = MyResponder() 20399451b44SJordan Rupprecht if self.TraceOn(): 20499451b44SJordan Rupprecht self.runCmd("log enable gdb-remote packets") 20599451b44SJordan Rupprecht self.addTearDownHook( 20699451b44SJordan Rupprecht lambda: self.runCmd("log disable gdb-remote packets")) 20799451b44SJordan Rupprecht 20899451b44SJordan Rupprecht target = self.dbg.CreateTargetWithFileAndArch(None, None) 20999451b44SJordan Rupprecht 21099451b44SJordan Rupprecht process = self.connect(target) 21199451b44SJordan Rupprecht 21299451b44SJordan Rupprecht if self.TraceOn(): 21399451b44SJordan Rupprecht interp = self.dbg.GetCommandInterpreter() 21499451b44SJordan Rupprecht result = lldb.SBCommandReturnObject() 21599451b44SJordan Rupprecht interp.HandleCommand("target list", result) 21699451b44SJordan Rupprecht print(result.GetOutput()) 21799451b44SJordan Rupprecht 21899451b44SJordan Rupprecht rip_valobj = process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("rip") 21999451b44SJordan Rupprecht self.assertEqual(rip_valobj.GetValueAsUnsigned(), 0x00ffff800041120e) 22099451b44SJordan Rupprecht 22199451b44SJordan Rupprecht r15_valobj = process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("r15") 22299451b44SJordan Rupprecht self.assertEqual(r15_valobj.GetValueAsUnsigned(), 0xffffff8000c0b778) 22399451b44SJordan Rupprecht 22499451b44SJordan Rupprecht mxcsr_valobj = process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("mxcsr") 22599451b44SJordan Rupprecht self.assertEqual(mxcsr_valobj.GetValueAsUnsigned(), 0x00001f80) 22699451b44SJordan Rupprecht 22799451b44SJordan Rupprecht gpr_reg_set_name = process.GetThreadAtIndex(0).GetFrameAtIndex(0).GetRegisters().GetValueAtIndex(0).GetName() 22899451b44SJordan Rupprecht self.assertEqual(gpr_reg_set_name, "general") 22999451b44SJordan Rupprecht 23099451b44SJordan Rupprecht float_reg_set_name = process.GetThreadAtIndex(0).GetFrameAtIndex(0).GetRegisters().GetValueAtIndex(1).GetName() 23199451b44SJordan Rupprecht self.assertEqual(float_reg_set_name, "float") 23299451b44SJordan Rupprecht 23399451b44SJordan Rupprecht vector_reg_set_name = process.GetThreadAtIndex(0).GetFrameAtIndex(0).GetRegisters().GetValueAtIndex(2).GetName() 23499451b44SJordan Rupprecht self.assertEqual(vector_reg_set_name, "vector") 23599451b44SJordan Rupprecht 23699451b44SJordan Rupprecht if self.TraceOn(): 23799451b44SJordan Rupprecht print("rip is 0x%x" % rip_valobj.GetValueAsUnsigned()) 23899451b44SJordan Rupprecht print("r15 is 0x%x" % r15_valobj.GetValueAsUnsigned()) 23999451b44SJordan Rupprecht print("mxcsr is 0x%x" % mxcsr_valobj.GetValueAsUnsigned()) 240