https://github.com/mchoo7 updated https://github.com/llvm/llvm-project/pull/180669
>From 70838f6f79d2f8867eec26af7b52d37d7e76be1b Mon Sep 17 00:00:00 2001 From: Minsoo Choo <[email protected]> Date: Mon, 9 Feb 2026 21:09:42 -0500 Subject: [PATCH 1/2] [lldb][Process/FreeBSDKernel] Add ppc64le support Signed-off-by: Minsoo Choo <[email protected]> --- lldb/docs/index.rst | 2 +- .../Process/FreeBSDKernel/CMakeLists.txt | 1 + .../RegisterContextFreeBSDKernel_ppc64le.cpp | 95 +++++++++++++++++++ .../RegisterContextFreeBSDKernel_ppc64le.h | 33 +++++++ .../FreeBSDKernel/ThreadFreeBSDKernel.cpp | 7 ++ llvm/docs/ReleaseNotes.md | 1 + 6 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_ppc64le.cpp create mode 100644 lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_ppc64le.h diff --git a/lldb/docs/index.rst b/lldb/docs/index.rst index 10683c7593b01..60c57f51e977f 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, AArch64, PPC64le * 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..251e8cea784af 100644 --- a/lldb/source/Plugins/Process/FreeBSDKernel/CMakeLists.txt +++ b/lldb/source/Plugins/Process/FreeBSDKernel/CMakeLists.txt @@ -15,6 +15,7 @@ add_lldb_library(lldbPluginProcessFreeBSDKernel PLUGIN ProcessFreeBSDKernel.cpp RegisterContextFreeBSDKernel_arm64.cpp RegisterContextFreeBSDKernel_i386.cpp + RegisterContextFreeBSDKernel_ppc64le.cpp RegisterContextFreeBSDKernel_x86_64.cpp ThreadFreeBSDKernel.cpp diff --git a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_ppc64le.cpp b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_ppc64le.cpp new file mode 100644 index 0000000000000..5fb2908bfdb2c --- /dev/null +++ b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_ppc64le.cpp @@ -0,0 +1,95 @@ +//===-- RegisterContextFreeBSDKernel_ppc64le.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_ppc64le.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_ppc64le::RegisterContextFreeBSDKernel_ppc64le( + Thread &thread, lldb_private::RegisterInfoInterface *register_info, + lldb::addr_t pcb_addr) + : RegisterContextPOSIX_ppc64le(thread, 0, register_info), + m_pcb_addr(pcb_addr) {} + +bool RegisterContextFreeBSDKernel_ppc64le::ReadRegister( + const RegisterInfo *reg_info, RegisterValue &value) { + if (m_pcb_addr == LLDB_INVALID_ADDRESS) + return false; + + // https://cgit.freebsd.org/src/tree/sys/powerpc/include/pcb.h + struct { + llvm::support::ulittle64_t context[20]; + llvm::support::ulittle64_t cr; + llvm::support::ulittle64_t sp; + llvm::support::ulittle64_t toc; + llvm::support::ulittle64_t lr; + } 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) { + case gpr_r1_ppc64le: + // r1 is saved in the sp field + value = pcb.sp; + break; + case gpr_r2_ppc64le: + // r2 is saved in the toc field + value = pcb.toc; + break; + case gpr_r12_ppc64le: + case gpr_r13_ppc64le: + case gpr_r14_ppc64le: + case gpr_r15_ppc64le: + case gpr_r16_ppc64le: + case gpr_r17_ppc64le: + case gpr_r18_ppc64le: + case gpr_r19_ppc64le: + case gpr_r20_ppc64le: + case gpr_r21_ppc64le: + case gpr_r22_ppc64le: + case gpr_r23_ppc64le: + case gpr_r24_ppc64le: + case gpr_r25_ppc64le: + case gpr_r26_ppc64le: + case gpr_r27_ppc64le: + case gpr_r28_ppc64le: + case gpr_r29_ppc64le: + case gpr_r30_ppc64le: + case gpr_r31_ppc64le: + value = pcb.context[reg - gpr_r12_ppc64le]; + break; + case gpr_pc_ppc64le: + case gpr_lr_ppc64le: + // The pc of crashing thread is stored in lr. + value = pcb.lr; + break; + case gpr_cr_ppc64le: + value = pcb.cr; + break; + default: + return false; + } + return true; +} + +bool RegisterContextFreeBSDKernel_ppc64le::WriteRegister( + const RegisterInfo *reg_info, const RegisterValue &value) { + return false; +} diff --git a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_ppc64le.h b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_ppc64le.h new file mode 100644 index 0000000000000..2f90a0e4bce0a --- /dev/null +++ b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_ppc64le.h @@ -0,0 +1,33 @@ +//===-- RegisterContextFreeBSDKernel_ppc64le.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_PPC64LE_H +#define LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNEL_PPC64LE_H + +#include "Plugins/Process/Utility/RegisterContextPOSIX_ppc64le.h" +#include "Plugins/Process/elf-core/RegisterUtilities.h" + +class RegisterContextFreeBSDKernel_ppc64le + : public RegisterContextPOSIX_ppc64le { +public: + RegisterContextFreeBSDKernel_ppc64le( + lldb_private::Thread &thread, + lldb_private::RegisterInfoInterface *register_info, + 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; + +private: + lldb::addr_t m_pcb_addr; +}; + +#endif // LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNEL_PPC64LE_H diff --git a/lldb/source/Plugins/Process/FreeBSDKernel/ThreadFreeBSDKernel.cpp b/lldb/source/Plugins/Process/FreeBSDKernel/ThreadFreeBSDKernel.cpp index dd1ed52719749..7f55ea509fb3e 100644 --- a/lldb/source/Plugins/Process/FreeBSDKernel/ThreadFreeBSDKernel.cpp +++ b/lldb/source/Plugins/Process/FreeBSDKernel/ThreadFreeBSDKernel.cpp @@ -15,9 +15,11 @@ #include "Plugins/Process/Utility/RegisterContextFreeBSD_i386.h" #include "Plugins/Process/Utility/RegisterContextFreeBSD_x86_64.h" #include "Plugins/Process/Utility/RegisterInfoPOSIX_arm64.h" +#include "Plugins/Process/Utility/RegisterInfoPOSIX_ppc64le.h" #include "ProcessFreeBSDKernel.h" #include "RegisterContextFreeBSDKernel_arm64.h" #include "RegisterContextFreeBSDKernel_i386.h" +#include "RegisterContextFreeBSDKernel_ppc64le.h" #include "RegisterContextFreeBSDKernel_x86_64.h" using namespace lldb; @@ -62,6 +64,11 @@ ThreadFreeBSDKernel::CreateRegisterContextForFrame(StackFrame *frame) { *this, std::make_unique<RegisterInfoPOSIX_arm64>(arch, 0), m_pcb_addr); break; + case llvm::Triple::ppc64le: + m_thread_reg_ctx_sp = + std::make_shared<RegisterContextFreeBSDKernel_ppc64le>( + *this, new RegisterInfoPOSIX_ppc64le(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..a7e65fb12839a 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 PPC64le on FreeBSD has been added. Changes to BOLT --------------- >From 2878f597b4d9dbdbad7c9582a8dfbfc48b24639e Mon Sep 17 00:00:00 2001 From: Minsoo Choo <[email protected]> Date: Tue, 10 Feb 2026 10:44:55 -0500 Subject: [PATCH 2/2] fixup! [lldb][Process/FreeBSDKernel] Add ppc64le support Signed-off-by: Minsoo Choo <[email protected]> --- .../RegisterContextFreeBSDKernel_ppc64le.cpp | 10 ++++++++-- .../RegisterContextFreeBSDKernel_ppc64le.h | 9 ++++++++- llvm/docs/ReleaseNotes.md | 2 +- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_ppc64le.cpp b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_ppc64le.cpp index 5fb2908bfdb2c..89bd8e145aa22 100644 --- a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_ppc64le.cpp +++ b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_ppc64le.cpp @@ -1,11 +1,17 @@ -//===-- RegisterContextFreeBSDKernel_ppc64le.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_ppc64le class, which is used for reading +/// registers from PCB on ppc64le kernel dump. +/// +//===----------------------------------------------------------------------===// #include "RegisterContextFreeBSDKernel_ppc64le.h" diff --git a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_ppc64le.h b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_ppc64le.h index 2f90a0e4bce0a..dac091df0ef3f 100644 --- a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_ppc64le.h +++ b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_ppc64le.h @@ -1,10 +1,17 @@ -//===-- RegisterContextFreeBSDKernel_ppc64le.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_ppc64le class, which is used for reading +/// registers from PCB on ppc64le kernel dump. +/// +//===----------------------------------------------------------------------===// #ifndef LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNEL_PPC64LE_H #define LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNEL_PPC64LE_H diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md index a7e65fb12839a..15a669c937cf8 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 PPC64le on FreeBSD has been added. +* Kernel debugging support for FreeBSD on PPC64le has been added. Changes to BOLT --------------- _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
