[Lldb-commits] [lldb] [llvm] [lldb][Process/FreeBSDKernel] Add ppc and ppc64le support (PR #180669)

Minsoo Choo via lldb-commits lldb-commits at lists.llvm.org
Tue Feb 10 10:14:29 PST 2026


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 <minsoochoo0122 at proton.me>
Date: Mon, 9 Feb 2026 21:09:42 -0500
Subject: [PATCH 1/2] [lldb][Process/FreeBSDKernel] Add ppc64le support

Signed-off-by: Minsoo Choo <minsoochoo0122 at proton.me>
---
 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 37f5490249d5c53bf3403ee078d08e3546f832cd Mon Sep 17 00:00:00 2001
From: Minsoo Choo <minsoochoo0122 at proton.me>
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 <minsoochoo0122 at proton.me>
---
 .../Process/FreeBSDKernel/CMakeLists.txt      |   1 +
 .../RegisterContextFreeBSDKernel_powerpc.cpp  | 101 ++++++++++++++++++
 .../RegisterContextFreeBSDKernel_powerpc.h    |  40 +++++++
 .../RegisterContextFreeBSDKernel_ppc64le.cpp  |  10 +-
 .../RegisterContextFreeBSDKernel_ppc64le.h    |   9 +-
 .../FreeBSDKernel/ThreadFreeBSDKernel.cpp     |   7 ++
 .../Plugins/Process/Utility/CMakeLists.txt    |   1 +
 .../Utility/RegisterInfoPOSIX_powerpc.cpp     |  63 +++++++++++
 .../Utility/RegisterInfoPOSIX_powerpc.h       |  31 ++++++
 llvm/docs/ReleaseNotes.md                     |   2 +-
 10 files changed, 261 insertions(+), 4 deletions(-)
 create mode 100644 lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_powerpc.cpp
 create mode 100644 lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_powerpc.h
 create mode 100644 lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_powerpc.cpp
 create mode 100644 lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_powerpc.h

diff --git a/lldb/source/Plugins/Process/FreeBSDKernel/CMakeLists.txt b/lldb/source/Plugins/Process/FreeBSDKernel/CMakeLists.txt
index 251e8cea784af..6b7ed1a3ab4c2 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_powerpc.cpp
   RegisterContextFreeBSDKernel_ppc64le.cpp
   RegisterContextFreeBSDKernel_x86_64.cpp
   ThreadFreeBSDKernel.cpp
diff --git a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_powerpc.cpp b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_powerpc.cpp
new file mode 100644
index 0000000000000..cb8265cfd99cf
--- /dev/null
+++ b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_powerpc.cpp
@@ -0,0 +1,101 @@
+//===----------------------------------------------------------------------===//
+//
+// 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_powerpc class, which is used for reading
+/// registers from PCB on powerpc kernel dump.
+///
+//===----------------------------------------------------------------------===//
+
+#include "RegisterContextFreeBSDKernel_powerpc.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_powerpc::RegisterContextFreeBSDKernel_powerpc(
+    Thread &thread, lldb_private::RegisterInfoInterface *register_info,
+    lldb::addr_t pcb_addr)
+    : RegisterContextPOSIX_powerpc(thread, 0, register_info),
+      m_pcb_addr(pcb_addr) {}
+
+bool RegisterContextFreeBSDKernel_powerpc::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_powerpc:
+    // r1 is saved in the sp field
+    value = pcb.sp;
+    break;
+  case gpr_r2_powerpc:
+    // r2 is saved in the toc field
+    value = pcb.toc;
+    break;
+  case gpr_r12_powerpc:
+  case gpr_r13_powerpc:
+  case gpr_r14_powerpc:
+  case gpr_r15_powerpc:
+  case gpr_r16_powerpc:
+  case gpr_r17_powerpc:
+  case gpr_r18_powerpc:
+  case gpr_r19_powerpc:
+  case gpr_r20_powerpc:
+  case gpr_r21_powerpc:
+  case gpr_r22_powerpc:
+  case gpr_r23_powerpc:
+  case gpr_r24_powerpc:
+  case gpr_r25_powerpc:
+  case gpr_r26_powerpc:
+  case gpr_r27_powerpc:
+  case gpr_r28_powerpc:
+  case gpr_r29_powerpc:
+  case gpr_r30_powerpc:
+  case gpr_r31_powerpc:
+    value = pcb.context[reg - gpr_r12_powerpc];
+    break;
+  case gpr_pc_powerpc:
+  case gpr_lr_powerpc:
+    // The pc of crashing thread is stored in lr.
+    value = pcb.lr;
+    break;
+  case gpr_cr_powerpc:
+    value = pcb.cr;
+    break;
+  default:
+    return false;
+  }
+  return true;
+}
+
+bool RegisterContextFreeBSDKernel_powerpc::WriteRegister(
+    const RegisterInfo *reg_info, const RegisterValue &value) {
+  return false;
+}
diff --git a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_powerpc.h b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_powerpc.h
new file mode 100644
index 0000000000000..a3be95af8c015
--- /dev/null
+++ b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_powerpc.h
@@ -0,0 +1,40 @@
+//===----------------------------------------------------------------------===//
+//
+// 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_powerpc class, which is used for reading
+/// registers from PCB on powerpc kernel dump.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNEL_POWERPC_H
+#define LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNEL_POWERPC_H
+
+#include "Plugins/Process/Utility/RegisterContextPOSIX_powerpc.h"
+#include "Plugins/Process/elf-core/RegisterUtilities.h"
+
+class RegisterContextFreeBSDKernel_powerpc
+    : public RegisterContextPOSIX_powerpc {
+public:
+  RegisterContextFreeBSDKernel_powerpc(
+      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_POWERPC_H
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/lldb/source/Plugins/Process/FreeBSDKernel/ThreadFreeBSDKernel.cpp b/lldb/source/Plugins/Process/FreeBSDKernel/ThreadFreeBSDKernel.cpp
index 7f55ea509fb3e..dada904c91a6c 100644
--- a/lldb/source/Plugins/Process/FreeBSDKernel/ThreadFreeBSDKernel.cpp
+++ b/lldb/source/Plugins/Process/FreeBSDKernel/ThreadFreeBSDKernel.cpp
@@ -15,10 +15,12 @@
 #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_powerpc.h"
 #include "Plugins/Process/Utility/RegisterInfoPOSIX_ppc64le.h"
 #include "ProcessFreeBSDKernel.h"
 #include "RegisterContextFreeBSDKernel_arm64.h"
 #include "RegisterContextFreeBSDKernel_i386.h"
+#include "RegisterContextFreeBSDKernel_powerpc.h"
 #include "RegisterContextFreeBSDKernel_ppc64le.h"
 #include "RegisterContextFreeBSDKernel_x86_64.h"
 
@@ -64,6 +66,11 @@ ThreadFreeBSDKernel::CreateRegisterContextForFrame(StackFrame *frame) {
               *this, std::make_unique<RegisterInfoPOSIX_arm64>(arch, 0),
               m_pcb_addr);
       break;
+    case llvm::Triple::ppc:
+      m_thread_reg_ctx_sp =
+          std::make_shared<RegisterContextFreeBSDKernel_powerpc>(
+              *this, new RegisterInfoPOSIX_powerpc(arch), m_pcb_addr);
+      break;
     case llvm::Triple::ppc64le:
       m_thread_reg_ctx_sp =
           std::make_shared<RegisterContextFreeBSDKernel_ppc64le>(
diff --git a/lldb/source/Plugins/Process/Utility/CMakeLists.txt b/lldb/source/Plugins/Process/Utility/CMakeLists.txt
index 9148465607b7d..6589d0d859960 100644
--- a/lldb/source/Plugins/Process/Utility/CMakeLists.txt
+++ b/lldb/source/Plugins/Process/Utility/CMakeLists.txt
@@ -57,6 +57,7 @@ add_lldb_library(lldbPluginProcessUtility
   RegisterInfoPOSIX_arm.cpp
   RegisterInfoPOSIX_arm64.cpp
   RegisterInfoPOSIX_loongarch64.cpp
+  RegisterInfoPOSIX_powerpc.cpp
   RegisterInfoPOSIX_ppc64le.cpp
   RegisterInfoPOSIX_riscv32.cpp
   RegisterInfoPOSIX_riscv64.cpp
diff --git a/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_powerpc.cpp b/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_powerpc.cpp
new file mode 100644
index 0000000000000..730abe54c9dae
--- /dev/null
+++ b/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_powerpc.cpp
@@ -0,0 +1,63 @@
+//===-- RegisterInfoPOSIX_powerpc.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 <cassert>
+#include <cstddef>
+#include <vector>
+
+#include "lldb/lldb-defines.h"
+#include "llvm/Support/Compiler.h"
+
+#include "RegisterInfoPOSIX_powerpc.h"
+
+// Include RegisterInfoPOSIX_powerpc to declare our g_register_infos_powerpc
+#define DECLARE_REGISTER_INFOS_POWERPC_STRUCT
+#include "RegisterInfos_powerpc.h"
+#undef DECLARE_REGISTER_INFOS_POWERPC_STRUCT
+
+static const lldb_private::RegisterInfo *
+GetRegisterInfoPtr(const lldb_private::ArchSpec &target_arch) {
+  switch (target_arch.GetMachine()) {
+  case llvm::Triple::ppc:
+    return g_register_infos_powerpc;
+  default:
+    assert(false && "Unhandled target architecture.");
+    return nullptr;
+  }
+}
+
+static uint32_t
+GetRegisterInfoCount(const lldb_private::ArchSpec &target_arch) {
+  switch (target_arch.GetMachine()) {
+  case llvm::Triple::ppc:
+    return static_cast<uint32_t>(sizeof(g_register_infos_powerpc) /
+                                 sizeof(g_register_infos_powerpc[0]));
+  default:
+    assert(false && "Unhandled target architecture.");
+    return 0;
+  }
+}
+
+RegisterInfoPOSIX_powerpc::RegisterInfoPOSIX_powerpc(
+    const lldb_private::ArchSpec &target_arch)
+    : lldb_private::RegisterInfoInterface(target_arch),
+      m_register_info_p(GetRegisterInfoPtr(target_arch)),
+      m_register_info_count(GetRegisterInfoCount(target_arch)) {}
+
+size_t RegisterInfoPOSIX_powerpc::GetGPRSize() const {
+  return sizeof(GPR);
+}
+
+const lldb_private::RegisterInfo *
+RegisterInfoPOSIX_powerpc::GetRegisterInfo() const {
+  return m_register_info_p;
+}
+
+uint32_t RegisterInfoPOSIX_powerpc::GetRegisterCount() const {
+  return m_register_info_count;
+}
diff --git a/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_powerpc.h b/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_powerpc.h
new file mode 100644
index 0000000000000..63dabb24232ac
--- /dev/null
+++ b/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_powerpc.h
@@ -0,0 +1,31 @@
+//===-- RegisterInfoPOSIX_powerpc.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_UTILITY_REGISTERINFOPOSIX_POWERPC_H
+#define LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERINFOPOSIX_POWERPC_H
+
+#include "RegisterInfoInterface.h"
+#include "lldb/Target/RegisterContext.h"
+#include "lldb/lldb-private.h"
+
+class RegisterInfoPOSIX_powerpc : public lldb_private::RegisterInfoInterface {
+public:
+  RegisterInfoPOSIX_powerpc(const lldb_private::ArchSpec &target_arch);
+
+  size_t GetGPRSize() const override;
+
+  const lldb_private::RegisterInfo *GetRegisterInfo() const override;
+
+  uint32_t GetRegisterCount() const override;
+
+private:
+  const lldb_private::RegisterInfo *m_register_info_p;
+  uint32_t m_register_info_count;
+};
+
+#endif
diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md
index a7e65fb12839a..177c40ed5b4ee 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 PPC and PPC64le has been added.
 
 Changes to BOLT
 ---------------



More information about the lldb-commits mailing list