[Lldb-commits] [lldb] [lldb][Process/FreeBSDKernel] Add ppc64le support (PR #180669)
Minsoo Choo via lldb-commits
lldb-commits at lists.llvm.org
Mon Feb 9 18:56:24 PST 2026
https://github.com/mchoo7 created https://github.com/llvm/llvm-project/pull/180669
This is LLDB version of https://cgit.freebsd.org/ports/tree/devel/gdb/files/kgdb/ppcfbsd-kern.c. Trapframe unwinding will be implemented in future.
>From afb2e81570c6699c666d3c5f198c1c8c14d711e8 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] [lldb][Process/FreeBSDKernel] Add ppc64le support
Signed-off-by: Minsoo Choo <minsoochoo0122 at proton.me>
---
.../Process/FreeBSDKernel/CMakeLists.txt | 1 +
.../RegisterContextFreeBSDKernel_ppc64le.cpp | 95 +++++++++++++++++++
.../RegisterContextFreeBSDKernel_ppc64le.h | 33 +++++++
.../FreeBSDKernel/ThreadFreeBSDKernel.cpp | 7 ++
4 files changed, 136 insertions(+)
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/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);
More information about the lldb-commits
mailing list