Author: Minsoo Choo
Date: 2026-02-25T10:48:46-05:00
New Revision: 3d251288df0642762d1bd86efa05e190005c2539

URL: 
https://github.com/llvm/llvm-project/commit/3d251288df0642762d1bd86efa05e190005c2539
DIFF: 
https://github.com/llvm/llvm-project/commit/3d251288df0642762d1bd86efa05e190005c2539.diff

LOG: [lldb][Process/FreeBSDKernel] Add arm support (#180674)

This is LLDB version of
https://cgit.freebsd.org/ports/tree/devel/gdb/files/kgdb/arm-fbsd-kern.c.
This enables selecting arm and reading registers from PCB structure on
core dump and live kernel debugging while trapframe unwinding support
will be implemented in future. Test files using core dump from arm 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_arm.cpp
    
lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_arm.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 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/FreeBSD-Kernel-Core/CMakeLists.txt 
b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/CMakeLists.txt
index 8aafee3e43314..1cb96b7c3f523 100644
--- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/CMakeLists.txt
+++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/CMakeLists.txt
@@ -1,5 +1,6 @@
 add_lldb_library(lldbPluginProcessFreeBSDKernelCore PLUGIN
   ProcessFreeBSDKernelCore.cpp
+  RegisterContextFreeBSDKernelCore_arm.cpp
   RegisterContextFreeBSDKernelCore_arm64.cpp
   RegisterContextFreeBSDKernelCore_i386.cpp
   RegisterContextFreeBSDKernelCore_x86_64.cpp

diff  --git 
a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_arm.cpp
 
b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_arm.cpp
new file mode 100644
index 0000000000000..0d01a0ec48d3e
--- /dev/null
+++ 
b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_arm.cpp
@@ -0,0 +1,102 @@
+//===----------------------------------------------------------------------===//
+//
+// 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_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;
+
+RegisterContextFreeBSDKernelCore_arm::RegisterContextFreeBSDKernelCore_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 RegisterContextFreeBSDKernelCore_arm::ReadGPR() { return true; }
+
+bool RegisterContextFreeBSDKernelCore_arm::ReadFPR() { return true; }
+
+bool RegisterContextFreeBSDKernelCore_arm::WriteGPR() {
+  assert(0);
+  return false;
+}
+
+bool RegisterContextFreeBSDKernelCore_arm::WriteFPR() {
+  assert(0);
+  return false;
+}
+
+bool RegisterContextFreeBSDKernelCore_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 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;
+    llvm::support::ulittle32_t r7;
+    llvm::support::ulittle32_t r8;
+    llvm::support::ulittle32_t r9;
+    llvm::support::ulittle32_t r10;
+    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;
+  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 RegisterContextFreeBSDKernelCore_arm::WriteRegister(
+    const RegisterInfo *reg_info, const RegisterValue &value) {
+  return false;
+}

diff  --git 
a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_arm.h
 
b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_arm.h
new file mode 100644
index 0000000000000..cdd9f1b3288c1
--- /dev/null
+++ 
b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/RegisterContextFreeBSDKernelCore_arm.h
@@ -0,0 +1,41 @@
+//===----------------------------------------------------------------------===//
+//
+// 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_ARM_H
+#define 
LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNELCORE_ARM_H
+
+#include "Plugins/Process/Utility/RegisterContextPOSIX_arm.h"
+#include "Plugins/Process/elf-core/RegisterUtilities.h"
+
+class RegisterContextFreeBSDKernelCore_arm : public RegisterContextPOSIX_arm {
+public:
+  RegisterContextFreeBSDKernelCore_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_REGISTERCONTEXTFREEBSDKERNELCORE_ARM_H

diff  --git 
a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ThreadFreeBSDKernelCore.cpp 
b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ThreadFreeBSDKernelCore.cpp
index b6ac0b2994dbc..17e0ac8e23e7f 100644
--- 
a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ThreadFreeBSDKernelCore.cpp
+++ 
b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ThreadFreeBSDKernelCore.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 "ProcessFreeBSDKernelCore.h"
+#include "RegisterContextFreeBSDKernelCore_arm.h"
 #include "RegisterContextFreeBSDKernelCore_arm64.h"
 #include "RegisterContextFreeBSDKernelCore_i386.h"
 #include "RegisterContextFreeBSDKernelCore_x86_64.h"
@@ -63,6 +65,11 @@ 
ThreadFreeBSDKernelCore::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<RegisterContextFreeBSDKernelCore_arm>(
+              *this, std::make_unique<RegisterInfoPOSIX_arm>(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 8bfb060cb29b8..b8a576b55949c 100644
--- a/llvm/docs/ReleaseNotes.md
+++ b/llvm/docs/ReleaseNotes.md
@@ -219,6 +219,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.
 * 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