[Lldb-commits] [lldb] 62d0608 - [lldb][Process/FreeBSDKernelCore] Set kernel displacement (#183975)
via lldb-commits
lldb-commits at lists.llvm.org
Fri Mar 13 11:46:05 PDT 2026
Author: Minsoo Choo
Date: 2026-03-13T14:46:00-04:00
New Revision: 62d06083ef186abe610de4742c62c84c2f97fcd0
URL: https://github.com/llvm/llvm-project/commit/62d06083ef186abe610de4742c62c84c2f97fcd0
DIFF: https://github.com/llvm/llvm-project/commit/62d06083ef186abe610de4742c62c84c2f97fcd0.diff
LOG: [lldb][Process/FreeBSDKernelCore] Set kernel displacement (#183975)
Use `kvm_kerndisp()` on core load to retrieve the kernel displacement,
that is the difference between the kernel's
base virtual address at run time and the kernel base virtual address
specified in the kernel image file. Currently PowerPC is the only
architecture supporting kernel displacement.
---------
Signed-off-by: Minsoo Choo <minsoochoo0122 at proton.me>
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 ae566624f9ee2..d1a4a1ebc47d7 100644
--- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp
+++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp
@@ -114,6 +114,8 @@ bool ProcessFreeBSDKernelCore::CanDebug(lldb::TargetSP target_sp,
Status ProcessFreeBSDKernelCore::DoLoadCore() {
// The core is already loaded by CreateInstance().
+ SetKernelDisplacement();
+
return Status();
}
@@ -365,6 +367,29 @@ lldb::addr_t ProcessFreeBSDKernelCore::FindSymbol(const char *name) {
return sym ? sym->GetLoadAddress(&GetTarget()) : LLDB_INVALID_ADDRESS;
}
+void ProcessFreeBSDKernelCore::SetKernelDisplacement() {
+ kssize_t displacement = kvm_kerndisp(m_kvm);
+
+ if (displacement == 0)
+ return;
+
+ Target &target = GetTarget();
+ lldb::ModuleSP kernel_module_sp = target.GetExecutableModule();
+ if (!kernel_module_sp)
+ return;
+
+ bool changed = false;
+ kernel_module_sp->SetLoadAddress(target,
+ static_cast<lldb::addr_t>(displacement),
+ /*value_is_offset=*/true, changed);
+
+ if (changed) {
+ ModuleList loaded_module_list;
+ loaded_module_list.Append(kernel_module_sp);
+ target.ModulesDidLoad(loaded_module_list);
+ }
+}
+
void ProcessFreeBSDKernelCore::PrintUnreadMessage() {
Target &target = GetTarget();
Debugger &debugger = target.GetDebugger();
diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h
index 67cfae13d2a4d..d82e55ea74bd9 100644
--- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h
+++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h
@@ -64,6 +64,8 @@ class ProcessFreeBSDKernelCore : public lldb_private::PostMortemProcess {
lldb::addr_t FindSymbol(const char *name);
private:
+ void SetKernelDisplacement();
+
void PrintUnreadMessage();
const char *GetError();
More information about the lldb-commits
mailing list