mgorny updated this revision to Diff 370756. mgorny added a comment. Add initial tests for aarch64 regs (roughly confirming that it gets the target.xml correctly).
CHANGES SINCE LAST ACTION https://reviews.llvm.org/D109272/new/ https://reviews.llvm.org/D109272 Files: lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp lldb/test/API/functionalities/gdb_remote_client/TestGDBServerTargetXML.py
Index: lldb/test/API/functionalities/gdb_remote_client/TestGDBServerTargetXML.py =================================================================== --- lldb/test/API/functionalities/gdb_remote_client/TestGDBServerTargetXML.py +++ lldb/test/API/functionalities/gdb_remote_client/TestGDBServerTargetXML.py @@ -272,3 +272,141 @@ ["ymm0 = {0xd0 0xd1 0xd2 0xd3 0xd4 0xd5 0xd6 0xd7 0xd8 0xd9 " "0xda 0xdb 0xdc 0xdd 0xde 0xdf 0xe0 0xe1 0xe2 0xe3 0xe4 " "0xe5 0xe6 0xe7 0xe8 0xe9 0xea 0xeb 0xec 0xed 0xee 0xef}"]) + + @skipIfXmlSupportMissing + @skipIfRemote + def test_aarch64_regs(self): + """Test grabbing various aarch64 registers from gdbserver.""" + reg_data = [ + "0102030405060708", # x0 + "1112131415161718", # x1 + ] + 27 * [ + "2122232425262728", # x2..x28 + ] + [ + "3132333435363738", # x29 (fp) + "4142434445464748", # x30 (lr) + "5152535455565758", # x31 (sp) + "6162636465666768", # pc + "71727374", # cpsr + "8182838485868788898a8b8c8d8e8f90", # v0 + "9192939495969798999a9b9c9d9e9fa0", # v1 + ] + 30 * [ + "a1a2a3a4a5a6a7a8a9aaabacadaeafb0", # v2..v31 + ] + [ + "00000000", # fpsr + "00000000", # fpcr + ] + + class MyResponder(MockGDBServerResponder): + def qXferRead(self, obj, annex, offset, length): + if annex == "target.xml": + return """<?xml version="1.0"?> + <!DOCTYPE feature SYSTEM "gdb-target.dtd"> + <target> + <architecture>aarch64</architecture> + <feature name="org.gnu.gdb.aarch64.core"> + <reg name="x0" bitsize="64" type="int" regnum="0"/> + <reg name="x1" bitsize="64" type="int" regnum="1"/> + <reg name="x2" bitsize="64" type="int" regnum="2"/> + <reg name="x3" bitsize="64" type="int" regnum="3"/> + <reg name="x4" bitsize="64" type="int" regnum="4"/> + <reg name="x5" bitsize="64" type="int" regnum="5"/> + <reg name="x6" bitsize="64" type="int" regnum="6"/> + <reg name="x7" bitsize="64" type="int" regnum="7"/> + <reg name="x8" bitsize="64" type="int" regnum="8"/> + <reg name="x9" bitsize="64" type="int" regnum="9"/> + <reg name="x10" bitsize="64" type="int" regnum="10"/> + <reg name="x11" bitsize="64" type="int" regnum="11"/> + <reg name="x12" bitsize="64" type="int" regnum="12"/> + <reg name="x13" bitsize="64" type="int" regnum="13"/> + <reg name="x14" bitsize="64" type="int" regnum="14"/> + <reg name="x15" bitsize="64" type="int" regnum="15"/> + <reg name="x16" bitsize="64" type="int" regnum="16"/> + <reg name="x17" bitsize="64" type="int" regnum="17"/> + <reg name="x18" bitsize="64" type="int" regnum="18"/> + <reg name="x19" bitsize="64" type="int" regnum="19"/> + <reg name="x20" bitsize="64" type="int" regnum="20"/> + <reg name="x21" bitsize="64" type="int" regnum="21"/> + <reg name="x22" bitsize="64" type="int" regnum="22"/> + <reg name="x23" bitsize="64" type="int" regnum="23"/> + <reg name="x24" bitsize="64" type="int" regnum="24"/> + <reg name="x25" bitsize="64" type="int" regnum="25"/> + <reg name="x26" bitsize="64" type="int" regnum="26"/> + <reg name="x27" bitsize="64" type="int" regnum="27"/> + <reg name="x28" bitsize="64" type="int" regnum="28"/> + <reg name="x29" bitsize="64" type="int" regnum="29"/> + <reg name="x30" bitsize="64" type="int" regnum="30"/> + <reg name="sp" bitsize="64" type="data_ptr" regnum="31"/> + <reg name="pc" bitsize="64" type="code_ptr" regnum="32"/> + <reg name="cpsr" bitsize="32" type="cpsr_flags" regnum="33"/> + </feature> + <feature name="org.gnu.gdb.aarch64.fpu"> + <reg name="v0" bitsize="128" type="aarch64v" regnum="34"/> + <reg name="v1" bitsize="128" type="aarch64v" regnum="35"/> + <reg name="v2" bitsize="128" type="aarch64v" regnum="36"/> + <reg name="v3" bitsize="128" type="aarch64v" regnum="37"/> + <reg name="v4" bitsize="128" type="aarch64v" regnum="38"/> + <reg name="v5" bitsize="128" type="aarch64v" regnum="39"/> + <reg name="v6" bitsize="128" type="aarch64v" regnum="40"/> + <reg name="v7" bitsize="128" type="aarch64v" regnum="41"/> + <reg name="v8" bitsize="128" type="aarch64v" regnum="42"/> + <reg name="v9" bitsize="128" type="aarch64v" regnum="43"/> + <reg name="v10" bitsize="128" type="aarch64v" regnum="44"/> + <reg name="v11" bitsize="128" type="aarch64v" regnum="45"/> + <reg name="v12" bitsize="128" type="aarch64v" regnum="46"/> + <reg name="v13" bitsize="128" type="aarch64v" regnum="47"/> + <reg name="v14" bitsize="128" type="aarch64v" regnum="48"/> + <reg name="v15" bitsize="128" type="aarch64v" regnum="49"/> + <reg name="v16" bitsize="128" type="aarch64v" regnum="50"/> + <reg name="v17" bitsize="128" type="aarch64v" regnum="51"/> + <reg name="v18" bitsize="128" type="aarch64v" regnum="52"/> + <reg name="v19" bitsize="128" type="aarch64v" regnum="53"/> + <reg name="v20" bitsize="128" type="aarch64v" regnum="54"/> + <reg name="v21" bitsize="128" type="aarch64v" regnum="55"/> + <reg name="v22" bitsize="128" type="aarch64v" regnum="56"/> + <reg name="v23" bitsize="128" type="aarch64v" regnum="57"/> + <reg name="v24" bitsize="128" type="aarch64v" regnum="58"/> + <reg name="v25" bitsize="128" type="aarch64v" regnum="59"/> + <reg name="v26" bitsize="128" type="aarch64v" regnum="60"/> + <reg name="v27" bitsize="128" type="aarch64v" regnum="61"/> + <reg name="v28" bitsize="128" type="aarch64v" regnum="62"/> + <reg name="v29" bitsize="128" type="aarch64v" regnum="63"/> + <reg name="v30" bitsize="128" type="aarch64v" regnum="64"/> + <reg name="v31" bitsize="128" type="aarch64v" regnum="65"/> + <reg name="fpsr" bitsize="32" type="int" regnum="66"/> + <reg name="fpcr" bitsize="32" type="int" regnum="67"/> + </feature> + </target>""", False + else: + return None, False + + def readRegister(self, regnum): + return "" + + def readRegisters(self): + return "".join(reg_data) + + def writeRegisters(self, reg_hex): + return "OK" + + def haltReason(self): + return "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;" + + self.server.responder = MyResponder() + + target = self.createTarget("basic_eh_frame-aarch64.yaml") + process = self.connect(target) + lldbutil.expect_state_changes(self, self.dbg.GetListener(), process, + [lldb.eStateStopped]) + + # GPRs should be displayed as uints + self.match("register read x0", + ["x0 = 0x0807060504030201"]) + self.match("register read x1", + ["x1 = 0x1817161514131211"]) + self.match("register read sp", + ["sp = 0x5857565554535251"]) + self.match("register read pc", + ["pc = 0x6867666564636261"]) + self.match("register read cpsr", + ["cpsr = 0x74737271"]) Index: lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp =================================================================== --- lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -4661,24 +4661,22 @@ } } - // If the target.xml includes an architecture entry like + // gdbserver does not implement the LLDB packets used to determine host + // or process architecture. If that is the case, attempt to use + // the <architecture/> field from target.xml, e.g.: + // // <architecture>i386:x86-64</architecture> (seen from VMWare ESXi) - // <architecture>arm</architecture> (seen from Segger JLink on unspecified arm board) - // use that if we don't have anything better. + // <architecture>arm</architecture> (seen from Segger JLink on unspecified + // arm board) if (!arch_to_use.IsValid() && !target_info.arch.empty()) { - if (target_info.arch == "i386:x86-64") { - // We don't have any information about vendor or OS. - arch_to_use.SetTriple("x86_64--"); - GetTarget().MergeArchitecture(arch_to_use); - } + // We don't have any information about vendor or OS. + arch_to_use.SetTriple(llvm::StringSwitch<std::string>(target_info.arch) + .Case("i386:x86-64", "x86_64") + .Default(target_info.arch) + + "--"); - // SEGGER J-Link jtag boards send this very-generic arch name, - // we'll need to use this if we have absolutely nothing better - // to work with or the register definitions won't be accepted. - if (target_info.arch == "arm") { - arch_to_use.SetTriple("arm--"); + if (arch_to_use.IsValid()) GetTarget().MergeArchitecture(arch_to_use); - } } if (arch_to_use.IsValid()) {
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits