DynamicLoaderDarwinKernel.cpp revision e369aedc1ef2fc983ee97ad75a2537b9a8f820bd
117f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton//===-- DynamicLoaderDarwinKernel.cpp -----------------------------*- C++ -*-===// 2bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// 3bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// The LLVM Compiler Infrastructure 4bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// 5bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// This file is distributed under the University of Illinois Open Source 6bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// License. See LICENSE.TXT for details. 7bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// 8bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//===----------------------------------------------------------------------===// 9bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 12bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Breakpoint/StoppointCallbackContext.h" 13bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Core/DataBuffer.h" 14bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Core/DataBufferHeap.h" 15234981a4559db084f9c90612660e40f19915b89cGreg Clayton#include "lldb/Core/Debugger.h" 16bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Core/Log.h" 17bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Core/Module.h" 1849ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ModuleSpec.h" 19bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Core/PluginManager.h" 2049ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Section.h" 21bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Core/State.h" 224952db8c76f619e3d8a0cf13456097128009d67bJason Molenda#include "lldb/Host/Symbols.h" 23bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Symbol/ObjectFile.h" 24bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Target/RegisterContext.h" 254952db8c76f619e3d8a0cf13456097128009d67bJason Molenda#include "lldb/Target/StackFrame.h" 26bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Target/Target.h" 27bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Target/Thread.h" 28bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Target/ThreadPlanRunToAddress.h" 294952db8c76f619e3d8a0cf13456097128009d67bJason Molenda 30bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 3117f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton#include "DynamicLoaderDarwinKernel.h" 32bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 33bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//#define ENABLE_DEBUG_PRINTF // COMMENT THIS LINE OUT PRIOR TO CHECKIN 34bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#ifdef ENABLE_DEBUG_PRINTF 35bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include <stdio.h> 36bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#define DEBUG_PRINTF(fmt, ...) printf(fmt, ## __VA_ARGS__) 37bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#else 38bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#define DEBUG_PRINTF(fmt, ...) 39bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#endif 40bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 41bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonusing namespace lldb; 42bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonusing namespace lldb_private; 43bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 449338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// Progressively greater amounts of scanning we will allow 459338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// For some targets very early in startup, we can't do any random reads of memory or we can crash the device 469338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// so a setting is needed that can completely disable the KASLR scans. 479338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 489338dd571e7781a89724d79e1f54385c282d0316Jason Molendaenum KASLRScanType 499338dd571e7781a89724d79e1f54385c282d0316Jason Molenda{ 509338dd571e7781a89724d79e1f54385c282d0316Jason Molenda eKASLRScanNone = 0, // No reading into the inferior at all 519338dd571e7781a89724d79e1f54385c282d0316Jason Molenda eKASLRScanLowgloAddresses, // Check one word of memory for a possible kernel addr, then see if a kernel is there 5294c0f4c378f39b540ffb46992c5741a4bc59e2e2Jason Molenda eKASLRScanNearPC, // Scan backwards from the current $pc looking for kernel; checking at 96 locations total 539338dd571e7781a89724d79e1f54385c282d0316Jason Molenda eKASLRScanExhaustiveScan // Scan through the entire possible kernel address range looking for a kernel 549338dd571e7781a89724d79e1f54385c282d0316Jason Molenda}; 559338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 569338dd571e7781a89724d79e1f54385c282d0316Jason MolendaOptionEnumValueElement 579338dd571e7781a89724d79e1f54385c282d0316Jason Molendag_kaslr_kernel_scan_enum_values[] = 589338dd571e7781a89724d79e1f54385c282d0316Jason Molenda{ 599338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { eKASLRScanNone, "none", "Do not read memory looking for a Darwin kernel when attaching." }, 609338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { eKASLRScanLowgloAddresses, "basic", "Check for the Darwin kernel's load addr in the lowglo page (boot-args=debug) only." }, 619338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { eKASLRScanNearPC, "fast-scan", "Scan near the pc value on attach to find the Darwin kernel's load address."}, 629338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { eKASLRScanExhaustiveScan, "exhaustive-scan", "Scan through the entire potential address range of Darwin kernel (only on 32-bit targets)."}, 639338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { 0, NULL, NULL } 649338dd571e7781a89724d79e1f54385c282d0316Jason Molenda}; 659338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 6687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonstatic PropertyDefinition 6787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytong_properties[] = 6887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton{ 692f27af8e7b2515b05e28653177da01c9a3fe0c52Greg Clayton { "load-kexts" , OptionValue::eTypeBoolean, true, true, NULL, NULL, "Automatically loads kext images when attaching to a kernel." }, 709338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { "scan-type", OptionValue::eTypeEnum, true, eKASLRScanNearPC, NULL, g_kaslr_kernel_scan_enum_values, "Control how many reads lldb will make while searching for a Darwin kernel on attach." }, 712f27af8e7b2515b05e28653177da01c9a3fe0c52Greg Clayton { NULL , OptionValue::eTypeInvalid, false, 0 , NULL, NULL, NULL } 7287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton}; 7387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 7487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonenum { 759338dd571e7781a89724d79e1f54385c282d0316Jason Molenda ePropertyLoadKexts, 769338dd571e7781a89724d79e1f54385c282d0316Jason Molenda ePropertyScanType 7787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton}; 7887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 7987e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonclass DynamicLoaderDarwinKernelProperties : public Properties 8087e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton{ 8187e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonpublic: 8287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 8387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton static ConstString & 8487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton GetSettingName () 8587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton { 862acbc2a80c0116454426db2d8b55bc23e6cbb0c1Greg Clayton static ConstString g_setting_name("darwin-kernel"); 8787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton return g_setting_name; 8887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton } 8987e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 9087e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton DynamicLoaderDarwinKernelProperties() : 9187e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton Properties () 9287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton { 9387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton m_collection_sp.reset (new OptionValueProperties(GetSettingName())); 9487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton m_collection_sp->Initialize(g_properties); 9587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton } 9687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 9787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton virtual 9887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton ~DynamicLoaderDarwinKernelProperties() 9987e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton { 10087e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton } 1019338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 10287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton bool 1032f27af8e7b2515b05e28653177da01c9a3fe0c52Greg Clayton GetLoadKexts() const 10487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton { 1052f27af8e7b2515b05e28653177da01c9a3fe0c52Greg Clayton const uint32_t idx = ePropertyLoadKexts; 10687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 10787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton } 1089338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 1099338dd571e7781a89724d79e1f54385c282d0316Jason Molenda KASLRScanType 1109338dd571e7781a89724d79e1f54385c282d0316Jason Molenda GetScanType() const 1119338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { 1129338dd571e7781a89724d79e1f54385c282d0316Jason Molenda const uint32_t idx = ePropertyScanType; 11394c0f4c378f39b540ffb46992c5741a4bc59e2e2Jason Molenda return (KASLRScanType) m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value); 1149338dd571e7781a89724d79e1f54385c282d0316Jason Molenda } 1159338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 1169338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 11787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton}; 11887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 11987e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytontypedef STD_SHARED_PTR(DynamicLoaderDarwinKernelProperties) DynamicLoaderDarwinKernelPropertiesSP; 12087e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 12187e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonstatic const DynamicLoaderDarwinKernelPropertiesSP & 12287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg ClaytonGetGlobalProperties() 12387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton{ 12487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton static DynamicLoaderDarwinKernelPropertiesSP g_settings_sp; 12587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton if (!g_settings_sp) 12687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton g_settings_sp.reset (new DynamicLoaderDarwinKernelProperties ()); 12787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton return g_settings_sp; 12887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton} 12987e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 130bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 131bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Create an instance of this class. This function is filled into 132bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// the plugin info class that gets handed out by the plugin factory and 133bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// allows the lldb to instantiate an instance of this class. 134bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 135bbea13375ec4ae876576fcb8608626d45880dd96Greg ClaytonDynamicLoader * 13617f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::CreateInstance (Process* process, bool force) 137bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 1389338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (!force) 139bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 1409338dd571e7781a89724d79e1f54385c282d0316Jason Molenda // If the user provided an executable binary and it is not a kernel, 1419338dd571e7781a89724d79e1f54385c282d0316Jason Molenda // this plugin should not create an instance. 1425beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton Module* exe_module = process->GetTarget().GetExecutableModulePointer(); 14340f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton if (exe_module) 14440f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton { 14540f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton ObjectFile *object_file = exe_module->GetObjectFile(); 14640f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton if (object_file) 14740f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton { 1489338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (object_file->GetStrata() != ObjectFile::eStrataKernel) 1499338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { 1509338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return NULL; 1519338dd571e7781a89724d79e1f54385c282d0316Jason Molenda } 15240f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton } 15340f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton } 1549338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 1559338dd571e7781a89724d79e1f54385c282d0316Jason Molenda // If the target's architecture does not look like an Apple environment, 1569338dd571e7781a89724d79e1f54385c282d0316Jason Molenda // this plugin should not create an instance. 1579338dd571e7781a89724d79e1f54385c282d0316Jason Molenda const llvm::Triple &triple_ref = process->GetTarget().GetArchitecture().GetTriple(); 1589338dd571e7781a89724d79e1f54385c282d0316Jason Molenda switch (triple_ref.getOS()) 1599338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { 1609338dd571e7781a89724d79e1f54385c282d0316Jason Molenda case llvm::Triple::Darwin: 1619338dd571e7781a89724d79e1f54385c282d0316Jason Molenda case llvm::Triple::MacOSX: 1629338dd571e7781a89724d79e1f54385c282d0316Jason Molenda case llvm::Triple::IOS: 1639338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (triple_ref.getVendor() != llvm::Triple::Apple) 1649338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { 1659338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return NULL; 1669338dd571e7781a89724d79e1f54385c282d0316Jason Molenda } 1679338dd571e7781a89724d79e1f54385c282d0316Jason Molenda break; 1689338dd571e7781a89724d79e1f54385c282d0316Jason Molenda // If we have triple like armv7-unknown-unknown, we should try looking for a Darwin kernel. 1699338dd571e7781a89724d79e1f54385c282d0316Jason Molenda case llvm::Triple::UnknownOS: 1709338dd571e7781a89724d79e1f54385c282d0316Jason Molenda break; 1719338dd571e7781a89724d79e1f54385c282d0316Jason Molenda default: 1729338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return NULL; 1739338dd571e7781a89724d79e1f54385c282d0316Jason Molenda break; 1749338dd571e7781a89724d79e1f54385c282d0316Jason Molenda } 1759338dd571e7781a89724d79e1f54385c282d0316Jason Molenda } 1769338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 1779338dd571e7781a89724d79e1f54385c282d0316Jason Molenda // At this point if there is an ExecutableModule, it is a kernel and the Target is some variant of an Apple system. 1789338dd571e7781a89724d79e1f54385c282d0316Jason Molenda // If the Process hasn't provided the kernel load address, we need to look around in memory to find it. 1799338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 180cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda addr_t kernel_load_address = SearchForDarwinKernel (process); 181cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda if (kernel_load_address != LLDB_INVALID_ADDRESS) 182cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda { 183cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda process->SetCanJIT(false); 184cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda return new DynamicLoaderDarwinKernel (process, kernel_load_address); 185cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda } 186cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda return NULL; 187cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda} 188cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda 189cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molendalldb::addr_t 190cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason MolendaDynamicLoaderDarwinKernel::SearchForDarwinKernel (Process *process) 191cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda{ 1929338dd571e7781a89724d79e1f54385c282d0316Jason Molenda addr_t kernel_load_address = process->GetImageInfoAddress(); 1939338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (kernel_load_address == LLDB_INVALID_ADDRESS) 1949338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { 1959338dd571e7781a89724d79e1f54385c282d0316Jason Molenda kernel_load_address = SearchForKernelAtSameLoadAddr (process); 1969338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (kernel_load_address == LLDB_INVALID_ADDRESS) 19740f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton { 1989338dd571e7781a89724d79e1f54385c282d0316Jason Molenda kernel_load_address = SearchForKernelWithDebugHints (process); 1999338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (kernel_load_address == LLDB_INVALID_ADDRESS) 200b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 2019338dd571e7781a89724d79e1f54385c282d0316Jason Molenda kernel_load_address = SearchForKernelNearPC (process); 2029338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (kernel_load_address == LLDB_INVALID_ADDRESS) 2039338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { 2049338dd571e7781a89724d79e1f54385c282d0316Jason Molenda kernel_load_address = SearchForKernelViaExhaustiveSearch (process); 2059338dd571e7781a89724d79e1f54385c282d0316Jason Molenda } 206b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 20740f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton } 208bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 209cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda return kernel_load_address; 210bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 211bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 212bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 2139338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// Check if the kernel binary is loaded in memory without a slide. 2149338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// First verify that the ExecutableModule is a kernel before we proceed. 2159338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// Returns the address of the kernel if one was found, else LLDB_INVALID_ADDRESS. 2169338dd571e7781a89724d79e1f54385c282d0316Jason Molenda//---------------------------------------------------------------------- 2179338dd571e7781a89724d79e1f54385c282d0316Jason Molendalldb::addr_t 2189338dd571e7781a89724d79e1f54385c282d0316Jason MolendaDynamicLoaderDarwinKernel::SearchForKernelAtSameLoadAddr (Process *process) 2199338dd571e7781a89724d79e1f54385c282d0316Jason Molenda{ 2209338dd571e7781a89724d79e1f54385c282d0316Jason Molenda Module *exe_module = process->GetTarget().GetExecutableModulePointer(); 2219338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (exe_module == NULL) 2229338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return LLDB_INVALID_ADDRESS; 2239338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 2249338dd571e7781a89724d79e1f54385c282d0316Jason Molenda ObjectFile *exe_objfile = exe_module->GetObjectFile(); 2259338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (exe_objfile == NULL) 2269338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return LLDB_INVALID_ADDRESS; 2279338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 2289338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (exe_objfile->GetType() != ObjectFile::eTypeExecutable || exe_objfile->GetStrata() != ObjectFile::eStrataKernel) 2299338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return LLDB_INVALID_ADDRESS; 2309338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 2319338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (!exe_objfile->GetHeaderAddress().IsValid()) 2329338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return LLDB_INVALID_ADDRESS; 2339338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 2349338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (CheckForKernelImageAtAddress (exe_objfile->GetHeaderAddress().GetFileAddress(), process) == exe_module->GetUUID()) 2359338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return exe_objfile->GetHeaderAddress().GetFileAddress(); 2369338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 2379338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return LLDB_INVALID_ADDRESS; 2389338dd571e7781a89724d79e1f54385c282d0316Jason Molenda} 2399338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 2409338dd571e7781a89724d79e1f54385c282d0316Jason Molenda//---------------------------------------------------------------------- 2419338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// If the debug flag is included in the boot-args nvram setting, the kernel's load address 2429338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// will be noted in the lowglo page at a fixed address 2439338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// Returns the address of the kernel if one was found, else LLDB_INVALID_ADDRESS. 2449338dd571e7781a89724d79e1f54385c282d0316Jason Molenda//---------------------------------------------------------------------- 2459338dd571e7781a89724d79e1f54385c282d0316Jason Molendalldb::addr_t 2469338dd571e7781a89724d79e1f54385c282d0316Jason MolendaDynamicLoaderDarwinKernel::SearchForKernelWithDebugHints (Process *process) 2479338dd571e7781a89724d79e1f54385c282d0316Jason Molenda{ 2489338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (GetGlobalProperties()->GetScanType() == eKASLRScanNone) 2499338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return LLDB_INVALID_ADDRESS; 2509338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 2519338dd571e7781a89724d79e1f54385c282d0316Jason Molenda Error read_err; 2529338dd571e7781a89724d79e1f54385c282d0316Jason Molenda addr_t addr = LLDB_INVALID_ADDRESS; 2539338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (process->GetTarget().GetArchitecture().GetAddressByteSize() == 8) 2549338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { 2559338dd571e7781a89724d79e1f54385c282d0316Jason Molenda addr = process->ReadUnsignedIntegerFromMemory (0xffffff8000002010ULL, 8, LLDB_INVALID_ADDRESS, read_err); 2569338dd571e7781a89724d79e1f54385c282d0316Jason Molenda } 2579338dd571e7781a89724d79e1f54385c282d0316Jason Molenda else 2589338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { 2599338dd571e7781a89724d79e1f54385c282d0316Jason Molenda addr = process->ReadUnsignedIntegerFromMemory (0xffff0110, 4, LLDB_INVALID_ADDRESS, read_err); 2609338dd571e7781a89724d79e1f54385c282d0316Jason Molenda } 2619338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 2629338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (addr == 0) 2639338dd571e7781a89724d79e1f54385c282d0316Jason Molenda addr = LLDB_INVALID_ADDRESS; 2649338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 2659338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (addr != LLDB_INVALID_ADDRESS) 2669338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { 2679338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (CheckForKernelImageAtAddress (addr, process).IsValid()) 2689338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return addr; 2699338dd571e7781a89724d79e1f54385c282d0316Jason Molenda } 2709338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 2719338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return LLDB_INVALID_ADDRESS; 2729338dd571e7781a89724d79e1f54385c282d0316Jason Molenda} 2739338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 2749338dd571e7781a89724d79e1f54385c282d0316Jason Molenda//---------------------------------------------------------------------- 2759338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// If the kernel is currently executing when lldb attaches, and we don't have 2769338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// a better way of finding the kernel's load address, try searching backwards 2779338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// from the current pc value looking for the kernel's Mach header in memory. 2789338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// Returns the address of the kernel if one was found, else LLDB_INVALID_ADDRESS. 2799338dd571e7781a89724d79e1f54385c282d0316Jason Molenda//---------------------------------------------------------------------- 2809338dd571e7781a89724d79e1f54385c282d0316Jason Molendalldb::addr_t 2819338dd571e7781a89724d79e1f54385c282d0316Jason MolendaDynamicLoaderDarwinKernel::SearchForKernelNearPC (Process *process) 2829338dd571e7781a89724d79e1f54385c282d0316Jason Molenda{ 2839338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (GetGlobalProperties()->GetScanType() == eKASLRScanNone 2849338dd571e7781a89724d79e1f54385c282d0316Jason Molenda || GetGlobalProperties()->GetScanType() == eKASLRScanLowgloAddresses) 2859338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { 2869338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return LLDB_INVALID_ADDRESS; 2879338dd571e7781a89724d79e1f54385c282d0316Jason Molenda } 2889338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 2899338dd571e7781a89724d79e1f54385c282d0316Jason Molenda ThreadSP thread = process->GetThreadList().GetSelectedThread (); 2909338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (thread.get() == NULL) 2919338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return LLDB_INVALID_ADDRESS; 2929338dd571e7781a89724d79e1f54385c282d0316Jason Molenda addr_t pc = thread->GetRegisterContext ()->GetPC(LLDB_INVALID_ADDRESS); 2939338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 2949338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (pc == LLDB_INVALID_ADDRESS) 2959338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return LLDB_INVALID_ADDRESS; 2969338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 2979338dd571e7781a89724d79e1f54385c282d0316Jason Molenda addr_t kernel_range_low, kernel_range_high; 2989338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (process->GetTarget().GetArchitecture().GetAddressByteSize() == 8) 2999338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { 3009338dd571e7781a89724d79e1f54385c282d0316Jason Molenda kernel_range_low = 1ULL << 63; 3019338dd571e7781a89724d79e1f54385c282d0316Jason Molenda kernel_range_high = UINT64_MAX; 3029338dd571e7781a89724d79e1f54385c282d0316Jason Molenda } 3039338dd571e7781a89724d79e1f54385c282d0316Jason Molenda else 3049338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { 3059338dd571e7781a89724d79e1f54385c282d0316Jason Molenda kernel_range_low = 1ULL << 31; 3069338dd571e7781a89724d79e1f54385c282d0316Jason Molenda kernel_range_high = UINT32_MAX; 3079338dd571e7781a89724d79e1f54385c282d0316Jason Molenda } 3089338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 3099338dd571e7781a89724d79e1f54385c282d0316Jason Molenda // Outside the normal kernel address range, this is probably userland code running right now 3109338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (pc < kernel_range_low) 3119338dd571e7781a89724d79e1f54385c282d0316Jason Molenda LLDB_INVALID_ADDRESS; 3129338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 3139338dd571e7781a89724d79e1f54385c282d0316Jason Molenda // The kernel will load at at one megabyte boundary (0x100000), or at that boundary plus 3149338dd571e7781a89724d79e1f54385c282d0316Jason Molenda // an offset of one page (0x1000) or two, depending on the device. 3159338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 3169338dd571e7781a89724d79e1f54385c282d0316Jason Molenda // Round the current pc down to the nearest one megabyte boundary - the place where we will start searching. 3179338dd571e7781a89724d79e1f54385c282d0316Jason Molenda addr_t addr = pc & ~0xfffff; 3189338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 3199338dd571e7781a89724d79e1f54385c282d0316Jason Molenda int i = 0; 3209338dd571e7781a89724d79e1f54385c282d0316Jason Molenda while (i < 32 && pc >= kernel_range_low) 3219338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { 3229338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (CheckForKernelImageAtAddress (addr, process).IsValid()) 3239338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return addr; 3249338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (CheckForKernelImageAtAddress (addr + 0x1000, process).IsValid()) 3259338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return addr + 0x1000; 3269338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (CheckForKernelImageAtAddress (addr + 0x2000, process).IsValid()) 3279338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return addr + 0x2000; 3289338dd571e7781a89724d79e1f54385c282d0316Jason Molenda i++; 3299338dd571e7781a89724d79e1f54385c282d0316Jason Molenda addr -= 0x100000; 3309338dd571e7781a89724d79e1f54385c282d0316Jason Molenda } 3319338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 3329338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return LLDB_INVALID_ADDRESS; 3339338dd571e7781a89724d79e1f54385c282d0316Jason Molenda} 3349338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 3359338dd571e7781a89724d79e1f54385c282d0316Jason Molenda//---------------------------------------------------------------------- 3369338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// Scan through the valid address range for a kernel binary. 3379338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// This is uselessly slow in 64-bit environments so we don't even try it. 3389338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// This scan is not enabled by default even for 32-bit targets. 3399338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// Returns the address of the kernel if one was found, else LLDB_INVALID_ADDRESS. 3409338dd571e7781a89724d79e1f54385c282d0316Jason Molenda//---------------------------------------------------------------------- 3419338dd571e7781a89724d79e1f54385c282d0316Jason Molendalldb::addr_t 3429338dd571e7781a89724d79e1f54385c282d0316Jason MolendaDynamicLoaderDarwinKernel::SearchForKernelViaExhaustiveSearch (Process *process) 3439338dd571e7781a89724d79e1f54385c282d0316Jason Molenda{ 3449338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (GetGlobalProperties()->GetScanType() != eKASLRScanExhaustiveScan) 3459338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { 3469338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return LLDB_INVALID_ADDRESS; 3479338dd571e7781a89724d79e1f54385c282d0316Jason Molenda } 3489338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 3499338dd571e7781a89724d79e1f54385c282d0316Jason Molenda addr_t kernel_range_low, kernel_range_high; 3509338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (process->GetTarget().GetArchitecture().GetAddressByteSize() == 8) 3519338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { 3529338dd571e7781a89724d79e1f54385c282d0316Jason Molenda kernel_range_low = 1ULL << 63; 3539338dd571e7781a89724d79e1f54385c282d0316Jason Molenda kernel_range_high = UINT64_MAX; 3549338dd571e7781a89724d79e1f54385c282d0316Jason Molenda } 3559338dd571e7781a89724d79e1f54385c282d0316Jason Molenda else 3569338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { 3579338dd571e7781a89724d79e1f54385c282d0316Jason Molenda kernel_range_low = 1ULL << 31; 3589338dd571e7781a89724d79e1f54385c282d0316Jason Molenda kernel_range_high = UINT32_MAX; 3599338dd571e7781a89724d79e1f54385c282d0316Jason Molenda } 3609338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 3619338dd571e7781a89724d79e1f54385c282d0316Jason Molenda // Stepping through memory at one-megabyte resolution looking for a kernel 3629338dd571e7781a89724d79e1f54385c282d0316Jason Molenda // rarely works (fast enough) with a 64-bit address space -- for now, let's 3639338dd571e7781a89724d79e1f54385c282d0316Jason Molenda // not even bother. We may be attaching to something which *isn't* a kernel 3649338dd571e7781a89724d79e1f54385c282d0316Jason Molenda // and we don't want to spin for minutes on-end looking for a kernel. 3659338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (process->GetTarget().GetArchitecture().GetAddressByteSize() == 8) 3669338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return LLDB_INVALID_ADDRESS; 3679338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 3689338dd571e7781a89724d79e1f54385c282d0316Jason Molenda addr_t addr = kernel_range_low; 3699338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 3709338dd571e7781a89724d79e1f54385c282d0316Jason Molenda while (addr >= kernel_range_low && addr < kernel_range_high) 3719338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { 3729338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (CheckForKernelImageAtAddress (addr, process).IsValid()) 3739338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return addr; 3749338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (CheckForKernelImageAtAddress (addr + 0x1000, process).IsValid()) 3759338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return addr + 0x1000; 3769338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (CheckForKernelImageAtAddress (addr + 0x2000, process).IsValid()) 3779338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return addr + 0x2000; 3789338dd571e7781a89724d79e1f54385c282d0316Jason Molenda addr += 0x100000; 3799338dd571e7781a89724d79e1f54385c282d0316Jason Molenda } 3809338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return LLDB_INVALID_ADDRESS; 3819338dd571e7781a89724d79e1f54385c282d0316Jason Molenda} 3829338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 3839338dd571e7781a89724d79e1f54385c282d0316Jason Molenda//---------------------------------------------------------------------- 3849338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// Given an address in memory, look to see if there is a kernel image at that 3859338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// address. 3869338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// Returns a UUID; if a kernel was not found at that address, UUID.IsValid() will be false. 3879338dd571e7781a89724d79e1f54385c282d0316Jason Molenda//---------------------------------------------------------------------- 3889338dd571e7781a89724d79e1f54385c282d0316Jason Molendalldb_private::UUID 3899338dd571e7781a89724d79e1f54385c282d0316Jason MolendaDynamicLoaderDarwinKernel::CheckForKernelImageAtAddress (lldb::addr_t addr, Process *process) 3909338dd571e7781a89724d79e1f54385c282d0316Jason Molenda{ 3919338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (addr == LLDB_INVALID_ADDRESS) 3929338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return UUID(); 3939338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 3949338dd571e7781a89724d79e1f54385c282d0316Jason Molenda // First try a quick test -- read the first 4 bytes and see if there is a valid Mach-O magic field there 3959338dd571e7781a89724d79e1f54385c282d0316Jason Molenda // (the first field of the mach_header/mach_header_64 struct). 3969338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 3979338dd571e7781a89724d79e1f54385c282d0316Jason Molenda Error read_error; 3989338dd571e7781a89724d79e1f54385c282d0316Jason Molenda uint64_t result = process->ReadUnsignedIntegerFromMemory (addr, 4, LLDB_INVALID_ADDRESS, read_error); 3999338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (result != llvm::MachO::HeaderMagic64 4009338dd571e7781a89724d79e1f54385c282d0316Jason Molenda && result != llvm::MachO::HeaderMagic32 4019338dd571e7781a89724d79e1f54385c282d0316Jason Molenda && result != llvm::MachO::HeaderMagic32Swapped 4029338dd571e7781a89724d79e1f54385c282d0316Jason Molenda && result != llvm::MachO::HeaderMagic64Swapped) 4039338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { 4049338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return UUID(); 4059338dd571e7781a89724d79e1f54385c282d0316Jason Molenda } 4069338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 4079338dd571e7781a89724d79e1f54385c282d0316Jason Molenda // Read the mach header and see whether it looks like a kernel 4089338dd571e7781a89724d79e1f54385c282d0316Jason Molenda llvm::MachO::mach_header header; 4099338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (process->DoReadMemory (addr, &header, sizeof(header), read_error) != sizeof(header)) 4109338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return UUID(); 4119338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 4129338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (header.magic == llvm::MachO::HeaderMagic32Swapped || 4139338dd571e7781a89724d79e1f54385c282d0316Jason Molenda header.magic == llvm::MachO::HeaderMagic64Swapped) 4149338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { 4159338dd571e7781a89724d79e1f54385c282d0316Jason Molenda header.magic = llvm::ByteSwap_32(header.magic); 4169338dd571e7781a89724d79e1f54385c282d0316Jason Molenda header.cputype = llvm::ByteSwap_32(header.cputype); 4179338dd571e7781a89724d79e1f54385c282d0316Jason Molenda header.cpusubtype = llvm::ByteSwap_32(header.cpusubtype); 4189338dd571e7781a89724d79e1f54385c282d0316Jason Molenda header.filetype = llvm::ByteSwap_32(header.filetype); 4199338dd571e7781a89724d79e1f54385c282d0316Jason Molenda header.ncmds = llvm::ByteSwap_32(header.ncmds); 4209338dd571e7781a89724d79e1f54385c282d0316Jason Molenda header.sizeofcmds = llvm::ByteSwap_32(header.sizeofcmds); 4219338dd571e7781a89724d79e1f54385c282d0316Jason Molenda header.flags = llvm::ByteSwap_32(header.flags); 4229338dd571e7781a89724d79e1f54385c282d0316Jason Molenda } 4239338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 4249338dd571e7781a89724d79e1f54385c282d0316Jason Molenda // A kernel is an executable which does not have the dynamic link object flag set. 4259338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (header.filetype == llvm::MachO::HeaderFileTypeExecutable 4269338dd571e7781a89724d79e1f54385c282d0316Jason Molenda && (header.flags & llvm::MachO::HeaderFlagBitIsDynamicLinkObject) == 0) 4279338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { 4289338dd571e7781a89724d79e1f54385c282d0316Jason Molenda // Create a full module to get the UUID 4292ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton ModuleSP memory_module_sp = process->ReadModuleFromMemory (FileSpec ("temp_mach_kernel", false), addr); 4309338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (!memory_module_sp.get()) 4319338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return UUID(); 4329338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 4339338dd571e7781a89724d79e1f54385c282d0316Jason Molenda ObjectFile *exe_objfile = memory_module_sp->GetObjectFile(); 4349338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (exe_objfile == NULL) 4359338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return UUID(); 4369338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 4379338dd571e7781a89724d79e1f54385c282d0316Jason Molenda if (exe_objfile->GetType() == ObjectFile::eTypeExecutable && exe_objfile->GetStrata() == ObjectFile::eStrataKernel) 4389338dd571e7781a89724d79e1f54385c282d0316Jason Molenda { 4399338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return memory_module_sp->GetUUID(); 4409338dd571e7781a89724d79e1f54385c282d0316Jason Molenda } 4419338dd571e7781a89724d79e1f54385c282d0316Jason Molenda } 4429338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 4439338dd571e7781a89724d79e1f54385c282d0316Jason Molenda return UUID(); 4449338dd571e7781a89724d79e1f54385c282d0316Jason Molenda} 4459338dd571e7781a89724d79e1f54385c282d0316Jason Molenda 4469338dd571e7781a89724d79e1f54385c282d0316Jason Molenda//---------------------------------------------------------------------- 447bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Constructor 448bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 4499338dd571e7781a89724d79e1f54385c282d0316Jason MolendaDynamicLoaderDarwinKernel::DynamicLoaderDarwinKernel (Process* process, lldb::addr_t kernel_addr) : 450bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton DynamicLoader(process), 4519338dd571e7781a89724d79e1f54385c282d0316Jason Molenda m_kernel_load_address (kernel_addr), 452bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kernel(), 4537dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton m_kext_summary_header_ptr_addr (), 4548c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton m_kext_summary_header_addr (), 455bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kext_summary_header (), 45632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_known_kexts (), 45797c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_mutex(Mutex::eMutexTypeRecursive), 45897c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_break_id (LLDB_INVALID_BREAK_ID) 459bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 460e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda PlatformSP platform_sp(Platform::FindPlugin (process, "darwin-kernel")); 461e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda // Only select the darwin-kernel Platform if we've been asked to load kexts. 462e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda // It can take some time to scan over all of the kext info.plists and that 463e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda // shouldn't be done if kext loading is explicitly disabled. 464e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda if (platform_sp.get() && GetGlobalProperties()->GetLoadKexts()) 465e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda { 466e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda process->GetTarget().SetPlatform (platform_sp); 467e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda process->GetTarget().GetDebugger().GetPlatformList().SetSelectedPlatform (platform_sp); 468e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda } 469bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 470bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 471bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 472bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Destructor 473bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 47417f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::~DynamicLoaderDarwinKernel() 475bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 476bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Clear(true); 477bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 478bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 479645facaf9c247b20f0f135445d437181688711a7Greg Claytonvoid 48017f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::UpdateIfNeeded() 481645facaf9c247b20f0f135445d437181688711a7Greg Clayton{ 482645facaf9c247b20f0f135445d437181688711a7Greg Clayton LoadKernelModuleIfNeeded(); 483645facaf9c247b20f0f135445d437181688711a7Greg Clayton SetNotificationBreakpointIfNeeded (); 484645facaf9c247b20f0f135445d437181688711a7Greg Clayton} 485bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------ 486bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// Called after attaching a process. 487bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// 488bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// Allow DynamicLoader plug-ins to execute some code after 489bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// attaching to a process. 490bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------ 491bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 49217f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::DidAttach () 493bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 494bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton PrivateInitialize(m_process); 495645facaf9c247b20f0f135445d437181688711a7Greg Clayton UpdateIfNeeded(); 496bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 497bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 498bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------ 499bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// Called after attaching a process. 500bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// 501bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// Allow DynamicLoader plug-ins to execute some code after 502bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// attaching to a process. 503bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------ 504bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 50517f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::DidLaunch () 506bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 507bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton PrivateInitialize(m_process); 508645facaf9c247b20f0f135445d437181688711a7Greg Clayton UpdateIfNeeded(); 509bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 510bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 511bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 512bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 513bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Clear out the state of this class. 514bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 515bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 51617f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::Clear (bool clear_process) 517bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 518bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Mutex::Locker locker(m_mutex); 519bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 520bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (m_process->IsAlive() && LLDB_BREAK_ID_IS_VALID(m_break_id)) 521bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_process->ClearBreakpointSiteByID(m_break_id); 522bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 523bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (clear_process) 524bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_process = NULL; 52532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_kernel.Clear(); 52632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_known_kexts.clear(); 5277dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton m_kext_summary_header_ptr_addr.Clear(); 5288c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton m_kext_summary_header_addr.Clear(); 529bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_break_id = LLDB_INVALID_BREAK_ID; 530bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 531bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 532bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 533bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool 53432a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::LoadImageAtFileAddress (Process *process) 535aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton{ 536aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton if (IsLoaded()) 537aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton return true; 538aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton 53932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_module_sp) 540aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton { 541aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton bool changed = false; 54232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_module_sp->SetLoadAddress (process->GetTarget(), 0, changed)) 54332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_load_process_stop_id = process->GetStopID(); 544aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton } 545aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton return false; 546aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton} 547aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton 54832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendavoid 54932a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::SetModule (ModuleSP module_sp) 55032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{ 55132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_module_sp = module_sp; 55232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (module_sp.get() && module_sp->GetObjectFile()) 55332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 55432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (module_sp->GetObjectFile()->GetType() == ObjectFile::eTypeExecutable 55532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda && module_sp->GetObjectFile()->GetStrata() == ObjectFile::eStrataKernel) 55632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 55732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_kernel_image = true; 55832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 55932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda else 56032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 56132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_kernel_image = false; 56232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 56332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 56432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda} 56532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 56632a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaModuleSP 56732a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::GetModule () 56832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{ 56932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return m_module_sp; 57032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda} 57132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 57232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendavoid 57332a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::SetLoadAddress (addr_t load_addr) 57432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{ 57532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_load_address = load_addr; 57632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda} 57732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 57832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendaaddr_t 57932a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::GetLoadAddress () const 58032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{ 58132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return m_load_address; 58232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda} 58332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 58432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendauint64_t 58532a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::GetSize () const 58632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{ 58732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return m_size; 58832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda} 58932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 59032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendavoid 59132a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::SetSize (uint64_t size) 59232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{ 59332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_size = size; 59432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda} 59532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 59632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendauint32_t 59732a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::GetProcessStopId () const 59832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{ 59932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return m_load_process_stop_id; 60032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda} 60132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 60232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendavoid 60332a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::SetProcessStopId (uint32_t stop_id) 60432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{ 60532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_load_process_stop_id = stop_id; 60632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda} 60732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 608aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Claytonbool 60932a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::operator== (const KextImageInfo &rhs) 610bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 61132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_uuid.IsValid() || rhs.GetUUID().IsValid()) 61232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 61332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_uuid == rhs.GetUUID()) 61432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 61532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return true; 61632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 61732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return false; 61832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 61932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 62032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_name == rhs.GetName() && m_load_address == rhs.GetLoadAddress()) 6219ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return true; 622bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 62332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return false; 62432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda} 625bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 62632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendavoid 62732a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::SetName (const char *name) 62832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{ 62932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_name = name; 63032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda} 631127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda 63232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendastd::string 63332a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::GetName () const 63432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{ 63532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return m_name; 63632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda} 63732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 63832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendavoid 63932a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::SetUUID (const UUID &uuid) 64032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{ 64132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_uuid = uuid; 64232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda} 64332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 64432a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaUUID 64532a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::GetUUID () const 64632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{ 64732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return m_uuid; 64832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda} 64932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 65032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda// Given the m_load_address from the kext summaries, and a UUID, try to create an in-memory 65132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda// Module at that address. Require that the MemoryModule have a matching UUID and detect 65232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda// if this MemoryModule is a kernel or a kext. 65332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda// 65432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda// Returns true if m_memory_module_sp is now set to a valid Module. 65532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 65632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendabool 65732a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::ReadMemoryModule (Process *process) 65832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{ 65932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_memory_module_sp.get() != NULL) 66032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return true; 66132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_load_address == LLDB_INVALID_ADDRESS) 662127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda return false; 66332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 66432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda FileSpec file_spec; 66532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda file_spec.SetFile (m_name.c_str(), false); 66632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 66732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda ModuleSP memory_module_sp = process->ReadModuleFromMemory (file_spec, m_load_address); 66832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 66932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (memory_module_sp.get() == NULL) 67032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return false; 67132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 67232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda bool is_kernel = false; 67332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (memory_module_sp->GetObjectFile()) 67432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 67532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (memory_module_sp->GetObjectFile()->GetType() == ObjectFile::eTypeExecutable 67632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda && memory_module_sp->GetObjectFile()->GetStrata() == ObjectFile::eStrataKernel) 67732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 67832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda is_kernel = true; 67932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 68032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda else if (memory_module_sp->GetObjectFile()->GetType() == ObjectFile::eTypeSharedLibrary) 68132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 68232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda is_kernel = false; 68332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 684127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda } 685127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda 6866699c6eed148916de6a101ef1da8a859628fda63Jason Molenda // If this is a kext, and the kernel specified what UUID we should find at this 6876699c6eed148916de6a101ef1da8a859628fda63Jason Molenda // load address, require that the memory module have a matching UUID or something 6886699c6eed148916de6a101ef1da8a859628fda63Jason Molenda // has gone wrong and we should discard it. 68932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_uuid.IsValid()) 690bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 69132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_uuid != memory_module_sp->GetUUID()) 692bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 69332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return false; 694bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 69532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 69632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 69732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // If the in-memory Module has a UUID, let's use that. 69832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (!m_uuid.IsValid() && memory_module_sp->GetUUID().IsValid()) 69932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 70032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_uuid = memory_module_sp->GetUUID(); 70132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 70232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 70332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_memory_module_sp = memory_module_sp; 70432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_kernel_image = is_kernel; 70532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (is_kernel) 70632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 7076699c6eed148916de6a101ef1da8a859628fda63Jason Molenda if (memory_module_sp->GetArchitecture().IsValid()) 7084952db8c76f619e3d8a0cf13456097128009d67bJason Molenda { 70932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda process->GetTarget().SetArchitecture(memory_module_sp->GetArchitecture()); 7104952db8c76f619e3d8a0cf13456097128009d67bJason Molenda } 7116699c6eed148916de6a101ef1da8a859628fda63Jason Molenda if (m_uuid.IsValid()) 7126699c6eed148916de6a101ef1da8a859628fda63Jason Molenda { 7136699c6eed148916de6a101ef1da8a859628fda63Jason Molenda Module* exe_module = process->GetTarget().GetExecutableModulePointer(); 7146699c6eed148916de6a101ef1da8a859628fda63Jason Molenda if (exe_module && exe_module->GetUUID().IsValid()) 7156699c6eed148916de6a101ef1da8a859628fda63Jason Molenda { 7166699c6eed148916de6a101ef1da8a859628fda63Jason Molenda if (m_uuid != exe_module->GetUUID()) 7176699c6eed148916de6a101ef1da8a859628fda63Jason Molenda { 7186699c6eed148916de6a101ef1da8a859628fda63Jason Molenda Stream *s = &process->GetTarget().GetDebugger().GetOutputStream(); 7196699c6eed148916de6a101ef1da8a859628fda63Jason Molenda if (s) 7206699c6eed148916de6a101ef1da8a859628fda63Jason Molenda { 7216699c6eed148916de6a101ef1da8a859628fda63Jason Molenda char memory_module_uuidbuf[64]; 7226699c6eed148916de6a101ef1da8a859628fda63Jason Molenda char exe_module_uuidbuf[64]; 7236699c6eed148916de6a101ef1da8a859628fda63Jason Molenda s->Printf ("warning: Host-side kernel file has Mach-O UUID of %s but remote kernel has a UUID of %s -- a mismatched kernel file will result in a poor debugger experience.\n", 7246699c6eed148916de6a101ef1da8a859628fda63Jason Molenda exe_module->GetUUID().GetAsCString(exe_module_uuidbuf, sizeof (exe_module_uuidbuf)), 7256699c6eed148916de6a101ef1da8a859628fda63Jason Molenda m_uuid.GetAsCString(memory_module_uuidbuf, sizeof (memory_module_uuidbuf))); 7266699c6eed148916de6a101ef1da8a859628fda63Jason Molenda s->Flush (); 7276699c6eed148916de6a101ef1da8a859628fda63Jason Molenda } 7286699c6eed148916de6a101ef1da8a859628fda63Jason Molenda } 7296699c6eed148916de6a101ef1da8a859628fda63Jason Molenda } 7306699c6eed148916de6a101ef1da8a859628fda63Jason Molenda } 731bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 732bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 73332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return true; 73432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda} 73532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 73632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendabool 73732a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::IsKernel () const 73832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{ 73932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return m_kernel_image == true; 74032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda} 74132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 74232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendavoid 74332a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::SetIsKernel (bool is_kernel) 74432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{ 74532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_kernel_image = is_kernel; 74632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda} 74732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 74832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendabool 74932a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::LoadImageUsingMemoryModule (Process *process) 75032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{ 75132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (IsLoaded()) 75232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return true; 75332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 75432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 75532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda Target &target = process->GetTarget(); 75632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 75732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // If we don't have / can't create a memory module for this kext, don't try to load it - we won't 75832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // have the correct segment load addresses. 75932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (!ReadMemoryModule (process)) 76032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 76132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return false; 76232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 76332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 76432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda bool uuid_is_valid = m_uuid.IsValid(); 76532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 7660d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda if (IsKernel() && uuid_is_valid && m_memory_module_sp.get()) 7670d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda { 7680d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda Stream *s = &target.GetDebugger().GetOutputStream(); 7690d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda if (s) 7700d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda { 7710d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda char uuidbuf[64]; 7720d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda s->Printf ("Kernel UUID: %s\n", m_memory_module_sp->GetUUID().GetAsCString(uuidbuf, sizeof (uuidbuf))); 7730d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda s->Printf ("Load Address: 0x%" PRIx64 "\n", m_load_address); 7740d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda } 7750d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda } 7760d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda 77732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (!m_module_sp) 778bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 77932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // See if the kext has already been loaded into the target, probably by the user doing target modules add. 78032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda const ModuleList &target_images = target.GetImages(); 78132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_module_sp = target_images.FindModule(m_uuid); 78232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 78332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // Search for the kext on the local filesystem via the UUID 78432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (!m_module_sp && uuid_is_valid) 785bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 78632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda ModuleSpec module_spec; 78732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda module_spec.GetUUID() = m_uuid; 78832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda module_spec.GetArchitecture() = target.GetArchitecture(); 789d6b8122cee3dd02255bf50a7d019f17dfeba463aJason Molenda 7902c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda // For the kernel, we really do need an on-disk file copy of the binary to do anything useful. 7912c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda // This will force a clal to 79232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (IsKernel()) 793444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 7942c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda if (Symbols::DownloadObjectAndSymbolFile (module_spec, true)) 795d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda { 7962c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda if (module_spec.GetFileSpec().Exists()) 797d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda { 7982c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda m_module_sp.reset(new Module (module_spec.GetFileSpec(), target.GetArchitecture())); 7992c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda if (m_module_sp.get() && m_module_sp->MatchesModuleSpec (module_spec)) 8002c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda { 8012c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda ModuleList loaded_module_list; 8022c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda loaded_module_list.Append (m_module_sp); 8032c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda target.ModulesDidLoad (loaded_module_list); 8042c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda } 805d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda } 806d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda } 80732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 8082c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda 809e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda // If the current platform is PlatformDarwinKernel, create a ModuleSpec with the filename set 810e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda // to be the bundle ID for this kext, e.g. "com.apple.filesystems.msdosfs", and ask the platform 811e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda // to find it. 812e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda PlatformSP platform_sp (target.GetPlatform()); 813e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda if (platform_sp) 814e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda { 815e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda const char *pname = platform_sp->GetShortPluginName(); 816e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda if (pname && strcmp (pname, "darwin-kernel") == 0) 817e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda { 818e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda ModuleSpec kext_bundle_module_spec(module_spec); 819e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda FileSpec kext_filespec(m_name.c_str(), false); 820e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda kext_bundle_module_spec.GetFileSpec() = kext_filespec; 821e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda platform_sp->GetSharedModule (kext_bundle_module_spec, m_module_sp, &target.GetExecutableSearchPaths(), NULL, NULL); 822e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda } 823e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda } 824e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda 8252c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda // Ask the Target to find this file on the local system, if possible. 82632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // This will search in the list of currently-loaded files, look in the 82732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // standard search paths on the system, and on a Mac it will try calling 82832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // the DebugSymbols framework with the UUID to find the binary via its 82932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // search methods. 83032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (!m_module_sp) 83132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 83232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_module_sp = target.GetSharedModule (module_spec); 83332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 8340d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda 8352c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda if (IsKernel() && !m_module_sp) 8360d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda { 8370d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda Stream *s = &target.GetDebugger().GetOutputStream(); 8380d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda if (s) 8390d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda { 840fcd9bf14828ec4e4d2a69671eff05f0b824e46b3Jason Molenda s->Printf ("WARNING: Unable to locate kernel binary on this system.\n"); 8410d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda } 8420d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda } 84332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 84432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 84532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // If we managed to find a module, append it to the target's list of images. 84632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // If we also have a memory module, require that they have matching UUIDs 84732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_module_sp) 84832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 84932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda bool uuid_match_ok = true; 85032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_memory_module_sp) 85132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 85232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_module_sp->GetUUID() != m_memory_module_sp->GetUUID()) 853d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda { 85432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda uuid_match_ok = false; 855d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda } 85632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 85732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (uuid_match_ok) 85832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 859d79d625a522afdbdd127924a10d3db7e71395cacJason Molenda target.GetImages().AppendIfNeeded(m_module_sp); 86032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (IsKernel() && target.GetExecutableModulePointer() != m_module_sp.get()) 8615fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda { 86232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda target.SetExecutableModule (m_module_sp, false); 8635fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda } 864444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 865bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 866bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 8679ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 868fcd9bf14828ec4e4d2a69671eff05f0b824e46b3Jason Molenda if (!m_module_sp && !IsKernel() && m_uuid.IsValid() && !m_name.empty()) 869fcd9bf14828ec4e4d2a69671eff05f0b824e46b3Jason Molenda { 870fcd9bf14828ec4e4d2a69671eff05f0b824e46b3Jason Molenda Stream *s = &target.GetDebugger().GetOutputStream(); 871fcd9bf14828ec4e4d2a69671eff05f0b824e46b3Jason Molenda if (s) 872fcd9bf14828ec4e4d2a69671eff05f0b824e46b3Jason Molenda { 873fcd9bf14828ec4e4d2a69671eff05f0b824e46b3Jason Molenda char uuidbuf[64]; 874fcd9bf14828ec4e4d2a69671eff05f0b824e46b3Jason Molenda s->Printf ("warning: Can't find binary/dSYM for %s (%s)\n", 875fcd9bf14828ec4e4d2a69671eff05f0b824e46b3Jason Molenda m_name.c_str(), m_uuid.GetAsCString(uuidbuf, sizeof (uuidbuf))); 876fcd9bf14828ec4e4d2a69671eff05f0b824e46b3Jason Molenda } 877fcd9bf14828ec4e4d2a69671eff05f0b824e46b3Jason Molenda } 878bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 879a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton static ConstString g_section_name_LINKEDIT ("__LINKEDIT"); 880a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton 88132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_memory_module_sp && m_module_sp) 882bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 88332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_module_sp->GetUUID() == m_memory_module_sp->GetUUID()) 884bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 88532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda ObjectFile *ondisk_object_file = m_module_sp->GetObjectFile(); 88632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda ObjectFile *memory_object_file = m_memory_module_sp->GetObjectFile(); 887a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton 888d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda if (memory_object_file && ondisk_object_file) 889d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda { 89032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // The memory_module for kexts may have an invalid __LINKEDIT seg; skip it. 89132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda const bool ignore_linkedit = !IsKernel (); 892a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton 893d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda SectionList *ondisk_section_list = ondisk_object_file->GetSectionList (); 894d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda SectionList *memory_section_list = memory_object_file->GetSectionList (); 895d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda if (memory_section_list && ondisk_section_list) 896bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 897d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda const uint32_t num_ondisk_sections = ondisk_section_list->GetSize(); 898d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda // There may be CTF sections in the memory image so we can't 899d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda // always just compare the number of sections (which are actually 900d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda // segments in mach-o parlance) 901d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda uint32_t sect_idx = 0; 902d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda 903d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda // Use the memory_module's addresses for each section to set the 904d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda // file module's load address as appropriate. We don't want to use 905d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda // a single slide value for the entire kext - different segments may 906d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda // be slid different amounts by the kext loader. 907d6b8122cee3dd02255bf50a7d019f17dfeba463aJason Molenda 908d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda uint32_t num_sections_loaded = 0; 909d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda for (sect_idx=0; sect_idx<num_ondisk_sections; ++sect_idx) 910d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda { 911d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda SectionSP ondisk_section_sp(ondisk_section_list->GetSectionAtIndex(sect_idx)); 912d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda if (ondisk_section_sp) 913bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 914a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton // Don't ever load __LINKEDIT as it may or may not be actually 915a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton // mapped into memory and there is no current way to tell. 916a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton // I filed rdar://problem/12851706 to track being able to tell 917a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton // if the __LINKEDIT is actually mapped, but until then, we need 918a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton // to not load the __LINKEDIT 919a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton if (ignore_linkedit && ondisk_section_sp->GetName() == g_section_name_LINKEDIT) 920a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton continue; 921a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton 922d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda const Section *memory_section = memory_section_list->FindSectionByName(ondisk_section_sp->GetName()).get(); 923d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda if (memory_section) 9240fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton { 925d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda target.GetSectionLoadList().SetSectionLoadAddress (ondisk_section_sp, memory_section->GetFileAddress()); 926d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda ++num_sections_loaded; 9270fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton } 9280fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton } 929bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 930d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda if (num_sections_loaded > 0) 93132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_load_process_stop_id = process->GetStopID(); 9329ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton else 93332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_module_sp.reset(); // No sections were loaded 934bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 9359ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton else 93632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_module_sp.reset(); // One or both section lists 937bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 9389ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton else 93932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_module_sp.reset(); // One or both object files missing 940bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 941d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda else 94232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_module_sp.reset(); // UUID mismatch 943bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 944d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda 9459ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton bool is_loaded = IsLoaded(); 9469ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 94732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (is_loaded && m_module_sp && IsKernel()) 9484952db8c76f619e3d8a0cf13456097128009d67bJason Molenda { 9494952db8c76f619e3d8a0cf13456097128009d67bJason Molenda Stream *s = &target.GetDebugger().GetOutputStream(); 9504952db8c76f619e3d8a0cf13456097128009d67bJason Molenda if (s) 9514952db8c76f619e3d8a0cf13456097128009d67bJason Molenda { 95288f7e75c5d40b109e33fc0df08fa51a48d70e450Jason Molenda ObjectFile *kernel_object_file = m_module_sp->GetObjectFile(); 95388f7e75c5d40b109e33fc0df08fa51a48d70e450Jason Molenda if (kernel_object_file) 95488f7e75c5d40b109e33fc0df08fa51a48d70e450Jason Molenda { 95588f7e75c5d40b109e33fc0df08fa51a48d70e450Jason Molenda addr_t file_address = kernel_object_file->GetHeaderAddress().GetFileAddress(); 95688f7e75c5d40b109e33fc0df08fa51a48d70e450Jason Molenda if (m_load_address != LLDB_INVALID_ADDRESS && file_address != LLDB_INVALID_ADDRESS) 95788f7e75c5d40b109e33fc0df08fa51a48d70e450Jason Molenda { 958e5bc8c178390c217a91509e9f1db48cabbd11e33Matt Kopec s->Printf ("Kernel slid 0x%" PRIx64 " in memory.\n", m_load_address - file_address); 95988f7e75c5d40b109e33fc0df08fa51a48d70e450Jason Molenda } 96088f7e75c5d40b109e33fc0df08fa51a48d70e450Jason Molenda } 96132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_module_sp->GetFileSpec().GetDirectory().IsEmpty()) 96263e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda { 96332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda s->Printf ("Loaded kernel file %s\n", m_module_sp->GetFileSpec().GetFilename().AsCString()); 96463e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda } 96563e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda else 96663e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda { 96763e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda s->Printf ("Loaded kernel file %s/%s\n", 96832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_module_sp->GetFileSpec().GetDirectory().AsCString(), 96932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_module_sp->GetFileSpec().GetFilename().AsCString()); 97063e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda } 9714952db8c76f619e3d8a0cf13456097128009d67bJason Molenda s->Flush (); 9724952db8c76f619e3d8a0cf13456097128009d67bJason Molenda } 9734952db8c76f619e3d8a0cf13456097128009d67bJason Molenda } 9749ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return is_loaded; 975bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 976bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 97749ce8969d3154e1560106cfe530444c09410f217Greg Claytonuint32_t 97832a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::GetAddressByteSize () 97949ce8969d3154e1560106cfe530444c09410f217Greg Clayton{ 98032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_memory_module_sp) 98132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return m_memory_module_sp->GetArchitecture().GetAddressByteSize(); 98232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_module_sp) 98332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return m_module_sp->GetArchitecture().GetAddressByteSize(); 98449ce8969d3154e1560106cfe530444c09410f217Greg Clayton return 0; 98549ce8969d3154e1560106cfe530444c09410f217Greg Clayton} 98649ce8969d3154e1560106cfe530444c09410f217Greg Clayton 98749ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb::ByteOrder 98832a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::GetByteOrder() 98949ce8969d3154e1560106cfe530444c09410f217Greg Clayton{ 99032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_memory_module_sp) 99132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return m_memory_module_sp->GetArchitecture().GetByteOrder(); 99232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_module_sp) 99332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return m_module_sp->GetArchitecture().GetByteOrder(); 99449ce8969d3154e1560106cfe530444c09410f217Greg Clayton return lldb::endian::InlHostByteOrder(); 99549ce8969d3154e1560106cfe530444c09410f217Greg Clayton} 99649ce8969d3154e1560106cfe530444c09410f217Greg Clayton 99749ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb_private::ArchSpec 99832a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::GetArchitecture () const 99949ce8969d3154e1560106cfe530444c09410f217Greg Clayton{ 100032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_memory_module_sp) 100132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return m_memory_module_sp->GetArchitecture(); 100232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_module_sp) 100332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return m_module_sp->GetArchitecture(); 100449ce8969d3154e1560106cfe530444c09410f217Greg Clayton return lldb_private::ArchSpec (); 100549ce8969d3154e1560106cfe530444c09410f217Greg Clayton} 100649ce8969d3154e1560106cfe530444c09410f217Greg Clayton 100749ce8969d3154e1560106cfe530444c09410f217Greg Clayton 1008bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 10099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// Load the kernel module and initialize the "m_kernel" member. Return 10109ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// true _only_ if the kernel is loaded the first time through (subsequent 10119ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// calls to this function should return false after the kernel has been 10129ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// already loaded). 1013bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 10149ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonvoid 10159ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonDynamicLoaderDarwinKernel::LoadKernelModuleIfNeeded() 1016bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 10179ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (!m_kext_summary_header_ptr_addr.IsValid()) 1018bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 101932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_kernel.Clear(); 102032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_kernel.SetModule (m_process->GetTarget().GetExecutableModule()); 102132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_kernel.SetIsKernel(true); 1022fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda 1023fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda ConstString kernel_name("mach_kernel"); 102432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_kernel.GetModule().get() 102532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda && m_kernel.GetModule()->GetObjectFile() 102632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda && !m_kernel.GetModule()->GetObjectFile()->GetFileSpec().GetFilename().IsEmpty()) 1027fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda { 102832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda kernel_name = m_kernel.GetModule()->GetObjectFile()->GetFileSpec().GetFilename(); 1029fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda } 103032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_kernel.SetName (kernel_name.AsCString()); 1031fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda 103232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_kernel.GetLoadAddress() == LLDB_INVALID_ADDRESS) 1033bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 103432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_kernel.SetLoadAddress(m_kernel_load_address); 103532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_kernel.GetLoadAddress() == LLDB_INVALID_ADDRESS && m_kernel.GetModule()) 1036bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 10379ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // We didn't get a hint from the process, so we will 10389ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // try the kernel at the address that it exists at in 10399ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // the file if we have one 104032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda ObjectFile *kernel_object_file = m_kernel.GetModule()->GetObjectFile(); 10419ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (kernel_object_file) 1042fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda { 1043fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda addr_t load_address = kernel_object_file->GetHeaderAddress().GetLoadAddress(&m_process->GetTarget()); 1044fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda addr_t file_address = kernel_object_file->GetHeaderAddress().GetFileAddress(); 1045fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda if (load_address != LLDB_INVALID_ADDRESS && load_address != 0) 1046fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda { 104732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_kernel.SetLoadAddress (load_address); 1048fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda if (load_address != file_address) 1049fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda { 1050fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda // Don't accidentally relocate the kernel to the File address -- 1051fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda // the Load address has already been set to its actual in-memory address. 1052fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda // Mark it as IsLoaded. 105332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_kernel.SetProcessStopId (m_process->GetStopID()); 1054fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda } 1055fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda } 1056fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda else 1057fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda { 105832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_kernel.SetLoadAddress(file_address); 1059fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda } 1060fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda } 1061bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 1062bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 10639ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 106432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_kernel.GetLoadAddress() != LLDB_INVALID_ADDRESS) 1065aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton { 1066aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton if (!m_kernel.LoadImageUsingMemoryModule (m_process)) 1067aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton { 1068aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton m_kernel.LoadImageAtFileAddress (m_process); 1069aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton } 1070aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton } 10719ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 107232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_kernel.IsLoaded() && m_kernel.GetModule()) 10739ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 10749ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton static ConstString kext_summary_symbol ("gLoadedKextSummaries"); 107532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda const Symbol *symbol = m_kernel.GetModule()->FindFirstSymbolWithNameAndType (kext_summary_symbol, eSymbolTypeData); 10769ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (symbol) 10779ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 10780c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton m_kext_summary_header_ptr_addr = symbol->GetAddress(); 10799ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Update all image infos 10809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton ReadAllKextSummaries (); 10819ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 10829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 10839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton else 10849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 108532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_kernel.Clear(); 10869ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 1087bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 1088bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 1089bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1090bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 1091bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Static callback function that gets called when our DYLD notification 1092bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// breakpoint gets hit. We update all of our image infos and then 1093bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// let our super class DynamicLoader class decide if we should stop 1094bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// or not (based on global preference). 1095bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 1096bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool 109717f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::BreakpointHitCallback (void *baton, 1098645facaf9c247b20f0f135445d437181688711a7Greg Clayton StoppointCallbackContext *context, 1099645facaf9c247b20f0f135445d437181688711a7Greg Clayton user_id_t break_id, 1100645facaf9c247b20f0f135445d437181688711a7Greg Clayton user_id_t break_loc_id) 11018c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton{ 110217f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton return static_cast<DynamicLoaderDarwinKernel*>(baton)->BreakpointHit (context, break_id, break_loc_id); 1103bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 1104bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1105bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool 110617f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::BreakpointHit (StoppointCallbackContext *context, 1107645facaf9c247b20f0f135445d437181688711a7Greg Clayton user_id_t break_id, 1108645facaf9c247b20f0f135445d437181688711a7Greg Clayton user_id_t break_loc_id) 1109645facaf9c247b20f0f135445d437181688711a7Greg Clayton{ 1110952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER)); 11117dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton if (log) 111217f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton log->Printf ("DynamicLoaderDarwinKernel::BreakpointHit (...)\n"); 11137dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton 1114645facaf9c247b20f0f135445d437181688711a7Greg Clayton ReadAllKextSummaries (); 11157dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton 11167dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton if (log) 1117952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton PutToLog(log); 11187dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton 1119645facaf9c247b20f0f135445d437181688711a7Greg Clayton return GetStopWhenImagesChange(); 1120645facaf9c247b20f0f135445d437181688711a7Greg Clayton} 1121645facaf9c247b20f0f135445d437181688711a7Greg Clayton 1122645facaf9c247b20f0f135445d437181688711a7Greg Clayton 1123645facaf9c247b20f0f135445d437181688711a7Greg Claytonbool 112417f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::ReadKextSummaryHeader () 1125bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 1126bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Mutex::Locker locker(m_mutex); 1127bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1128bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton // the all image infos is already valid for this process stop ID 1129bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 11307dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton if (m_kext_summary_header_ptr_addr.IsValid()) 1131bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 1132bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const uint32_t addr_size = m_kernel.GetAddressByteSize (); 1133bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const ByteOrder byte_order = m_kernel.GetByteOrder(); 1134bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Error error; 1135bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton // Read enough bytes for a "OSKextLoadedKextSummaryHeader" structure 1136bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton // which is currenty 4 uint32_t and a pointer. 1137bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton uint8_t buf[24]; 1138bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton DataExtractor data (buf, sizeof(buf), byte_order, addr_size); 1139bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const size_t count = 4 * sizeof(uint32_t) + addr_size; 11408c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton const bool prefer_file_cache = false; 11417dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton if (m_process->GetTarget().ReadPointerFromMemory (m_kext_summary_header_ptr_addr, 11427dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton prefer_file_cache, 11437dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton error, 11447dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton m_kext_summary_header_addr)) 1145bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 11467dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton // We got a valid address for our kext summary header and make sure it isn't NULL 11477dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton if (m_kext_summary_header_addr.IsValid() && 11487dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton m_kext_summary_header_addr.GetFileAddress() != 0) 11497dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton { 11507dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton const size_t bytes_read = m_process->GetTarget().ReadMemory (m_kext_summary_header_addr, prefer_file_cache, buf, count, error); 11517dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton if (bytes_read == count) 11527dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton { 115336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = 0; 11540fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton m_kext_summary_header.version = data.GetU32(&offset); 11550fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton if (m_kext_summary_header.version >= 2) 11560fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton { 11570fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton m_kext_summary_header.entry_size = data.GetU32(&offset); 11580fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton } 11590fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton else 11600fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton { 11610fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton // Versions less than 2 didn't have an entry size, it was hard coded 11620fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton m_kext_summary_header.entry_size = KERNEL_MODULE_ENTRY_SIZE_VERSION_1; 11630fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton } 11640fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton m_kext_summary_header.entry_count = data.GetU32(&offset); 11657dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton return true; 11667dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton } 11677dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton } 1168bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 1169bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 11707dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton m_kext_summary_header_addr.Clear(); 1171bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return false; 1172bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 1173bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 117432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda// We've either (a) just attached to a new kernel, or (b) the kexts-changed breakpoint was hit 117532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda// and we need to figure out what kexts have been added or removed. 117632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda// Read the kext summaries from the inferior kernel memory, compare them against the 117732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda// m_known_kexts vector and update the m_known_kexts vector as needed to keep in sync with the 117832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda// inferior. 1179bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1180bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool 118132a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::ParseKextSummaries (const Address &kext_summary_addr, uint32_t count) 1182bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 118332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda KextImageInfo::collection kext_summaries; 1184952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER)); 1185bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (log) 118632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda log->Printf ("Kexts-changed breakpoint hit, there are %d kexts currently.\n", count); 1187bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1188bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Mutex::Locker locker(m_mutex); 1189bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1190bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (!ReadKextSummaries (kext_summary_addr, count, kext_summaries)) 1191bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return false; 1192bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 11937cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda // read the plugin.dynamic-loader.darwin-kernel.load-kexts setting -- if the user requested no 11947cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda // kext loading, don't print any messages about kexts & don't try to read them. 11957cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda const bool load_kexts = GetGlobalProperties()->GetLoadKexts(); 11967cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda 119732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // By default, all kexts we've loaded in the past are marked as "remove" and all of the kexts 119832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // we just found out about from ReadKextSummaries are marked as "add". 119932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda std::vector<bool> to_be_removed(m_known_kexts.size(), true); 120032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda std::vector<bool> to_be_added(count, true); 120132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 120232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda int number_of_new_kexts_being_added = 0; 120332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda int number_of_old_kexts_being_removed = m_known_kexts.size(); 120432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 120532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda const uint32_t new_kexts_size = kext_summaries.size(); 120632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda const uint32_t old_kexts_size = m_known_kexts.size(); 120732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 120832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // The m_known_kexts vector may have entries that have been Cleared, 120932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // or are a kernel. 121032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda for (uint32_t old_kext = 0; old_kext < old_kexts_size; old_kext++) 121132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 121232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda bool ignore = false; 121332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda KextImageInfo &image_info = m_known_kexts[old_kext]; 121432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (image_info.IsKernel()) 121532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 121632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda ignore = true; 121732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 121832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda else if (image_info.GetLoadAddress() == LLDB_INVALID_ADDRESS && !image_info.GetModule()) 121932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 122032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda ignore = true; 122132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 122232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 122332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (ignore) 122432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 122532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda number_of_old_kexts_being_removed--; 122632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda to_be_removed[old_kext] = false; 122732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 122832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 122932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 123032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // Scan over the list of kexts we just read from the kernel, note those that 123132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // need to be added and those already loaded. 123232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda for (uint32_t new_kext = 0; new_kext < new_kexts_size; new_kext++) 123332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 123432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda bool add_this_one = true; 123532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda for (uint32_t old_kext = 0; old_kext < old_kexts_size; old_kext++) 123632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 123732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_known_kexts[old_kext] == kext_summaries[new_kext]) 123832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 123932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // We already have this kext, don't re-load it. 124032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda to_be_added[new_kext] = false; 124132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // This kext is still present, do not remove it. 124232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda to_be_removed[old_kext] = false; 124332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 124432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda number_of_old_kexts_being_removed--; 124532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda add_this_one = false; 124632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda break; 124732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 124832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 124932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (add_this_one) 125032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 125132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda number_of_new_kexts_being_added++; 125232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 125332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 125432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 125532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (number_of_new_kexts_being_added == 0 && number_of_old_kexts_being_removed == 0) 125632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return true; 125732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 1258234981a4559db084f9c90612660e40f19915b89cGreg Clayton Stream *s = &m_process->GetTarget().GetDebugger().GetOutputStream(); 12597cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda if (s && load_kexts) 1260bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 126132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (number_of_new_kexts_being_added > 0 && number_of_old_kexts_being_removed > 0) 126232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 126332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda s->Printf ("Loading %d kext modules and unloading %d kext modules ", number_of_new_kexts_being_added, number_of_old_kexts_being_removed); 126432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 126532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda else if (number_of_new_kexts_being_added > 0) 126632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 126732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda s->Printf ("Loading %d kext modules ", number_of_new_kexts_being_added); 126832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 126932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda else if (number_of_old_kexts_being_removed > 0) 127032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 127132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda s->Printf ("Unloading %d kext modules ", number_of_old_kexts_being_removed); 127232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 127332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 12749ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 127532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (log) 12767cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda { 12777cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda if (load_kexts) 12787cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda { 12797cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda log->Printf ("DynamicLoaderDarwinKernel::ParseKextSummaries: %d kexts added, %d kexts removed", number_of_new_kexts_being_added, number_of_old_kexts_being_removed); 12807cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda } 12817cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda else 12827cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda { 12837cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda log->Printf ("DynamicLoaderDarwinKernel::ParseKextSummaries kext loading is disabled, else would have %d kexts added, %d kexts removed", number_of_new_kexts_being_added, number_of_old_kexts_being_removed); 12847cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda } 12857cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda } 12867cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda 12874952db8c76f619e3d8a0cf13456097128009d67bJason Molenda 128832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (number_of_new_kexts_being_added > 0) 128932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 129032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda ModuleList loaded_module_list; 129132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 129232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda const uint32_t num_of_new_kexts = kext_summaries.size(); 129332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda for (uint32_t new_kext = 0; new_kext < num_of_new_kexts; new_kext++) 129432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 129532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (to_be_added[new_kext] == true) 129632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 129732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda KextImageInfo &image_info = kext_summaries[new_kext]; 12987cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda if (load_kexts) 12997cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda { 13007cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda if (!image_info.LoadImageUsingMemoryModule (m_process)) 13017cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda { 13027cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda image_info.LoadImageAtFileAddress (m_process); 13037cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda } 13047cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda } 130532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 130632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_known_kexts.push_back(image_info); 130732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 130832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (image_info.GetModule() && m_process->GetStopID() == image_info.GetProcessStopId()) 130932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda loaded_module_list.AppendIfNeeded (image_info.GetModule()); 131032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 13117cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda if (s && load_kexts) 131232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda s->Printf ("."); 131332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 131432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (log) 1315952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton kext_summaries[new_kext].PutToLog (log); 131632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 131732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 131832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_process->GetTarget().ModulesDidLoad (loaded_module_list); 1319bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 132032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 132132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (number_of_old_kexts_being_removed > 0) 132232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 132332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda ModuleList loaded_module_list; 132432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda const uint32_t num_of_old_kexts = m_known_kexts.size(); 132532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda for (uint32_t old_kext = 0; old_kext < num_of_old_kexts; old_kext++) 132632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 132732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda ModuleList unloaded_module_list; 132832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (to_be_removed[old_kext]) 132932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 133032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda KextImageInfo &image_info = m_known_kexts[old_kext]; 133132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // You can't unload the kernel. 133232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (!image_info.IsKernel()) 133332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 133432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (image_info.GetModule()) 133532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda { 133632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda unloaded_module_list.AppendIfNeeded (image_info.GetModule()); 133732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 133832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (s) 133932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda s->Printf ("."); 134032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda image_info.Clear(); 134132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // should pull it out of the KextImageInfos vector but that would mutate the list and invalidate 134232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda // the to_be_removed bool vector; leaving it in place once Cleared() is relatively harmless. 134332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 134432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 134532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_process->GetTarget().ModulesDidUnload (unloaded_module_list); 134632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 134732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda } 134832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda 13497cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda if (s && load_kexts) 13504952db8c76f619e3d8a0cf13456097128009d67bJason Molenda { 13514952db8c76f619e3d8a0cf13456097128009d67bJason Molenda s->Printf (" done.\n"); 13524952db8c76f619e3d8a0cf13456097128009d67bJason Molenda s->Flush (); 13534952db8c76f619e3d8a0cf13456097128009d67bJason Molenda } 13544952db8c76f619e3d8a0cf13456097128009d67bJason Molenda 135532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda return true; 1356bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 1357bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1358bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonuint32_t 135917f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::ReadKextSummaries (const Address &kext_summary_addr, 1360bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton uint32_t image_infos_count, 136132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda KextImageInfo::collection &image_infos) 1362bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 1363bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const ByteOrder endian = m_kernel.GetByteOrder(); 1364bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const uint32_t addr_size = m_kernel.GetAddressByteSize(); 1365bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1366bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton image_infos.resize(image_infos_count); 1367bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const size_t count = image_infos.size() * m_kext_summary_header.entry_size; 1368bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton DataBufferHeap data(count, 0); 1369bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Error error; 13707b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton 13718c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton const bool prefer_file_cache = false; 13728c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton const size_t bytes_read = m_process->GetTarget().ReadMemory (kext_summary_addr, 13738c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton prefer_file_cache, 13748c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton data.GetBytes(), 13758c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton data.GetByteSize(), 13768c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton error); 1377bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (bytes_read == count) 1378bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 13790fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton 1380bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton DataExtractor extractor (data.GetBytes(), data.GetByteSize(), endian, addr_size); 1381bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton uint32_t i=0; 13820fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton for (uint32_t kext_summary_offset = 0; 13830fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton i < image_infos.size() && extractor.ValidOffsetForDataOfSize(kext_summary_offset, m_kext_summary_header.entry_size); 13840fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton ++i, kext_summary_offset += m_kext_summary_header.entry_size) 1385bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 138636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = kext_summary_offset; 1387bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const void *name_data = extractor.GetData(&offset, KERNEL_MODULE_MAX_NAME); 1388bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (name_data == NULL) 1389bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton break; 139032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda image_infos[i].SetName ((const char *) name_data); 139132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda UUID uuid (extractor.GetData (&offset, 16), 16); 139232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda image_infos[i].SetUUID (uuid); 139332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda image_infos[i].SetLoadAddress (extractor.GetU64(&offset)); 139432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda image_infos[i].SetSize (extractor.GetU64(&offset)); 1395bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 1396bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (i < image_infos.size()) 1397bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton image_infos.resize(i); 1398bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 1399bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton else 1400bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 1401bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton image_infos.clear(); 1402bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 1403bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return image_infos.size(); 1404bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 1405bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1406bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool 140717f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::ReadAllKextSummaries () 1408bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 1409bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Mutex::Locker locker(m_mutex); 1410645facaf9c247b20f0f135445d437181688711a7Greg Clayton 1411bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (ReadKextSummaryHeader ()) 1412bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 1413645facaf9c247b20f0f135445d437181688711a7Greg Clayton if (m_kext_summary_header.entry_count > 0 && m_kext_summary_header_addr.IsValid()) 1414bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 14158c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton Address summary_addr (m_kext_summary_header_addr); 14160fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton summary_addr.Slide(m_kext_summary_header.GetSize()); 14178c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton if (!ParseKextSummaries (summary_addr, m_kext_summary_header.entry_count)) 1418bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 141932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_known_kexts.clear(); 1420bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 1421bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return true; 1422bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 1423bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 1424bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return false; 1425bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 1426bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1427bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 1428bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Dump an image info structure to the file handle provided. 1429bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 1430bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 143132a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::PutToLog (Log *log) const 1432bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 1433bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (log == NULL) 1434bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return; 143532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda const uint8_t *u = (uint8_t *) m_uuid.GetBytes(); 1436bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 143732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_load_address == LLDB_INVALID_ADDRESS) 1438bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 1439bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (u) 1440bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 14410fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton log->Printf("\tuuid=%2.2X%2.2X%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X name=\"%s\" (UNLOADED)", 1442bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton u[ 0], u[ 1], u[ 2], u[ 3], 1443bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton u[ 4], u[ 5], u[ 6], u[ 7], 1444bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton u[ 8], u[ 9], u[10], u[11], 1445bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton u[12], u[13], u[14], u[15], 144632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_name.c_str()); 1447bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 1448bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton else 144932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda log->Printf("\tname=\"%s\" (UNLOADED)", m_name.c_str()); 1450bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 1451bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton else 1452bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 1453bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (u) 1454bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 145532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda log->Printf("\taddr=0x%16.16" PRIx64 " size=0x%16.16" PRIx64 " uuid=%2.2X%2.2X%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X name=\"%s\"", 145632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_load_address, m_size, 14570fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton u[ 0], u[ 1], u[ 2], u[ 3], u[ 4], u[ 5], u[ 6], u[ 7], 14580fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton u[ 8], u[ 9], u[10], u[11], u[12], u[13], u[14], u[15], 145932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_name.c_str()); 1460bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 1461bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton else 1462bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 146332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda log->Printf("\t[0x%16.16" PRIx64 " - 0x%16.16" PRIx64 ") name=\"%s\"", 146432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_load_address, m_load_address+m_size, m_name.c_str()); 1465bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 1466bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 1467bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 1468bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1469bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 1470bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Dump the _dyld_all_image_infos members and all current image infos 1471bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// that we have parsed to the file handle provided. 1472bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 1473bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 147417f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::PutToLog(Log *log) const 1475bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 1476bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (log == NULL) 1477bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return; 1478bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1479bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Mutex::Locker locker(m_mutex); 14805f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("gLoadedKextSummaries = 0x%16.16" PRIx64 " { version=%u, entry_size=%u, entry_count=%u }", 14818c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton m_kext_summary_header_addr.GetFileAddress(), 1482bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kext_summary_header.version, 1483bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kext_summary_header.entry_size, 14840fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton m_kext_summary_header.entry_count); 1485bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1486bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton size_t i; 148732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda const size_t count = m_known_kexts.size(); 1488bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (count > 0) 1489bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 1490bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton log->PutCString("Loaded:"); 1491bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton for (i = 0; i<count; i++) 149232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda m_known_kexts[i].PutToLog(log); 1493bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 1494bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 1495bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1496bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 149717f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::PrivateInitialize(Process *process) 1498bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 149917f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton DEBUG_PRINTF("DynamicLoaderDarwinKernel::%s() process state = %s\n", __FUNCTION__, StateAsCString(m_process->GetState())); 1500bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Clear(true); 1501bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_process = process; 1502bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 1503bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1504645facaf9c247b20f0f135445d437181688711a7Greg Claytonvoid 150517f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::SetNotificationBreakpointIfNeeded () 1506bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 150732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda if (m_break_id == LLDB_INVALID_BREAK_ID && m_kernel.GetModule()) 1508645facaf9c247b20f0f135445d437181688711a7Greg Clayton { 150917f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton DEBUG_PRINTF("DynamicLoaderDarwinKernel::%s() process state = %s\n", __FUNCTION__, StateAsCString(m_process->GetState())); 1510645facaf9c247b20f0f135445d437181688711a7Greg Clayton 15117dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton 15122cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham const bool internal_bp = true; 15137dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton const LazyBool skip_prologue = eLazyBoolNo; 151403c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham FileSpecList module_spec_list; 151532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda module_spec_list.Append (m_kernel.GetModule()->GetFileSpec()); 151603c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham Breakpoint *bp = m_process->GetTarget().CreateBreakpoint (&module_spec_list, 1517d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham NULL, 1518645facaf9c247b20f0f135445d437181688711a7Greg Clayton "OSKextLoadedKextSummariesUpdated", 1519645facaf9c247b20f0f135445d437181688711a7Greg Clayton eFunctionNameTypeFull, 15202cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham skip_prologue, 15212cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham internal_bp).get(); 1522645facaf9c247b20f0f135445d437181688711a7Greg Clayton 152317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton bp->SetCallback (DynamicLoaderDarwinKernel::BreakpointHitCallback, this, true); 1524645facaf9c247b20f0f135445d437181688711a7Greg Clayton m_break_id = bp->GetID(); 1525645facaf9c247b20f0f135445d437181688711a7Greg Clayton } 1526bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 1527bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1528bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 1529bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Member function that gets called when the process state changes. 1530bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 1531bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 153217f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::PrivateProcessStateChanged (Process *process, StateType state) 1533bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 153417f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton DEBUG_PRINTF("DynamicLoaderDarwinKernel::%s(%s)\n", __FUNCTION__, StateAsCString(state)); 1535bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton switch (state) 1536bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 1537bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateConnected: 1538bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateAttaching: 1539bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateLaunching: 1540bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateInvalid: 1541bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateUnloaded: 1542bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateExited: 1543bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateDetached: 1544bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Clear(false); 1545bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton break; 1546bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1547bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateStopped: 1548645facaf9c247b20f0f135445d437181688711a7Greg Clayton UpdateIfNeeded(); 1549bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton break; 1550bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1551bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateRunning: 1552bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateStepping: 1553bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateCrashed: 1554bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateSuspended: 1555bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton break; 1556bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 1557bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 1558bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1559bbea13375ec4ae876576fcb8608626d45880dd96Greg ClaytonThreadPlanSP 156017f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetStepThroughTrampolinePlan (Thread &thread, bool stop_others) 1561bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 1562bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton ThreadPlanSP thread_plan_sp; 1563952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 1564645facaf9c247b20f0f135445d437181688711a7Greg Clayton if (log) 1565645facaf9c247b20f0f135445d437181688711a7Greg Clayton log->Printf ("Could not find symbol for step through."); 1566bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return thread_plan_sp; 1567bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 1568bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1569bbea13375ec4ae876576fcb8608626d45880dd96Greg ClaytonError 157017f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::CanLoadImage () 1571bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 1572bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Error error; 1573bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton error.SetErrorString("always unsafe to load or unload shared libraries in the darwin kernel"); 1574bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return error; 1575bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 1576bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1577bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 157817f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::Initialize() 1579bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 1580bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton PluginManager::RegisterPlugin (GetPluginNameStatic(), 1581bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton GetPluginDescriptionStatic(), 158287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton CreateInstance, 158387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton DebuggerInitialize); 1584bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 1585bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1586bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 158717f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::Terminate() 1588bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 1589bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton PluginManager::UnregisterPlugin (CreateInstance); 1590bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 1591bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 159287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonvoid 159387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg ClaytonDynamicLoaderDarwinKernel::DebuggerInitialize (lldb_private::Debugger &debugger) 159487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton{ 159587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton if (!PluginManager::GetSettingForDynamicLoaderPlugin (debugger, DynamicLoaderDarwinKernelProperties::GetSettingName())) 159687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton { 159787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton const bool is_global_setting = true; 159887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton PluginManager::CreateSettingForDynamicLoaderPlugin (debugger, 159987e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton GetGlobalProperties()->GetValueProperties(), 160087e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton ConstString ("Properties for the DynamicLoaderDarwinKernel plug-in."), 160187e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton is_global_setting); 160287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton } 160387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton} 1604bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1605bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonconst char * 160617f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetPluginNameStatic() 1607bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 16082acbc2a80c0116454426db2d8b55bc23e6cbb0c1Greg Clayton return "dynamic-loader.darwin-kernel"; 1609bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 1610bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1611bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonconst char * 161217f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetPluginDescriptionStatic() 1613bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 1614bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return "Dynamic loader plug-in that watches for shared library loads/unloads in the MacOSX kernel."; 1615bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 1616bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1617bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1618bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------ 1619bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// PluginInterface protocol 1620bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------ 1621bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonconst char * 162217f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetPluginName() 1623bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 162417f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton return "DynamicLoaderDarwinKernel"; 1625bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 1626bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1627bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonconst char * 162817f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetShortPluginName() 1629bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 1630bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return GetPluginNameStatic(); 1631bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 1632bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1633bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonuint32_t 163417f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetPluginVersion() 1635bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 1636bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return 1; 1637bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 1638bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 163949ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb::ByteOrder 164049ce8969d3154e1560106cfe530444c09410f217Greg ClaytonDynamicLoaderDarwinKernel::GetByteOrderFromMagic (uint32_t magic) 164149ce8969d3154e1560106cfe530444c09410f217Greg Clayton{ 164249ce8969d3154e1560106cfe530444c09410f217Greg Clayton switch (magic) 164349ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 164449ce8969d3154e1560106cfe530444c09410f217Greg Clayton case llvm::MachO::HeaderMagic32: 164549ce8969d3154e1560106cfe530444c09410f217Greg Clayton case llvm::MachO::HeaderMagic64: 164649ce8969d3154e1560106cfe530444c09410f217Greg Clayton return lldb::endian::InlHostByteOrder(); 164749ce8969d3154e1560106cfe530444c09410f217Greg Clayton 164849ce8969d3154e1560106cfe530444c09410f217Greg Clayton case llvm::MachO::HeaderMagic32Swapped: 164949ce8969d3154e1560106cfe530444c09410f217Greg Clayton case llvm::MachO::HeaderMagic64Swapped: 165049ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (lldb::endian::InlHostByteOrder() == lldb::eByteOrderBig) 165149ce8969d3154e1560106cfe530444c09410f217Greg Clayton return lldb::eByteOrderLittle; 165249ce8969d3154e1560106cfe530444c09410f217Greg Clayton else 165349ce8969d3154e1560106cfe530444c09410f217Greg Clayton return lldb::eByteOrderBig; 165449ce8969d3154e1560106cfe530444c09410f217Greg Clayton 165549ce8969d3154e1560106cfe530444c09410f217Greg Clayton default: 165649ce8969d3154e1560106cfe530444c09410f217Greg Clayton break; 165749ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 165849ce8969d3154e1560106cfe530444c09410f217Greg Clayton return lldb::eByteOrderInvalid; 165949ce8969d3154e1560106cfe530444c09410f217Greg Clayton} 166049ce8969d3154e1560106cfe530444c09410f217Greg Clayton 1661