Skip to content

[lldb][Process/FreeBSDKernelCore] Set kernel displacement#183975

Merged
mchoo7 merged 5 commits intollvm:mainfrom
mchoo7:kerndisp
Mar 13, 2026
Merged

[lldb][Process/FreeBSDKernelCore] Set kernel displacement#183975
mchoo7 merged 5 commits intollvm:mainfrom
mchoo7:kerndisp

Conversation

@mchoo7
Copy link
Copy Markdown
Contributor

@mchoo7 mchoo7 commented Mar 1, 2026

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.

@mchoo7 mchoo7 requested review from DavidSpickett and emaste March 1, 2026 03:59
@mchoo7 mchoo7 requested a review from JDevlieghere as a code owner March 1, 2026 03:59
@llvmbot llvmbot added the lldb label Mar 1, 2026
@llvmbot
Copy link
Copy Markdown
Member

llvmbot commented Mar 1, 2026

@llvm/pr-subscribers-lldb

Author: Minsoo Choo (mchoo7)

Changes

When KASLR is enabled, the address passed through kvm_read()/kvm_write() is different from its real address. Thus LLDB should retrieve displacement offset using kvm_kerndisp() and pass the information through SetLoadAddress(). Note that some dump format on specific architectures don't support this, but this is due to kvm implementation and not LLDB's responsibility.


Full diff: https://github.com/llvm/llvm-project/pull/183975.diff

2 Files Affected:

  • (modified) lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp (+24)
  • (modified) lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h (+2)
diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp
index 577d8e0d50cf1..0217177c87dbd 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().
+  ApplyKASLR();
+
   return Status();
 }
 
@@ -324,6 +326,28 @@ lldb::addr_t ProcessFreeBSDKernelCore::FindSymbol(const char *name) {
   return sym ? sym->GetLoadAddress(&GetTarget()) : LLDB_INVALID_ADDRESS;
 }
 
+void ProcessFreeBSDKernelCore::ApplyKASLR() {
+  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), 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..92ddec4696066 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 ApplyKASLR();
+
   void PrintUnreadMessage();
 
   const char *GetError();

Signed-off-by: Minsoo Choo <minsoochoo0122@proton.me>
Copy link
Copy Markdown
Collaborator

@DavidSpickett DavidSpickett left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll let some FreeBSD person be the approver here.

Signed-off-by: Minsoo Choo <minsoochoo0122@proton.me>
@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 2, 2026

🐧 Linux x64 Test Results

  • 33354 tests passed
  • 507 tests skipped

✅ The build succeeded and all tests passed.

@aokblast
Copy link
Copy Markdown
Contributor

aokblast commented Mar 4, 2026

I don't think that we have KASLR. kvm_kerndisp is just compile time offset.

@mchoo7 mchoo7 changed the title [lldb][Process/FreeBSDKernelCore] Load core according to KASLR [lldb][Process/FreeBSDKernelCore] Set kernel displacement Mar 4, 2026
@mchoo7
Copy link
Copy Markdown
Contributor Author

mchoo7 commented Mar 4, 2026

I don't think that we have KASLR. kvm_kerndisp is just compile time offset.

Right, I just saw the commit messgae of freebsd/freebsd-src@38cf2a4. Update PR title and description and removed relnotes changes.

@mchoo7 mchoo7 requested a review from aokblast March 4, 2026 15:30
Signed-off-by: Minsoo Choo <minsoochoo0122@proton.me>
@jrtc27
Copy link
Copy Markdown
Collaborator

jrtc27 commented Mar 12, 2026

I don't think that we have KASLR. kvm_kerndisp is just compile time offset.

No? It's 0 for all architectures except PowerPC, which defines RELOCATABLE_KERNEL and has special code in sys/kern/link_elf.c such that kern.base_address and kern.relbase_address are not the same value (and is the only architecture with a non-NULL ka_kerndisp hook for kernel dump parsing).

Signed-off-by: Minsoo Choo <minsoochoo0122@proton.me>
Copy link
Copy Markdown
Collaborator

@jrtc27 jrtc27 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok to me subject to resolving the comments. Might also be nice to elaborate a bit in the summary to mention that PowerPC is the only supported architecture this can be non-zero for, as context?

Signed-off-by: Minsoo Choo <minsoochoo0122@proton.me>
@mchoo7 mchoo7 merged commit 62d0608 into llvm:main Mar 13, 2026
10 checks passed
@mchoo7 mchoo7 deleted the kerndisp branch March 13, 2026 18:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants