[Lldb-commits] [lldb] 3088d0a - [lldb][FreeBSDKernel] Support cross-architecture FreeBSD kernel cores (#223593)
via lldb-commits
lldb-commits at lists.llvm.org
Fri Sep 18 21:19:39 PDT 2026
Author: Minsoo Choo
Date: 2026-09-19T00:19:33-04:00
New Revision: 3088d0aace62a33925ade51e238b9a1ae7ff30c0
URL: https://github.com/llvm/llvm-project/commit/3088d0aace62a33925ade51e238b9a1ae7ff30c0
DIFF: https://github.com/llvm/llvm-project/commit/3088d0aace62a33925ade51e238b9a1ae7ff30c0.diff
LOG: [lldb][FreeBSDKernel] Support cross-architecture FreeBSD kernel cores (#223593)
FreeBSD's kvm_open(3) man page states that a valid resolver is required
to debug non-native kernel images as libkvm needs to map symbol names to
kernel virtual addresses. Since ProcessFreeBSDKernelCore aims to debug
kernel image and core dump from any architectures, pass a valid resolver
to kvm_open2().
Assisted-by: GPT
Added:
Modified:
lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp
lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h
Removed:
################################################################################
diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp
index cfdf742ab5230..e99f97f2b0cd6 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"
@@ -134,9 +135,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 +195,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);
@@ -551,6 +551,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 477ae77791e51..3105b01a42eec 100644
--- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h
+++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h
@@ -10,6 +10,7 @@
#define LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_PROCESSFREEBSDKERNELCORE_H
#include "lldb/Core/Debugger.h"
+#include "lldb/Core/Module.h"
#include "lldb/Target/PostMortemProcess.h"
#include <kvm.h>
@@ -68,6 +69,15 @@ 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