diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp index 577d8e0d50cf1..bf91074716237 100644 --- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp +++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp @@ -118,6 +118,8 @@ bool ProcessFreeBSDKernelCore::CanDebug(lldb::TargetSP target_sp, Status ProcessFreeBSDKernelCore::DoLoadCore() { // The core is already loaded by CreateInstance(). + SetKernelDisplacement(); + return Status(); } @@ -324,6 +326,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(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();