Author: Minsoo Choo Date: 2026-02-25T10:48:46-05:00 New Revision: 3d251288df0642762d1bd86efa05e190005c2539
URL: https://github.com/llvm/llvm-project/commit/3d251288df0642762d1bd86efa05e190005c2539 DIFF: https://github.com/llvm/llvm-project/commit/3d251288df0642762d1bd86efa05e190005c2539.diff LOG: [lldb][Process/FreeBSDKernel] Add arm support (#180674) This is LLDB version of https://cgit.freebsd.org/ports/tree/devel/gdb/files/kgdb/arm-fbsd-kern.c. This enables selecting arm and reading registers from PCB structure on core dump and live kernel debugging while trapframe unwinding support will be implemented in future. Test files using core dump from arm will be implemented once other kernel debugging improvements are done. --------- Signed-off-by: Minsoo Choo <[email protected]> Added: lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_arm.cpp lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_arm.h Modified: lldb/docs/index.rst lldb/source/Plugins/Process/FreeBSD-Kernel-Core/CMakeLists.txt lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ThreadFreeBSDKernelCore.cpp llvm/docs/ReleaseNotes.md Removed: ################################################################################ diff --git a/lldb/docs/index.rst b/lldb/docs/index.rst index 10683c7593b01..fb5d5341b2f31 100644 --- a/lldb/docs/index.rst +++ b/lldb/docs/index.rst @@ -74,7 +74,7 @@ are welcome: * iOS, tvOS, and watchOS device debugging on ARM and AArch64 * Linux user-space debugging for i386, x86_64, ARM, AArch64, PPC64le, s390x * FreeBSD user-space debugging for i386, x86_64, ARM, AArch64, PPC -* FreeBSD kernel debugging for i386, x86_64, AArch64 +* FreeBSD kernel debugging for i386, x86_64, ARM, AArch64 * NetBSD user-space debugging for i386 and x86_64 * Windows user-space debugging for i386, x86_64, ARM and AArch64 (*) diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/CMakeLists.txt b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/CMakeLists.txt index 8aafee3e43314..1cb96b7c3f523 100644 --- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/CMakeLists.txt +++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/CMakeLists.txt @@ -1,5 +1,6 @@ add_lldb_library(lldbPluginProcessFreeBSDKernelCore PLUGIN ProcessFreeBSDKernelCore.cpp + RegisterContextFreeBSDKernelCore_arm.cpp RegisterContextFreeBSDKernelCore_arm64.cpp RegisterContextFreeBSDKernelCore_i386.cpp RegisterContextFreeBSDKernelCore_x86_64.cpp diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_arm.cpp b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_arm.cpp new file mode 100644 index 0000000000000..0d01a0ec48d3e --- /dev/null +++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_arm.cpp @@ -0,0 +1,102 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "RegisterContextFreeBSDKernelCore_arm.h" +#include "Plugins/Process/Utility/lldb-arm-register-enums.h" + +#include "lldb/Target/Process.h" +#include "lldb/Target/Thread.h" +#include "lldb/Utility/RegisterValue.h" +#include "llvm/Support/Endian.h" + +using namespace lldb; +using namespace lldb_private; + +RegisterContextFreeBSDKernelCore_arm::RegisterContextFreeBSDKernelCore_arm( + Thread &thread, std::unique_ptr<RegisterInfoPOSIX_arm> register_info_up, + lldb::addr_t pcb_addr) + : RegisterContextPOSIX_arm(thread, std::move(register_info_up)), + m_pcb_addr(pcb_addr) {} + +bool RegisterContextFreeBSDKernelCore_arm::ReadGPR() { return true; } + +bool RegisterContextFreeBSDKernelCore_arm::ReadFPR() { return true; } + +bool RegisterContextFreeBSDKernelCore_arm::WriteGPR() { + assert(0); + return false; +} + +bool RegisterContextFreeBSDKernelCore_arm::WriteFPR() { + assert(0); + return false; +} + +bool RegisterContextFreeBSDKernelCore_arm::ReadRegister( + const RegisterInfo *reg_info, RegisterValue &value) { + if (m_pcb_addr == LLDB_INVALID_ADDRESS) + return false; + + // https://cgit.freebsd.org/src/tree/sys/arm/include/frame.h + // struct pcb's first field is struct switchframe which is the only field used + // by debugger and should be aligned by 8 bytes. + struct { + // Aka switchframe.sf_r4 to switchframe.sf_pc. + llvm::support::ulittle32_t r4; + llvm::support::ulittle32_t r5; + llvm::support::ulittle32_t r6; + llvm::support::ulittle32_t r7; + llvm::support::ulittle32_t r8; + llvm::support::ulittle32_t r9; + llvm::support::ulittle32_t r10; + llvm::support::ulittle32_t r11; + llvm::support::ulittle32_t r12; + llvm::support::ulittle32_t sp; + llvm::support::ulittle32_t lr; + llvm::support::ulittle32_t pc; + } pcb; + + Status error; + size_t rd = + m_thread.GetProcess()->ReadMemory(m_pcb_addr, &pcb, sizeof(pcb), error); + if (rd != sizeof(pcb)) + return false; + + uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB]; + switch (reg) { + +#define REG(x) \ + case gpr_##x##_arm: \ + value = pcb.x; \ + break; + + REG(r4); + REG(r5); + REG(r6); + REG(r7); + REG(r8); + REG(r9); + REG(r10); + REG(r11); + REG(r12); + REG(sp); + REG(lr); + REG(pc); + +#undef REG + + default: + return false; + } + return true; +} + +bool RegisterContextFreeBSDKernelCore_arm::WriteRegister( + const RegisterInfo *reg_info, const RegisterValue &value) { + return false; +} diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_arm.h b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_arm.h new file mode 100644 index 0000000000000..cdd9f1b3288c1 --- /dev/null +++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_arm.h @@ -0,0 +1,41 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNELCORE_ARM_H +#define LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNELCORE_ARM_H + +#include "Plugins/Process/Utility/RegisterContextPOSIX_arm.h" +#include "Plugins/Process/elf-core/RegisterUtilities.h" + +class RegisterContextFreeBSDKernelCore_arm : public RegisterContextPOSIX_arm { +public: + RegisterContextFreeBSDKernelCore_arm( + lldb_private::Thread &thread, + std::unique_ptr<RegisterInfoPOSIX_arm> register_info_up, + lldb::addr_t pcb_addr); + + bool ReadRegister(const lldb_private::RegisterInfo *reg_info, + lldb_private::RegisterValue &value) override; + + bool WriteRegister(const lldb_private::RegisterInfo *reg_info, + const lldb_private::RegisterValue &value) override; + +protected: + bool ReadGPR() override; + + bool ReadFPR() override; + + bool WriteGPR() override; + + bool WriteFPR() override; + +private: + lldb::addr_t m_pcb_addr; +}; + +#endif // LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNELCORE_ARM_H diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ThreadFreeBSDKernelCore.cpp b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ThreadFreeBSDKernelCore.cpp index b6ac0b2994dbc..17e0ac8e23e7f 100644 --- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ThreadFreeBSDKernelCore.cpp +++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ThreadFreeBSDKernelCore.cpp @@ -14,8 +14,10 @@ #include "Plugins/Process/Utility/RegisterContextFreeBSD_i386.h" #include "Plugins/Process/Utility/RegisterContextFreeBSD_x86_64.h" +#include "Plugins/Process/Utility/RegisterInfoPOSIX_arm.h" #include "Plugins/Process/Utility/RegisterInfoPOSIX_arm64.h" #include "ProcessFreeBSDKernelCore.h" +#include "RegisterContextFreeBSDKernelCore_arm.h" #include "RegisterContextFreeBSDKernelCore_arm64.h" #include "RegisterContextFreeBSDKernelCore_i386.h" #include "RegisterContextFreeBSDKernelCore_x86_64.h" @@ -63,6 +65,11 @@ ThreadFreeBSDKernelCore::CreateRegisterContextForFrame(StackFrame *frame) { *this, std::make_unique<RegisterInfoPOSIX_arm64>(arch, 0), m_pcb_addr); break; + case llvm::Triple::arm: + m_thread_reg_ctx_sp = + std::make_shared<RegisterContextFreeBSDKernelCore_arm>( + *this, std::make_unique<RegisterInfoPOSIX_arm>(arch), m_pcb_addr); + break; case llvm::Triple::x86: m_thread_reg_ctx_sp = std::make_shared<RegisterContextFreeBSDKernelCore_i386>( diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md index 8bfb060cb29b8..b8a576b55949c 100644 --- a/llvm/docs/ReleaseNotes.md +++ b/llvm/docs/ReleaseNotes.md @@ -219,6 +219,7 @@ Changes to LLDB * Support for libfbsdvmcore has been removed. As a result, FreeBSD kernel dump debugging is now only available on FreeBSD hosts. Live kernel debugging through the GDB remote protocol is still available from any platform. +* Support for ARM has been added. * The crashed thread is now automatically selected on start. * Threads are listed in incrmental order by pid then by tid. * Unread kernel messages saved in msgbufp are now printed when lldb starts. This information is printed only _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
