[Lldb-commits] [lldb] r350786 - A little cleanup / commenting on locating kernel binaries while I

Jason Molenda via lldb-commits lldb-commits at lists.llvm.org
Wed Jan 9 16:57:54 PST 2019


Author: jmolenda
Date: Wed Jan  9 16:57:54 2019
New Revision: 350786

URL: http://llvm.org/viewvc/llvm-project?rev=350786&view=rev
Log:
A little cleanup / commenting on locating kernel binaries while I
was working on something else.
DynamicLoaderDarwinKernel::SearchForKernelNearPC should have had
an early return if the pc value is not in high memory; add that.
The search for a kernel at 0x2000 offsets was a stopgap; it doesn't
need to be checked any longer.


Modified:
    lldb/trunk/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp

Modified: lldb/trunk/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp?rev=350786&r1=350785&r2=350786&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp (original)
+++ lldb/trunk/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp Wed Jan  9 16:57:54 2019
@@ -293,6 +293,18 @@ DynamicLoaderDarwinKernel::SearchForKern
     return LLDB_INVALID_ADDRESS;
   addr_t pc = thread->GetRegisterContext()->GetPC(LLDB_INVALID_ADDRESS);
 
+  // The kernel is always loaded in high memory, if the top bit is zero,
+  // this isn't a kernel.
+  if (process->GetTarget().GetArchitecture().GetAddressByteSize() == 8) {
+    if ((pc & (1ULL << 63)) == 0) {
+      return LLDB_INVALID_ADDRESS;
+    }
+  } else {
+    if ((pc & (1ULL << 31)) == 0) {
+      return LLDB_INVALID_ADDRESS;
+    }
+  }
+
   if (pc == LLDB_INVALID_ADDRESS)
     return LLDB_INVALID_ADDRESS;
 
@@ -307,12 +319,13 @@ DynamicLoaderDarwinKernel::SearchForKern
   // Search backwards 32 megabytes, looking for the start of the kernel at each
   // one-megabyte boundary.
   for (int i = 0; i < 32; i++, addr -= 0x100000) {
+    // x86_64 kernels are at offset 0
     if (CheckForKernelImageAtAddress(addr, process).IsValid())
       return addr;
+    // 32-bit arm kernels are at offset 0x1000 (one 4k page)
     if (CheckForKernelImageAtAddress(addr + 0x1000, process).IsValid())
       return addr + 0x1000;
-    if (CheckForKernelImageAtAddress(addr + 0x2000, process).IsValid())
-      return addr + 0x2000;
+    // 64-bit arm kernels are at offset 0x4000 (one 16k page)
     if (CheckForKernelImageAtAddress(addr + 0x4000, process).IsValid())
       return addr + 0x4000;
   }
@@ -351,12 +364,13 @@ lldb::addr_t DynamicLoaderDarwinKernel::
   addr_t addr = kernel_range_low;
 
   while (addr >= kernel_range_low && addr < kernel_range_high) {
+    // x86_64 kernels are at offset 0
     if (CheckForKernelImageAtAddress(addr, process).IsValid())
       return addr;
+    // 32-bit arm kernels are at offset 0x1000 (one 4k page)
     if (CheckForKernelImageAtAddress(addr + 0x1000, process).IsValid())
       return addr + 0x1000;
-    if (CheckForKernelImageAtAddress(addr + 0x2000, process).IsValid())
-      return addr + 0x2000;
+    // 64-bit arm kernels are at offset 0x4000 (one 16k page)
     if (CheckForKernelImageAtAddress(addr + 0x4000, process).IsValid())
       return addr + 0x4000;
     addr += 0x100000;




More information about the lldb-commits mailing list