https://github.com/mchoo7 updated https://github.com/llvm/llvm-project/pull/180674
>From bc4b272d4e20510d016542dea0a0c69ccee83594 Mon Sep 17 00:00:00 2001 From: Minsoo Choo <[email protected]> Date: Mon, 9 Feb 2026 23:33:16 -0500 Subject: [PATCH 1/5] [lldb][Process/FreeBSDKernel] Add arm support Signed-off-by: Minsoo Choo <[email protected]> --- lldb/docs/index.rst | 2 +- .../Process/FreeBSDKernel/CMakeLists.txt | 1 + .../RegisterContextFreeBSDKernel_arm.cpp | 101 ++++++++++++++++++ .../RegisterContextFreeBSDKernel_arm.h | 41 +++++++ .../FreeBSDKernel/ThreadFreeBSDKernel.cpp | 6 ++ llvm/docs/ReleaseNotes.md | 1 + 6 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.cpp create mode 100644 lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.h 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/FreeBSDKernel/CMakeLists.txt b/lldb/source/Plugins/Process/FreeBSDKernel/CMakeLists.txt index c35b4def24e25..8a970a2b5dee5 100644 --- a/lldb/source/Plugins/Process/FreeBSDKernel/CMakeLists.txt +++ b/lldb/source/Plugins/Process/FreeBSDKernel/CMakeLists.txt @@ -13,6 +13,7 @@ endif() add_lldb_library(lldbPluginProcessFreeBSDKernel PLUGIN ProcessFreeBSDKernel.cpp + RegisterContextFreeBSDKernel_arm.cpp RegisterContextFreeBSDKernel_arm64.cpp RegisterContextFreeBSDKernel_i386.cpp RegisterContextFreeBSDKernel_x86_64.cpp diff --git a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.cpp b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.cpp new file mode 100644 index 0000000000000..9db4fecb9936c --- /dev/null +++ b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.cpp @@ -0,0 +1,101 @@ +//===-- RegisterContextFreeBSDKernel_arm.cpp ------------------------------===// +// +// 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 "RegisterContextFreeBSDKernel_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; + +RegisterContextFreeBSDKernel_arm::RegisterContextFreeBSDKernel_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 RegisterContextFreeBSDKernel_arm::ReadGPR() { return true; } + +bool RegisterContextFreeBSDKernel_arm::ReadFPR() { return true; } + +bool RegisterContextFreeBSDKernel_arm::WriteGPR() { + assert(0); + return false; +} + +bool RegisterContextFreeBSDKernel_arm::WriteFPR() { + assert(0); + return false; +} + +bool RegisterContextFreeBSDKernel_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 should be aligned by 8 bytes + struct { + 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::ulittle64_t r11; + llvm::support::ulittle64_t r12; + llvm::support::ulittle64_t sp; + llvm::support::ulittle64_t lr; + llvm::support::ulittle64_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 RegisterContextFreeBSDKernel_arm::WriteRegister( + const RegisterInfo *reg_info, const RegisterValue &value) { + return false; +} diff --git a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.h b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.h new file mode 100644 index 0000000000000..bad5688d58df3 --- /dev/null +++ b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.h @@ -0,0 +1,41 @@ +//===-- RegisterContextFreeBSDKernel_arm.h ----------------------*- C++ -*-===// +// +// 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_REGISTERCONTEXTFREEBSDKERNEL_ARM_H +#define LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNEL_ARM_H + +#include "Plugins/Process/Utility/RegisterContextPOSIX_arm.h" +#include "Plugins/Process/elf-core/RegisterUtilities.h" + +class RegisterContextFreeBSDKernel_arm : public RegisterContextPOSIX_arm { +public: + RegisterContextFreeBSDKernel_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_REGISTERCONTEXTFREEBSDKERNEL_ARM_H diff --git a/lldb/source/Plugins/Process/FreeBSDKernel/ThreadFreeBSDKernel.cpp b/lldb/source/Plugins/Process/FreeBSDKernel/ThreadFreeBSDKernel.cpp index dd1ed52719749..98e215146c110 100644 --- a/lldb/source/Plugins/Process/FreeBSDKernel/ThreadFreeBSDKernel.cpp +++ b/lldb/source/Plugins/Process/FreeBSDKernel/ThreadFreeBSDKernel.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 "ProcessFreeBSDKernel.h" +#include "RegisterContextFreeBSDKernel_arm.h" #include "RegisterContextFreeBSDKernel_arm64.h" #include "RegisterContextFreeBSDKernel_i386.h" #include "RegisterContextFreeBSDKernel_x86_64.h" @@ -62,6 +64,10 @@ ThreadFreeBSDKernel::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<RegisterContextFreeBSDKernel_arm>( + *this, std::make_unique<RegisterInfoPOSIX_arm>(arch), m_pcb_addr); + break; case llvm::Triple::x86: m_thread_reg_ctx_sp = std::make_shared<RegisterContextFreeBSDKernel_i386>( *this, new RegisterContextFreeBSD_i386(arch), m_pcb_addr); diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md index 30e74acf973ed..a245f3deb1812 100644 --- a/llvm/docs/ReleaseNotes.md +++ b/llvm/docs/ReleaseNotes.md @@ -182,6 +182,7 @@ Changes to LLDB * Support for FreeBSD on MIPS64 has been removed. * The minimum assumed version of FreeBSD is now 14. The effect of which is that watchpoints are assumed to be supported. +* Kernel debugging support for ARM on FreeBSD has been added. Changes to BOLT --------------- >From f5b6f148df804c8e6cf2df9cf955f6cd37187751 Mon Sep 17 00:00:00 2001 From: Minsoo Choo <[email protected]> Date: Tue, 10 Feb 2026 12:35:17 -0500 Subject: [PATCH 2/5] fixup! [lldb][Process/FreeBSDKernel] Add arm support Signed-off-by: Minsoo Choo <[email protected]> --- .../FreeBSDKernel/RegisterContextFreeBSDKernel_arm.cpp | 10 ++++++++-- .../FreeBSDKernel/RegisterContextFreeBSDKernel_arm.h | 8 +++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.cpp b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.cpp index 9db4fecb9936c..6aebd97bb2de2 100644 --- a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.cpp +++ b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.cpp @@ -1,10 +1,16 @@ -//===-- RegisterContextFreeBSDKernel_arm.cpp ------------------------------===// +//===----------------------------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// +/// +/// \file +/// This file contains the definition of the RegisterContextFreeBSDKernel_arm +/// class, which is used for reading registers from PCB on arm kernel dump. +/// +//===----------------------------------------------------------------------===// #include "RegisterContextFreeBSDKernel_arm.h" #include "Plugins/Process/Utility/lldb-arm-register-enums.h" @@ -44,7 +50,7 @@ bool RegisterContextFreeBSDKernel_arm::ReadRegister( // 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 should be aligned by 8 bytes + // by debugger and should be aligned by 8 bytes. struct { llvm::support::ulittle32_t r4; llvm::support::ulittle32_t r5; diff --git a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.h b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.h index bad5688d58df3..9b4445e16be79 100644 --- a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.h +++ b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.h @@ -1,10 +1,16 @@ -//===-- RegisterContextFreeBSDKernel_arm.h ----------------------*- C++ -*-===// +//===----------------------------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// +/// +/// \file +/// This file contains the declaration of the RegisterContextFreeBSDKernel_arm +/// class, which is used for reading registers from PCB on arm kernel dump. +/// +//===----------------------------------------------------------------------===// #ifndef LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNEL_ARM_H #define LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNEL_ARM_H >From d8b3086e826b735ad3639379166042a84dad0423 Mon Sep 17 00:00:00 2001 From: Minsoo Choo <[email protected]> Date: Wed, 11 Feb 2026 14:11:17 -0500 Subject: [PATCH 3/5] fixup! [lldb][Process/FreeBSDKernel] Add arm support Signed-off-by: Minsoo Choo <[email protected]> --- .../RegisterContextFreeBSDKernel_arm.cpp | 12 ++++++------ .../FreeBSDKernel/RegisterContextFreeBSDKernel_arm.h | 2 +- llvm/docs/ReleaseNotes.md | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.cpp b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.cpp index 6aebd97bb2de2..71da0ed99dffa 100644 --- a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.cpp +++ b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.cpp @@ -8,7 +8,7 @@ /// /// \file /// This file contains the definition of the RegisterContextFreeBSDKernel_arm -/// class, which is used for reading registers from PCB on arm kernel dump. +/// class, which is used for reading registers from PCB in arm kernel dump. /// //===----------------------------------------------------------------------===// @@ -59,11 +59,11 @@ bool RegisterContextFreeBSDKernel_arm::ReadRegister( llvm::support::ulittle32_t r8; llvm::support::ulittle32_t r9; llvm::support::ulittle32_t r10; - llvm::support::ulittle64_t r11; - llvm::support::ulittle64_t r12; - llvm::support::ulittle64_t sp; - llvm::support::ulittle64_t lr; - llvm::support::ulittle64_t pc; + 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; diff --git a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.h b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.h index 9b4445e16be79..61bd34206a51b 100644 --- a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.h +++ b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.h @@ -8,7 +8,7 @@ /// /// \file /// This file contains the declaration of the RegisterContextFreeBSDKernel_arm -/// class, which is used for reading registers from PCB on arm kernel dump. +/// class, which is used for reading registers from PCB in arm kernel dump. /// //===----------------------------------------------------------------------===// diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md index a245f3deb1812..24d56e8e75f47 100644 --- a/llvm/docs/ReleaseNotes.md +++ b/llvm/docs/ReleaseNotes.md @@ -182,7 +182,7 @@ Changes to LLDB * Support for FreeBSD on MIPS64 has been removed. * The minimum assumed version of FreeBSD is now 14. The effect of which is that watchpoints are assumed to be supported. -* Kernel debugging support for ARM on FreeBSD has been added. +* Kernel debugging support for FreeBSD on ARM has been added. Changes to BOLT --------------- >From 5ccef640a90d1df18f191a3dc411c066fe40628b Mon Sep 17 00:00:00 2001 From: Minsoo Choo <[email protected]> Date: Thu, 12 Feb 2026 10:24:42 -0500 Subject: [PATCH 4/5] fixup! [lldb][Process/FreeBSDKernel] Add arm support Signed-off-by: Minsoo Choo <[email protected]> --- .../Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.cpp | 1 + llvm/docs/ReleaseNotes.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.cpp b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.cpp index 71da0ed99dffa..6794778cd4399 100644 --- a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.cpp +++ b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm.cpp @@ -52,6 +52,7 @@ bool RegisterContextFreeBSDKernel_arm::ReadRegister( // 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; diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md index 3dbec77b8fee0..9111bacd550af 100644 --- a/llvm/docs/ReleaseNotes.md +++ b/llvm/docs/ReleaseNotes.md @@ -186,10 +186,10 @@ Changes to LLDB #### Userspace Debugging +* Support for ARM has been added. * Support for MIPS64 has been removed. * The minimum assumed FreeBSD version is now 14. The effect of which is that watchpoints are assumed to be supported. -* Kernel debugging support for FreeBSD on ARM has been added. #### Kernel Debugging >From 21a4f7a2c30d30405afcf855e8ecc0cb14afdd08 Mon Sep 17 00:00:00 2001 From: Minsoo Choo <[email protected]> Date: Thu, 12 Feb 2026 10:34:32 -0500 Subject: [PATCH 5/5] fixup! [lldb][Process/FreeBSDKernel] Add arm support Signed-off-by: Minsoo Choo <[email protected]> --- llvm/docs/ReleaseNotes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md index 9111bacd550af..24f0fc01402d9 100644 --- a/llvm/docs/ReleaseNotes.md +++ b/llvm/docs/ReleaseNotes.md @@ -186,13 +186,13 @@ Changes to LLDB #### Userspace Debugging -* Support for ARM has been added. * Support for MIPS64 has been removed. * The minimum assumed FreeBSD version is now 14. The effect of which is that watchpoints are assumed to be supported. #### Kernel Debugging +* 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. _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
