Author: Minsoo Choo
Date: 2026-02-28T10:49:32-05:00
New Revision: 2430410b7d879fce3db76c21bb8c60ed22abd0b5

URL: 
https://github.com/llvm/llvm-project/commit/2430410b7d879fce3db76c21bb8c60ed22abd0b5
DIFF: 
https://github.com/llvm/llvm-project/commit/2430410b7d879fce3db76c21bb8c60ed22abd0b5.diff

LOG: [lldb][Process/FreeBSDKernelCore] Add ppc64le support (#180669)

This is LLDB version of
https://cgit.freebsd.org/ports/tree/devel/gdb/files/kgdb/ppcfbsd-kern.c.
This enables selecting ppc64le and reading registers from PCB structure
on core dump and live kernel debugging. FPU registers aren't supported
yet due to pcb structure issue, but this change still achieves feature
parity with KGDB. Trapframe unwinding support will be implemented in
future. Test files using core dump from ppc64le 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_ppc64le.cpp
    
lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_ppc64le.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 fb5d5341b2f31..bbf6a84d34d9e 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, ARM, AArch64
+* FreeBSD kernel debugging for i386, x86_64, ARM, 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/FreeBSD-Kernel-Core/CMakeLists.txt 
b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/CMakeLists.txt
index d847a2f584bc6..c23af7c345853 100644
--- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/CMakeLists.txt
+++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/CMakeLists.txt
@@ -11,6 +11,7 @@ add_lldb_library(lldbPluginProcessFreeBSDKernelCore PLUGIN
   RegisterContextFreeBSDKernelCore_arm.cpp
   RegisterContextFreeBSDKernelCore_arm64.cpp
   RegisterContextFreeBSDKernelCore_i386.cpp
+  RegisterContextFreeBSDKernelCore_ppc64le.cpp
   RegisterContextFreeBSDKernelCore_x86_64.cpp
   ThreadFreeBSDKernelCore.cpp
 

diff  --git 
a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_ppc64le.cpp
 
b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_ppc64le.cpp
new file mode 100644
index 0000000000000..69932eaeb4e0b
--- /dev/null
+++ 
b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_ppc64le.cpp
@@ -0,0 +1,95 @@
+//===----------------------------------------------------------------------===//
+//
+// 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_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;
+
+RegisterContextFreeBSDKernelCore_ppc64le::
+    RegisterContextFreeBSDKernelCore_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 RegisterContextFreeBSDKernelCore_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 RegisterContextFreeBSDKernelCore_ppc64le::WriteRegister(
+    const RegisterInfo *reg_info, const RegisterValue &value) {
+  return false;
+}

diff  --git 
a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_ppc64le.h
 
b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_ppc64le.h
new file mode 100644
index 0000000000000..5895744e6fa3d
--- /dev/null
+++ 
b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_ppc64le.h
@@ -0,0 +1,33 @@
+//===----------------------------------------------------------------------===//
+//
+// 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_PPC64LE_H
+#define 
LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNELCORE_PPC64LE_H
+
+#include "Plugins/Process/Utility/RegisterContextPOSIX_ppc64le.h"
+#include "Plugins/Process/elf-core/RegisterUtilities.h"
+
+class RegisterContextFreeBSDKernelCore_ppc64le
+    : public RegisterContextPOSIX_ppc64le {
+public:
+  RegisterContextFreeBSDKernelCore_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_REGISTERCONTEXTFREEBSDKERNELCORE_PPC64LE_H

diff  --git 
a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ThreadFreeBSDKernelCore.cpp 
b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ThreadFreeBSDKernelCore.cpp
index 17e0ac8e23e7f..386a2ab29ec24 100644
--- 
a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ThreadFreeBSDKernelCore.cpp
+++ 
b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ThreadFreeBSDKernelCore.cpp
@@ -16,10 +16,12 @@
 #include "Plugins/Process/Utility/RegisterContextFreeBSD_x86_64.h"
 #include "Plugins/Process/Utility/RegisterInfoPOSIX_arm.h"
 #include "Plugins/Process/Utility/RegisterInfoPOSIX_arm64.h"
+#include "Plugins/Process/Utility/RegisterInfoPOSIX_ppc64le.h"
 #include "ProcessFreeBSDKernelCore.h"
 #include "RegisterContextFreeBSDKernelCore_arm.h"
 #include "RegisterContextFreeBSDKernelCore_arm64.h"
 #include "RegisterContextFreeBSDKernelCore_i386.h"
+#include "RegisterContextFreeBSDKernelCore_ppc64le.h"
 #include "RegisterContextFreeBSDKernelCore_x86_64.h"
 
 using namespace lldb;
@@ -70,6 +72,11 @@ 
ThreadFreeBSDKernelCore::CreateRegisterContextForFrame(StackFrame *frame) {
           std::make_shared<RegisterContextFreeBSDKernelCore_arm>(
               *this, std::make_unique<RegisterInfoPOSIX_arm>(arch), 
m_pcb_addr);
       break;
+    case llvm::Triple::ppc64le:
+      m_thread_reg_ctx_sp =
+          std::make_shared<RegisterContextFreeBSDKernelCore_ppc64le>(
+              *this, new RegisterInfoPOSIX_ppc64le(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 3016ed49d8ced..0c0fa1b940645 100644
--- a/llvm/docs/ReleaseNotes.md
+++ b/llvm/docs/ReleaseNotes.md
@@ -221,7 +221,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.
+* Support for ARM and PPC64le 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

Reply via email to