From 43ad521f2fa9a50e6b30425a3b9fb3025b42587a Mon Sep 17 00:00:00 2001 From: David Spickett Date: Mon, 24 Jul 2023 12:38:27 +0000 Subject: [PATCH] [lldb][AArch64] Add reading of TLS tpidr register from core files 7e229217f4215b519b886e7881bae4da3742a7d2 did live processes, this does core files. Pretty simple, there is an NT_ARM_TLS note that contains at least tpidr, and on systems with the Scalable Matrix Extension (SME), tpidr2 as well. tpidr2 will be handled in future patches for SME support. This NT_ARM_TLS note has always been present but it seems convenient to handle it as "optional" inside of LLDB. We'll probably want the flexibility when supporting tpidr2. Normally the C library would set tpidr but all our test sources build without it. So I've updated the neon test program to write to tpidr and regenerated the corefile. I've removed the LLDB_PTRACE_NT_ARM_TLS that was unused, we get what we need from llvm's defs instead. Reviewed By: omjavaid Differential Revision: https://reviews.llvm.org/D156118 --- lldb/include/lldb/Host/linux/Ptrace.h | 2 -- .../Utility/RegisterContextPOSIX_arm64.cpp | 4 ++++ .../Utility/RegisterContextPOSIX_arm64.h | 1 + .../Process/Utility/RegisterInfoPOSIX_arm64.h | 1 + .../RegisterContextPOSIXCore_arm64.cpp | 14 ++++++++++++++ .../elf-core/RegisterContextPOSIXCore_arm64.h | 1 + .../Process/elf-core/RegisterUtilities.h | 4 ++++ .../postmortem/elf-core/TestLinuxCore.py | 9 +++++---- .../postmortem/elf-core/linux-aarch64-neon.c | 5 +++++ .../elf-core/linux-aarch64-neon.core | Bin 28672 -> 32768 bytes llvm/docs/ReleaseNotes.rst | 3 +++ 11 files changed, 38 insertions(+), 6 deletions(-) diff --git a/lldb/include/lldb/Host/linux/Ptrace.h b/lldb/include/lldb/Host/linux/Ptrace.h index 29489d1ae4862f..aabd3fd4fc5573 100644 --- a/lldb/include/lldb/Host/linux/Ptrace.h +++ b/lldb/include/lldb/Host/linux/Ptrace.h @@ -57,6 +57,4 @@ typedef int __ptrace_request; #define PTRACE_POKEMTETAGS 34 #endif -#define LLDB_PTRACE_NT_ARM_TLS 0x401 // ARM TLS register - #endif // liblldb_Host_linux_Ptrace_h_ diff --git a/lldb/source/Plugins/Process/Utility/RegisterContextPOSIX_arm64.cpp b/lldb/source/Plugins/Process/Utility/RegisterContextPOSIX_arm64.cpp index 676e450c4846ad..d306c818e89f4a 100644 --- a/lldb/source/Plugins/Process/Utility/RegisterContextPOSIX_arm64.cpp +++ b/lldb/source/Plugins/Process/Utility/RegisterContextPOSIX_arm64.cpp @@ -47,6 +47,10 @@ bool RegisterContextPOSIX_arm64::IsPAuth(unsigned reg) const { return m_register_info_up->IsPAuthReg(reg); } +bool RegisterContextPOSIX_arm64::IsTLS(unsigned reg) const { + return m_register_info_up->IsTLSReg(reg); +} + RegisterContextPOSIX_arm64::RegisterContextPOSIX_arm64( lldb_private::Thread &thread, std::unique_ptr register_info) diff --git a/lldb/source/Plugins/Process/Utility/RegisterContextPOSIX_arm64.h b/lldb/source/Plugins/Process/Utility/RegisterContextPOSIX_arm64.h index 7c301599d3af6e..6a935274fc40d4 100644 --- a/lldb/source/Plugins/Process/Utility/RegisterContextPOSIX_arm64.h +++ b/lldb/source/Plugins/Process/Utility/RegisterContextPOSIX_arm64.h @@ -55,6 +55,7 @@ class RegisterContextPOSIX_arm64 : public lldb_private::RegisterContext { bool IsSVE(unsigned reg) const; bool IsPAuth(unsigned reg) const; + bool IsTLS(unsigned reg) const; bool IsSVEZ(unsigned reg) const { return m_register_info_up->IsSVEZReg(reg); } bool IsSVEP(unsigned reg) const { return m_register_info_up->IsSVEPReg(reg); } diff --git a/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.h b/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.h index 8505ebfa9eb971..5de7cfea14c1b2 100644 --- a/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.h +++ b/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.h @@ -119,6 +119,7 @@ class RegisterInfoPOSIX_arm64 bool IsSSVEEnabled() const { return m_opt_regsets.AnySet(eRegsetMaskSSVE); } bool IsPAuthEnabled() const { return m_opt_regsets.AnySet(eRegsetMaskPAuth); } bool IsMTEEnabled() const { return m_opt_regsets.AnySet(eRegsetMaskMTE); } + bool IsTLSEnabled() const { return m_opt_regsets.AnySet(eRegsetMaskTLS); } bool IsSVEReg(unsigned reg) const; bool IsSVEZReg(unsigned reg) const; diff --git a/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.cpp b/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.cpp index 22a9996b1a6e93..38abd8f8f2b116 100644 --- a/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.cpp +++ b/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.cpp @@ -34,6 +34,12 @@ RegisterContextCorePOSIX_arm64::Create(Thread &thread, const ArchSpec &arch, if (pac_data.GetByteSize() >= sizeof(uint64_t) * 2) opt_regsets.Set(RegisterInfoPOSIX_arm64::eRegsetMaskPAuth); + DataExtractor tls_data = getRegset(notes, arch.GetTriple(), AARCH64_TLS_Desc); + // A valid note will always contain at least one register, "tpidr". It may + // expand in future. + if (tls_data.GetByteSize() >= sizeof(uint64_t)) + opt_regsets.Set(RegisterInfoPOSIX_arm64::eRegsetMaskTLS); + auto register_info_up = std::make_unique(arch, opt_regsets); return std::unique_ptr( @@ -59,6 +65,9 @@ RegisterContextCorePOSIX_arm64::RegisterContextCorePOSIX_arm64( if (m_register_info_up->IsPAuthEnabled()) m_pac_data = getRegset(notes, target_triple, AARCH64_PAC_Desc); + if (m_register_info_up->IsTLSEnabled()) + m_tls_data = getRegset(notes, target_triple, AARCH64_TLS_Desc); + ConfigureRegisterContext(); } @@ -223,6 +232,11 @@ bool RegisterContextCorePOSIX_arm64::ReadRegister(const RegisterInfo *reg_info, assert(offset < m_pac_data.GetByteSize()); value.SetFromMemoryData(*reg_info, m_pac_data.GetDataStart() + offset, reg_info->byte_size, lldb::eByteOrderLittle, error); + } else if (IsTLS(reg)) { + offset = reg_info->byte_offset - m_register_info_up->GetTLSOffset(); + assert(offset < m_tls_data.GetByteSize()); + value.SetFromMemoryData(*reg_info, m_tls_data.GetDataStart() + offset, + reg_info->byte_size, lldb::eByteOrderLittle, error); } else return false; diff --git a/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.h b/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.h index f8548562adba3c..5e0e29f0de7fde 100644 --- a/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.h +++ b/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.h @@ -57,6 +57,7 @@ class RegisterContextCorePOSIX_arm64 : public RegisterContextPOSIX_arm64 { lldb_private::DataExtractor m_fpr_data; lldb_private::DataExtractor m_sve_data; lldb_private::DataExtractor m_pac_data; + lldb_private::DataExtractor m_tls_data; SVEState m_sve_state; uint16_t m_sve_vector_length = 0; diff --git a/lldb/source/Plugins/Process/elf-core/RegisterUtilities.h b/lldb/source/Plugins/Process/elf-core/RegisterUtilities.h index f6a2fbdcc9387b..3d53a5795ef3eb 100644 --- a/lldb/source/Plugins/Process/elf-core/RegisterUtilities.h +++ b/lldb/source/Plugins/Process/elf-core/RegisterUtilities.h @@ -123,6 +123,10 @@ constexpr RegsetDesc AARCH64_PAC_Desc[] = { {llvm::Triple::Linux, llvm::Triple::aarch64, llvm::ELF::NT_ARM_PAC_MASK}, }; +constexpr RegsetDesc AARCH64_TLS_Desc[] = { + {llvm::Triple::Linux, llvm::Triple::aarch64, llvm::ELF::NT_ARM_TLS}, +}; + constexpr RegsetDesc PPC_VMX_Desc[] = { {llvm::Triple::FreeBSD, llvm::Triple::UnknownArch, llvm::ELF::NT_PPC_VMX}, {llvm::Triple::Linux, llvm::Triple::UnknownArch, llvm::ELF::NT_PPC_VMX}, diff --git a/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py b/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py index c5de5f013bbe1d..4ff288ad49c015 100644 --- a/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py +++ b/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py @@ -304,10 +304,10 @@ def test_aarch64_regs(self): values = {} values["x1"] = "0x000000000000002f" values["w1"] = "0x0000002f" - values["fp"] = "0x0000007fc5dd7f20" - values["lr"] = "0x0000000000400180" - values["sp"] = "0x0000007fc5dd7f00" - values["pc"] = "0x000000000040014c" + values["fp"] = "0x0000ffffdab7c770" + values["lr"] = "0x000000000040019c" + values["sp"] = "0x0000ffffdab7c750" + values["pc"] = "0x0000000000400168" values[ "v0" ] = "{0x00 0x00 0x00 0x00 0x00 0x00 0xe0 0x3f 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}" @@ -366,6 +366,7 @@ def test_aarch64_regs(self): values["d31"] = "1.3980432860952889E-76" values["fpsr"] = "0x00000000" values["fpcr"] = "0x00000000" + values["tpidr"] = "0x1122334455667788" for regname, value in values.items(): self.expect( diff --git a/lldb/test/API/functionalities/postmortem/elf-core/linux-aarch64-neon.c b/lldb/test/API/functionalities/postmortem/elf-core/linux-aarch64-neon.c index 475e1ac93f884d..32d4773163d117 100644 --- a/lldb/test/API/functionalities/postmortem/elf-core/linux-aarch64-neon.c +++ b/lldb/test/API/functionalities/postmortem/elf-core/linux-aarch64-neon.c @@ -1,6 +1,8 @@ // compile with -march=armv8-a+simd on compatible aarch64 compiler // linux-aarch64-neon.core was generated by: aarch64-linux-gnu-gcc-8 // commandline: -march=armv8-a+simd -nostdlib -static -g linux-aarch64-neon.c +#include + static void bar(char *boom) { char F = 'b'; asm volatile("fmov d0, #0.5\n\t"); @@ -14,6 +16,9 @@ static void bar(char *boom) { asm volatile("movi v8.16b, #0x11\n\t"); asm volatile("movi v31.16b, #0x30\n\t"); + uint64_t pattern = 0x1122334455667788; + asm volatile("msr tpidr_el0, %0" ::"r"(pattern)); + *boom = 47; // Frame bar } diff --git a/lldb/test/API/functionalities/postmortem/elf-core/linux-aarch64-neon.core b/lldb/test/API/functionalities/postmortem/elf-core/linux-aarch64-neon.core index 5444c53a896a432735d4cd8cc0ce15a7a62cce38..19364be3b70a27ad5fd306a7a72de85858ca417d 100644 GIT binary patch literal 32768 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 MYISG_LffSO1ekUZssI20 diff --git a/llvm/docs/ReleaseNotes.rst b/llvm/docs/ReleaseNotes.rst index 51af9a2e1b5594..794eec738195c5 100644 --- a/llvm/docs/ReleaseNotes.rst +++ b/llvm/docs/ReleaseNotes.rst @@ -135,6 +135,9 @@ Changes to the LLVM tools Changes to LLDB --------------------------------- +* AArch64 Linux targets now provide access to the Thread Local Storage + register ``tpidr``. + Changes to Sanitizers --------------------- * HWASan now defaults to detecting use-after-scope bugs.