[Lldb-commits] [lldb] [llvm] [lldb][Process/FreeBSDKernel] Add arm support (PR #180674)

Minsoo Choo via lldb-commits lldb-commits at lists.llvm.org
Thu Feb 12 07:25:47 PST 2026


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 <minsoochoo0122 at proton.me>
Date: Mon, 9 Feb 2026 23:33:16 -0500
Subject: [PATCH 1/4] [lldb][Process/FreeBSDKernel] Add arm support

Signed-off-by: Minsoo Choo <minsoochoo0122 at proton.me>
---
 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 <minsoochoo0122 at proton.me>
Date: Tue, 10 Feb 2026 12:35:17 -0500
Subject: [PATCH 2/4] fixup! [lldb][Process/FreeBSDKernel] Add arm support

Signed-off-by: Minsoo Choo <minsoochoo0122 at proton.me>
---
 .../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 <minsoochoo0122 at proton.me>
Date: Wed, 11 Feb 2026 14:11:17 -0500
Subject: [PATCH 3/4] fixup! [lldb][Process/FreeBSDKernel] Add arm support

Signed-off-by: Minsoo Choo <minsoochoo0122 at proton.me>
---
 .../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 <minsoochoo0122 at proton.me>
Date: Thu, 12 Feb 2026 10:24:42 -0500
Subject: [PATCH 4/4] fixup! [lldb][Process/FreeBSDKernel] Add arm support

Signed-off-by: Minsoo Choo <minsoochoo0122 at proton.me>
---
 .../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
 



More information about the lldb-commits mailing list