[Lldb-commits] [lldb] [lldb][FreeBSDKernel] Support cross-architecture FreeBSD kernel cores (PR #223593)

Minsoo Choo via lldb-commits lldb-commits at lists.llvm.org
Tue Sep 15 06:46:31 PDT 2026


https://github.com/mchoo7 updated https://github.com/llvm/llvm-project/pull/223593

>From 2418f233bc0e548a6cf9aac7f88c024caebe3a1e Mon Sep 17 00:00:00 2001
From: Minsoo Choo <minsoo at minsoo.io>
Date: Mon, 14 Sep 2026 22:29:33 -0400
Subject: [PATCH 1/2] [lldb] Support cross-architecture FreeBSD kernel cores

---
 .../ProcessFreeBSDKernelCore.cpp              | 42 ++++++++++++++++---
 1 file changed, 37 insertions(+), 5 deletions(-)

diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp
index 22e574c6e26242..7072677af67d27 100644
--- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp
+++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp
@@ -18,6 +18,7 @@
 #include "lldb/Utility/StreamString.h"
 
 #include "llvm/Support/Error.h"
+#include "llvm/Support/SaveAndRestore.h"
 
 #include "Plugins/DynamicLoader/FreeBSD-Kernel/DynamicLoaderFreeBSDKernel.h"
 #include "ProcessFreeBSDKernelCore.h"
@@ -59,6 +60,38 @@ class PluginProperties : public Properties {
 
 } // namespace
 
+namespace {
+
+thread_local Module *g_kvm_kernel_module;
+
+int ResolveKVMSymbol(const char *name, kvaddr_t *value) {
+  if (!g_kvm_kernel_module)
+    return 1;
+
+  const Symbol *symbol =
+      g_kvm_kernel_module->FindFirstSymbolWithNameAndType(ConstString(name));
+  if (!symbol)
+    return 1;
+
+  lldb::addr_t address = symbol->GetFileAddress();
+  if (address == LLDB_INVALID_ADDRESS)
+    return 1;
+
+  *value = address;
+  return 0;
+}
+
+kvm_t *OpenKVM(const ModuleSP &kernel_module, const FileSpec &core_file,
+               int flags, char *errbuf) {
+  llvm::SaveAndRestore resolver_module(g_kvm_kernel_module,
+                                       kernel_module.get());
+  return kvm_open2(kernel_module->GetFileSpec().GetPath().c_str(),
+                   core_file.GetPath().c_str(), flags, errbuf,
+                   ResolveKVMSymbol);
+}
+
+} // namespace
+
 static PluginProperties &GetGlobalPluginProperties() {
   static PluginProperties g_settings;
   return g_settings;
@@ -134,9 +167,7 @@ lldb::ProcessSP ProcessFreeBSDKernelCore::CreateInstance(
   ModuleSP executable = target_sp->GetExecutableModule();
   if (crash_file && !can_connect && executable) {
     char errbuf[_POSIX2_LINE_MAX];
-    kvm_t *kvm =
-        kvm_open2(executable->GetFileSpec().GetPath().c_str(),
-                  crash_file->GetPath().c_str(), O_RDONLY, errbuf, nullptr);
+    kvm_t *kvm = OpenKVM(executable, *crash_file, O_RDONLY, errbuf);
     if (kvm) {
       kvm_close(kvm);
       return std::make_shared<ProcessFreeBSDKernelCore>(target_sp, listener_sp,
@@ -196,8 +227,9 @@ Status ProcessFreeBSDKernelCore::DoLoadCore() {
         "ProcessFreeBSDKernelCore: no executable module set on target");
 
   char errbuf[_POSIX2_LINE_MAX];
-  m_kvm = kvm_open2(executable->GetFileSpec().GetPath().c_str(),
-                    GetCoreFile().GetPath().c_str(), O_RDWR, errbuf, nullptr);
+  const int flags =
+      GetGlobalPluginProperties().GetReadOnly() ? O_RDONLY : O_RDWR;
+  m_kvm = OpenKVM(executable, GetCoreFile(), flags, errbuf);
 
   if (!m_kvm) {
     LLDB_LOGF(GetLog(LLDBLog::Process), "FreeBSD-Kernel-Core: %s", errbuf);

>From b270ab5c51ce588b810b4115d6c5a4294b82146c Mon Sep 17 00:00:00 2001
From: Minsoo Choo <minsoo at minsoo.io>
Date: Tue, 15 Sep 2026 09:43:27 -0400
Subject: [PATCH 2/2] fixup! [lldb] Support cross-architecture FreeBSD kernel
 cores

---
 .../ProcessFreeBSDKernelCore.cpp              | 60 +++++++++----------
 .../ProcessFreeBSDKernelCore.h                | 12 ++++
 2 files changed, 40 insertions(+), 32 deletions(-)

diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp
index 7072677af67d27..7fa2dd95a6de16 100644
--- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp
+++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp
@@ -60,38 +60,6 @@ class PluginProperties : public Properties {
 
 } // namespace
 
-namespace {
-
-thread_local Module *g_kvm_kernel_module;
-
-int ResolveKVMSymbol(const char *name, kvaddr_t *value) {
-  if (!g_kvm_kernel_module)
-    return 1;
-
-  const Symbol *symbol =
-      g_kvm_kernel_module->FindFirstSymbolWithNameAndType(ConstString(name));
-  if (!symbol)
-    return 1;
-
-  lldb::addr_t address = symbol->GetFileAddress();
-  if (address == LLDB_INVALID_ADDRESS)
-    return 1;
-
-  *value = address;
-  return 0;
-}
-
-kvm_t *OpenKVM(const ModuleSP &kernel_module, const FileSpec &core_file,
-               int flags, char *errbuf) {
-  llvm::SaveAndRestore resolver_module(g_kvm_kernel_module,
-                                       kernel_module.get());
-  return kvm_open2(kernel_module->GetFileSpec().GetPath().c_str(),
-                   core_file.GetPath().c_str(), flags, errbuf,
-                   ResolveKVMSymbol);
-}
-
-} // namespace
-
 static PluginProperties &GetGlobalPluginProperties() {
   static PluginProperties g_settings;
   return g_settings;
@@ -569,6 +537,34 @@ lldb::addr_t ProcessFreeBSDKernelCore::FindSymbol(const char *name) {
   return sym ? sym->GetLoadAddress(&GetTarget()) : LLDB_INVALID_ADDRESS;
 }
 
+int ProcessFreeBSDKernelCore::ResolveKVMSymbol(const char *name,
+                                               kvaddr_t *value) {
+  if (!g_kvm_kernel_module)
+    return 1;
+
+  const Symbol *symbol =
+      g_kvm_kernel_module->FindFirstSymbolWithNameAndType(ConstString(name));
+  if (!symbol)
+    return 1;
+
+  lldb::addr_t address = symbol->GetFileAddress();
+  if (address == LLDB_INVALID_ADDRESS)
+    return 1;
+
+  *value = address;
+  return 0;
+}
+
+kvm_t *ProcessFreeBSDKernelCore::OpenKVM(const ModuleSP &kernel_module,
+                                         const FileSpec &core_file, int flags,
+                                         char *errbuf) {
+  llvm::SaveAndRestore resolver_module(g_kvm_kernel_module,
+                                       kernel_module.get());
+  return kvm_open2(kernel_module->GetFileSpec().GetPath().c_str(),
+                   core_file.GetPath().c_str(), flags, errbuf,
+                   ResolveKVMSymbol);
+}
+
 void ProcessFreeBSDKernelCore::SetKernelDisplacement() {
   kssize_t displacement = kvm_kerndisp(m_kvm);
 
diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h
index 477ae77791e51b..c73fe5881a0905 100644
--- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h
+++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h
@@ -14,6 +14,10 @@
 
 #include <kvm.h>
 
+namespace lldb_private {
+class Module;
+}
+
 class ProcessFreeBSDKernelCore : public lldb_private::PostMortemProcess {
 public:
   ProcessFreeBSDKernelCore(lldb::TargetSP target_sp, lldb::ListenerSP listener,
@@ -68,6 +72,14 @@ class ProcessFreeBSDKernelCore : public lldb_private::PostMortemProcess {
   lldb::addr_t FindSymbol(const char *name);
 
 private:
+  static inline thread_local lldb_private::Module *g_kvm_kernel_module = nullptr;
+
+  static int ResolveKVMSymbol(const char *name, kvaddr_t *value);
+
+  static kvm_t *OpenKVM(const lldb::ModuleSP &kernel_module,
+                        const lldb_private::FileSpec &core_file, int flags,
+                        char *errbuf);
+
   void SetKernelDisplacement();
 
   void PrintUnreadMessage();



More information about the lldb-commits mailing list