DynamicLoaderDarwinKernel.cpp revision 444fe998bf707bd076a70c3a779db8575533695e
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 10bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Breakpoint/StoppointCallbackContext.h" 11bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Core/DataBuffer.h" 12bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Core/DataBufferHeap.h" 13234981a4559db084f9c90612660e40f19915b89cGreg Clayton#include "lldb/Core/Debugger.h" 14bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Core/Log.h" 15bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Core/Module.h" 16bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Core/PluginManager.h" 17bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Core/State.h" 18bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Symbol/ObjectFile.h" 19bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Target/ObjCLanguageRuntime.h" 20bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Target/RegisterContext.h" 21bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Target/Target.h" 22bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Target/Thread.h" 23bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Target/ThreadPlanRunToAddress.h" 24bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Target/StackFrame.h" 25bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 2617f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton#include "DynamicLoaderDarwinKernel.h" 27bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 28bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//#define ENABLE_DEBUG_PRINTF // COMMENT THIS LINE OUT PRIOR TO CHECKIN 29bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#ifdef ENABLE_DEBUG_PRINTF 30bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include <stdio.h> 31bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#define DEBUG_PRINTF(fmt, ...) printf(fmt, ## __VA_ARGS__) 32bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#else 33bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#define DEBUG_PRINTF(fmt, ...) 34bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#endif 35bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 36bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonusing namespace lldb; 37bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonusing namespace lldb_private; 38bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 39bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// FIXME - The ObjC Runtime trampoline handler doesn't really belong here. 40bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// I am putting it here so I can invoke it in the Trampoline code here, but 41bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// it should be moved to the ObjC Runtime support when it is set up. 42bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 43bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 44bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 45bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Create an instance of this class. This function is filled into 46bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// the plugin info class that gets handed out by the plugin factory and 47bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// allows the lldb to instantiate an instance of this class. 48bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 49bbea13375ec4ae876576fcb8608626d45880dd96Greg ClaytonDynamicLoader * 5017f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::CreateInstance (Process* process, bool force) 51bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 52bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton bool create = force; 53bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (!create) 54bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 555beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton Module* exe_module = process->GetTarget().GetExecutableModulePointer(); 5640f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton if (exe_module) 5740f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton { 5840f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton ObjectFile *object_file = exe_module->GetObjectFile(); 5940f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton if (object_file) 6040f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton { 61ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan create = (object_file->GetStrata() == ObjectFile::eStrataKernel); 6240f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton } 6340f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton } 6440f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton 6540f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton if (create) 6640f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton { 6740f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton const llvm::Triple &triple_ref = process->GetTarget().GetArchitecture().GetTriple(); 6840f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton create = triple_ref.getOS() == llvm::Triple::Darwin && triple_ref.getVendor() == llvm::Triple::Apple; 6940f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton } 70bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 71bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 72bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (create) 736cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan { 746cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan process->SetCanJIT(false); 7517f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton return new DynamicLoaderDarwinKernel (process); 766cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan } 77bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return NULL; 78bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 79bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 80bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 81bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Constructor 82bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 8317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::DynamicLoaderDarwinKernel (Process* process) : 84bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton DynamicLoader(process), 85bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kernel(), 867dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton m_kext_summary_header_ptr_addr (), 878c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton m_kext_summary_header_addr (), 88bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kext_summary_header (), 89bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kext_summaries(), 9097c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_mutex(Mutex::eMutexTypeRecursive), 9197c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_break_id (LLDB_INVALID_BREAK_ID) 92bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 93bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 94bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 95bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 96bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Destructor 97bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 9817f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::~DynamicLoaderDarwinKernel() 99bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 100bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Clear(true); 101bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 102bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 103645facaf9c247b20f0f135445d437181688711a7Greg Claytonvoid 10417f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::UpdateIfNeeded() 105645facaf9c247b20f0f135445d437181688711a7Greg Clayton{ 106645facaf9c247b20f0f135445d437181688711a7Greg Clayton LoadKernelModuleIfNeeded(); 107645facaf9c247b20f0f135445d437181688711a7Greg Clayton SetNotificationBreakpointIfNeeded (); 108645facaf9c247b20f0f135445d437181688711a7Greg Clayton} 109bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------ 110bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// Called after attaching a process. 111bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// 112bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// Allow DynamicLoader plug-ins to execute some code after 113bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// attaching to a process. 114bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------ 115bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 11617f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::DidAttach () 117bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 118bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton PrivateInitialize(m_process); 119645facaf9c247b20f0f135445d437181688711a7Greg Clayton UpdateIfNeeded(); 120bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 121bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 122bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------ 123bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// Called after attaching a process. 124bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// 125bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// Allow DynamicLoader plug-ins to execute some code after 126bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// attaching to a process. 127bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------ 128bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 12917f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::DidLaunch () 130bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 131bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton PrivateInitialize(m_process); 132645facaf9c247b20f0f135445d437181688711a7Greg Clayton UpdateIfNeeded(); 133bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 134bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 135bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 136bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 137bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Clear out the state of this class. 138bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 139bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 14017f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::Clear (bool clear_process) 141bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 142bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Mutex::Locker locker(m_mutex); 143bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 144bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (m_process->IsAlive() && LLDB_BREAK_ID_IS_VALID(m_break_id)) 145bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_process->ClearBreakpointSiteByID(m_break_id); 146bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 147bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (clear_process) 148bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_process = NULL; 149bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kernel.Clear(false); 1507dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton m_kext_summary_header_ptr_addr.Clear(); 1518c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton m_kext_summary_header_addr.Clear(); 152bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kext_summaries.clear(); 153bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_break_id = LLDB_INVALID_BREAK_ID; 154bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 155bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 156bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 157bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool 1589ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonDynamicLoaderDarwinKernel::OSKextLoadedKextSummary::LoadImageUsingMemoryModule (Process *process) 159bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 1609ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (IsLoaded()) 1619ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return true; 162bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1639ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton bool uuid_is_valid = uuid.IsValid(); 164bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1659ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton Target &target = process->GetTarget(); 1669ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton ModuleSP memory_module_sp; 1679ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Use the memory module as the module if we have one... 1689ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (address != LLDB_INVALID_ADDRESS) 169bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 1709ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton FileSpec file_spec; 1719ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (module_sp) 1729ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton file_spec = module_sp->GetFileSpec(); 1739ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton else 1749ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton file_spec.SetFile (name, false); 1759ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 1769ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton memory_module_sp = process->ReadModuleFromMemory (file_spec, address, false, false); 1779ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (memory_module_sp && !uuid_is_valid) 178bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 1799ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton uuid = memory_module_sp->GetUUID(); 1809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton uuid_is_valid = uuid.IsValid(); 181bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 182bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 183bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 1849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (!module_sp) 185bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 1869ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton bool uuid_is_valid = uuid.IsValid(); 1879ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (uuid_is_valid) 188bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 1899ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton ModuleList &target_images = target.GetImages(); 1909ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_sp = target_images.FindModule(uuid); 1919ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 1929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (!module_sp) 193444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 194444fe998bf707bd076a70c3a779db8575533695eGreg Clayton ModuleSpec module_spec (FileSpec(), target.GetArchitecture()); 195444fe998bf707bd076a70c3a779db8575533695eGreg Clayton module_spec.GetUUID() = uuid; 196444fe998bf707bd076a70c3a779db8575533695eGreg Clayton module_sp = target.GetSharedModule (module_spec); 197444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 198bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 199bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 2009ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 201bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 2029ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (memory_module_sp) 203bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 2049ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Someone already supplied a file, make sure it is the right one. 2059ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (module_sp) 206bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 2079ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (module_sp->GetUUID() == memory_module_sp->GetUUID()) 208bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 2099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton ObjectFile *ondisk_object_file = module_sp->GetObjectFile(); 2109ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton ObjectFile *memory_object_file = memory_module_sp->GetObjectFile(); 2119ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (memory_object_file && ondisk_object_file) 212bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 2139ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton SectionList *ondisk_section_list = ondisk_object_file->GetSectionList (); 2149ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton SectionList *memory_section_list = memory_object_file->GetSectionList (); 2159ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (memory_section_list && ondisk_section_list) 216bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 21795d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton const uint32_t num_ondisk_sections = ondisk_section_list->GetSize(); 2189ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // There may be CTF sections in the memory image so we can't 2199ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // always just compare the number of sections (which are actually 2209ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // segments in mach-o parlance) 2219ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton uint32_t sect_idx = 0; 22295d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton 22395d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton 22495d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton // We now iterate through all sections in the file module 22595d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton // and look to see if the memory module has a load address 22695d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton // for that section. 22795d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton uint32_t num_sections_loaded = 0; 22895d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton for (sect_idx=0; sect_idx<num_ondisk_sections; ++sect_idx) 229bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 23095d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton const Section *ondisk_section = ondisk_section_list->GetSectionAtIndex(sect_idx).get(); 23195d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton if (ondisk_section) 2320fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton { 23395d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton const Section *memory_section = memory_section_list->FindSectionByName(ondisk_section->GetName()).get(); 23495d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton if (memory_section) 23595d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton { 23695d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton target.GetSectionLoadList().SetSectionLoadAddress (ondisk_section, memory_section->GetFileAddress()); 23795d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton ++num_sections_loaded; 23895d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton } 2390fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton } 2400fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton } 24195d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton if (num_sections_loaded > 0) 24295d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton load_process_stop_id = process->GetStopID(); 24395d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton else 24495d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton module_sp.reset(); // No sections were loaded 245bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 2469ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton else 2479ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_sp.reset(); // One or both section lists 248bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 2499ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton else 2509ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_sp.reset(); // One or both object files missing 251bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 2529ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton else 2539ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_sp.reset(); // UUID mismatch 2549ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2559ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 2569ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Use the memory module as the module if we didn't like the file 2579ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // module we either found or were supplied with 2589ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (!module_sp) 2599ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 2609ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_sp = memory_module_sp; 2619ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Load the memory image in the target as all adresses are already correct 2629ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton bool changed = false; 2639ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton target.GetImages().Append (memory_module_sp); 2649ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (module_sp->SetLoadAddress (target, 0, changed)) 2659ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton load_process_stop_id = process->GetStopID(); 266bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 267bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 2689ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton bool is_loaded = IsLoaded(); 2699ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 2709ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (so_address.IsValid()) 2719ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 2729ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (is_loaded) 2739ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton so_address.SetLoadAddress (address, &target); 2749ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton else 2759ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton target.GetImages().ResolveFileAddress (address, so_address); 2769ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 2779ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2789ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return is_loaded; 279bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 280bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 281bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 2829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// Load the kernel module and initialize the "m_kernel" member. Return 2839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// true _only_ if the kernel is loaded the first time through (subsequent 2849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// calls to this function should return false after the kernel has been 2859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// already loaded). 286bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 2879ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonvoid 2889ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonDynamicLoaderDarwinKernel::LoadKernelModuleIfNeeded() 289bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 2909ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (!m_kext_summary_header_ptr_addr.IsValid()) 291bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 2929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_kernel.Clear(false); 2939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_kernel.module_sp = m_process->GetTarget().GetExecutableModule(); 2949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton strncpy(m_kernel.name, "mach_kernel", sizeof(m_kernel.name)); 2959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (m_kernel.address == LLDB_INVALID_ADDRESS) 296bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 2979ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_kernel.address = m_process->GetImageInfoAddress (); 2989ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (m_kernel.address == LLDB_INVALID_ADDRESS && m_kernel.module_sp) 299bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 3009ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // We didn't get a hint from the process, so we will 3019ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // try the kernel at the address that it exists at in 3029ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // the file if we have one 3039ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton ObjectFile *kernel_object_file = m_kernel.module_sp->GetObjectFile(); 3049ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (kernel_object_file) 3059ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_kernel.address = kernel_object_file->GetHeaderAddress().GetFileAddress(); 306bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 307bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 3089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 3099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (m_kernel.address != LLDB_INVALID_ADDRESS) 3109ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_kernel.LoadImageUsingMemoryModule (m_process); 3119ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 3129ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (m_kernel.IsLoaded()) 3139ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 3149ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton static ConstString kext_summary_symbol ("gLoadedKextSummaries"); 3159ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const Symbol *symbol = m_kernel.module_sp->FindFirstSymbolWithNameAndType (kext_summary_symbol, eSymbolTypeData); 3169ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (symbol) 3179ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 3189ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_kext_summary_header_ptr_addr = symbol->GetValue(); 3199ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Update all image infos 3209ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton ReadAllKextSummaries (); 3219ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 3229ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 3239ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton else 3249ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 3259ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_kernel.Clear(false); 3269ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 327bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 328bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 329bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 330bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 331bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Static callback function that gets called when our DYLD notification 332bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// breakpoint gets hit. We update all of our image infos and then 333bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// let our super class DynamicLoader class decide if we should stop 334bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// or not (based on global preference). 335bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 336bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool 33717f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::BreakpointHitCallback (void *baton, 338645facaf9c247b20f0f135445d437181688711a7Greg Clayton StoppointCallbackContext *context, 339645facaf9c247b20f0f135445d437181688711a7Greg Clayton user_id_t break_id, 340645facaf9c247b20f0f135445d437181688711a7Greg Clayton user_id_t break_loc_id) 3418c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton{ 34217f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton return static_cast<DynamicLoaderDarwinKernel*>(baton)->BreakpointHit (context, break_id, break_loc_id); 343bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 344bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 345bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool 34617f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::BreakpointHit (StoppointCallbackContext *context, 347645facaf9c247b20f0f135445d437181688711a7Greg Clayton user_id_t break_id, 348645facaf9c247b20f0f135445d437181688711a7Greg Clayton user_id_t break_loc_id) 349645facaf9c247b20f0f135445d437181688711a7Greg Clayton{ 3507dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton LogSP log(GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER)); 3517dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton if (log) 35217f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton log->Printf ("DynamicLoaderDarwinKernel::BreakpointHit (...)\n"); 3537dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton 354645facaf9c247b20f0f135445d437181688711a7Greg Clayton ReadAllKextSummaries (); 3557dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton 3567dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton if (log) 3577dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton PutToLog(log.get()); 3587dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton 359645facaf9c247b20f0f135445d437181688711a7Greg Clayton return GetStopWhenImagesChange(); 360645facaf9c247b20f0f135445d437181688711a7Greg Clayton} 361645facaf9c247b20f0f135445d437181688711a7Greg Clayton 362645facaf9c247b20f0f135445d437181688711a7Greg Clayton 363645facaf9c247b20f0f135445d437181688711a7Greg Claytonbool 36417f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::ReadKextSummaryHeader () 365bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 366bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Mutex::Locker locker(m_mutex); 367bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 368bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton // the all image infos is already valid for this process stop ID 369bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 370bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kext_summaries.clear(); 3717dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton if (m_kext_summary_header_ptr_addr.IsValid()) 372bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 373bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const uint32_t addr_size = m_kernel.GetAddressByteSize (); 374bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const ByteOrder byte_order = m_kernel.GetByteOrder(); 375bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Error error; 376bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton // Read enough bytes for a "OSKextLoadedKextSummaryHeader" structure 377bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton // which is currenty 4 uint32_t and a pointer. 378bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton uint8_t buf[24]; 379bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton DataExtractor data (buf, sizeof(buf), byte_order, addr_size); 380bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const size_t count = 4 * sizeof(uint32_t) + addr_size; 3818c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton const bool prefer_file_cache = false; 3827dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton if (m_process->GetTarget().ReadPointerFromMemory (m_kext_summary_header_ptr_addr, 3837dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton prefer_file_cache, 3847dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton error, 3857dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton m_kext_summary_header_addr)) 386bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 3877dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton // We got a valid address for our kext summary header and make sure it isn't NULL 3887dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton if (m_kext_summary_header_addr.IsValid() && 3897dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton m_kext_summary_header_addr.GetFileAddress() != 0) 3907dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton { 3917dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton const size_t bytes_read = m_process->GetTarget().ReadMemory (m_kext_summary_header_addr, prefer_file_cache, buf, count, error); 3927dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton if (bytes_read == count) 3937dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton { 3947dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton uint32_t offset = 0; 3950fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton m_kext_summary_header.version = data.GetU32(&offset); 3960fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton if (m_kext_summary_header.version >= 2) 3970fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton { 3980fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton m_kext_summary_header.entry_size = data.GetU32(&offset); 3990fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton } 4000fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton else 4010fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton { 4020fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton // Versions less than 2 didn't have an entry size, it was hard coded 4030fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton m_kext_summary_header.entry_size = KERNEL_MODULE_ENTRY_SIZE_VERSION_1; 4040fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton } 4050fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton m_kext_summary_header.entry_count = data.GetU32(&offset); 4067dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton return true; 4077dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton } 4087dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton } 409bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 410bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 4117dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton m_kext_summary_header_addr.Clear(); 412bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return false; 413bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 414bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 415bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 416bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool 41717f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::ParseKextSummaries (const Address &kext_summary_addr, 4188c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton uint32_t count) 419bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 420bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton OSKextLoadedKextSummary::collection kext_summaries; 421645facaf9c247b20f0f135445d437181688711a7Greg Clayton LogSP log(GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER)); 422bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (log) 4237e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda log->Printf ("Adding %d modules.\n", count); 424bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 425bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Mutex::Locker locker(m_mutex); 426bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 427bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (!ReadKextSummaries (kext_summary_addr, count, kext_summaries)) 428bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return false; 429bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 430234981a4559db084f9c90612660e40f19915b89cGreg Clayton Stream *s = &m_process->GetTarget().GetDebugger().GetOutputStream(); 431bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton for (uint32_t i = 0; i < count; i++) 432bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 433234981a4559db084f9c90612660e40f19915b89cGreg Clayton if (s) 434234981a4559db084f9c90612660e40f19915b89cGreg Clayton { 435234981a4559db084f9c90612660e40f19915b89cGreg Clayton const uint8_t *u = (const uint8_t *)kext_summaries[i].uuid.GetBytes(); 436234981a4559db084f9c90612660e40f19915b89cGreg Clayton if (u) 437234981a4559db084f9c90612660e40f19915b89cGreg Clayton { 438c324d5f6c70c129348a30c61549aea397202a842Jason Molenda s->Printf("Loading kext: %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 0x%16.16llx \"%s\"...", 439234981a4559db084f9c90612660e40f19915b89cGreg Clayton u[ 0], u[ 1], u[ 2], u[ 3], u[ 4], u[ 5], u[ 6], u[ 7], 440234981a4559db084f9c90612660e40f19915b89cGreg Clayton u[ 8], u[ 9], u[10], u[11], u[12], u[13], u[14], u[15], 441234981a4559db084f9c90612660e40f19915b89cGreg Clayton kext_summaries[i].address, kext_summaries[i].name); 442234981a4559db084f9c90612660e40f19915b89cGreg Clayton } 443234981a4559db084f9c90612660e40f19915b89cGreg Clayton else 444234981a4559db084f9c90612660e40f19915b89cGreg Clayton { 445c324d5f6c70c129348a30c61549aea397202a842Jason Molenda s->Printf("0x%16.16llx \"%s\"...", kext_summaries[i].address, kext_summaries[i].name); 446234981a4559db084f9c90612660e40f19915b89cGreg Clayton } 447234981a4559db084f9c90612660e40f19915b89cGreg Clayton } 448234981a4559db084f9c90612660e40f19915b89cGreg Clayton 4499ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton kext_summaries[i].LoadImageUsingMemoryModule (m_process); 4509ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 4517b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton if (s) 4527b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton { 4537b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton if (kext_summaries[i].module_sp) 4549ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 4559ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (kext_summaries[i].module_sp->GetFileSpec().GetDirectory()) 4569ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton s->Printf("\n found kext: %s/%s\n", 4579ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton kext_summaries[i].module_sp->GetFileSpec().GetDirectory().AsCString(), 4589ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton kext_summaries[i].module_sp->GetFileSpec().GetFilename().AsCString()); 4599ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton else 4609ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton s->Printf("\n found kext: %s\n", 4619ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton kext_summaries[i].module_sp->GetFileSpec().GetFilename().AsCString()); 4629ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 463c324d5f6c70c129348a30c61549aea397202a842Jason Molenda else 464c324d5f6c70c129348a30c61549aea397202a842Jason Molenda s->Printf (" failed to locate/load.\n"); 4657b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton } 4667b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton 4670fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton if (log) 4680fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton kext_summaries[i].PutToLog (log.get()); 469bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 470bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton bool return_value = AddModulesUsingImageInfos (kext_summaries); 471bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return return_value; 472bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 473bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 474bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Adds the modules in image_infos to m_kext_summaries. 475bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// NB don't call this passing in m_kext_summaries. 476bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 477bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool 47817f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::AddModulesUsingImageInfos (OSKextLoadedKextSummary::collection &image_infos) 479bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 480bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton // Now add these images to the main list. 481bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton ModuleList loaded_module_list; 482bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 483bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton for (uint32_t idx = 0; idx < image_infos.size(); ++idx) 484bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 4859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton OSKextLoadedKextSummary &image_info = image_infos[idx]; 4869ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_kext_summaries.push_back(image_info); 487bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 4889ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (image_info.module_sp && m_process->GetStopID() == image_info.load_process_stop_id) 4899ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton loaded_module_list.AppendIfNeeded (image_infos[idx].module_sp); 490bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 491bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 492bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (loaded_module_list.GetSize() > 0) 493bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 494bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton // FIXME: This should really be in the Runtime handlers class, which should get 495bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton // called by the target's ModulesDidLoad, but we're doing it all locally for now 496bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton // to save time. 497bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton // Also, I'm assuming there can be only one libobjc dylib loaded... 498bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 499bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton ObjCLanguageRuntime *objc_runtime = m_process->GetObjCLanguageRuntime(); 500bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (objc_runtime != NULL && !objc_runtime->HasReadObjCLibrary()) 501bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 502bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton size_t num_modules = loaded_module_list.GetSize(); 503bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton for (int i = 0; i < num_modules; i++) 504bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 505bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (objc_runtime->IsModuleObjCLibrary (loaded_module_list.GetModuleAtIndex (i))) 506bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 507bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton objc_runtime->ReadObjCLibrary (loaded_module_list.GetModuleAtIndex (i)); 508bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton break; 509bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 510bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 511bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 5127dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton// if (log) 51317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton// loaded_module_list.LogUUIDAndPaths (log, "DynamicLoaderDarwinKernel::ModulesDidLoad"); 514bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_process->GetTarget().ModulesDidLoad (loaded_module_list); 515bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 516bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return true; 517bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 518bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 519bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 520bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonuint32_t 52117f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::ReadKextSummaries (const Address &kext_summary_addr, 522bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton uint32_t image_infos_count, 523bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton OSKextLoadedKextSummary::collection &image_infos) 524bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 525bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const ByteOrder endian = m_kernel.GetByteOrder(); 526bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const uint32_t addr_size = m_kernel.GetAddressByteSize(); 527bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 528bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton image_infos.resize(image_infos_count); 529bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const size_t count = image_infos.size() * m_kext_summary_header.entry_size; 530bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton DataBufferHeap data(count, 0); 531bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Error error; 5327b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton 5337b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton Stream *s = &m_process->GetTarget().GetDebugger().GetOutputStream(); 5347b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton 5357b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton if (s) 5367b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton s->Printf ("Reading %u kext summaries...\n", image_infos_count); 5378c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton const bool prefer_file_cache = false; 5388c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton const size_t bytes_read = m_process->GetTarget().ReadMemory (kext_summary_addr, 5398c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton prefer_file_cache, 5408c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton data.GetBytes(), 5418c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton data.GetByteSize(), 5428c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton error); 543bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (bytes_read == count) 544bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 5450fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton 546bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton DataExtractor extractor (data.GetBytes(), data.GetByteSize(), endian, addr_size); 547bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton uint32_t i=0; 5480fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton for (uint32_t kext_summary_offset = 0; 5490fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton i < image_infos.size() && extractor.ValidOffsetForDataOfSize(kext_summary_offset, m_kext_summary_header.entry_size); 5500fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton ++i, kext_summary_offset += m_kext_summary_header.entry_size) 551bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 5520fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton uint32_t offset = kext_summary_offset; 553bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const void *name_data = extractor.GetData(&offset, KERNEL_MODULE_MAX_NAME); 554bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (name_data == NULL) 555bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton break; 556bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton memcpy (image_infos[i].name, name_data, KERNEL_MODULE_MAX_NAME); 557bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton image_infos[i].uuid.SetBytes(extractor.GetData (&offset, 16)); 558bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton image_infos[i].address = extractor.GetU64(&offset); 5598c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton if (!image_infos[i].so_address.SetLoadAddress (image_infos[i].address, &m_process->GetTarget())) 5608c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton m_process->GetTarget().GetImages().ResolveFileAddress (image_infos[i].address, image_infos[i].so_address); 561bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton image_infos[i].size = extractor.GetU64(&offset); 562bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton image_infos[i].version = extractor.GetU64(&offset); 563bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton image_infos[i].load_tag = extractor.GetU32(&offset); 564bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton image_infos[i].flags = extractor.GetU32(&offset); 5650fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton if ((offset - kext_summary_offset) < m_kext_summary_header.entry_size) 5660fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton { 5670fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton image_infos[i].reference_list = extractor.GetU64(&offset); 5680fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton } 5690fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton else 5700fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton { 5710fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton image_infos[i].reference_list = 0; 5720fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton } 57395d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton// printf ("[%3u] %*.*s: address=0x%16.16llx, size=0x%16.16llx, version=0x%16.16llx, load_tag=0x%8.8x, flags=0x%8.8x\n", 57495d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton// i, 57595d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton// KERNEL_MODULE_MAX_NAME, KERNEL_MODULE_MAX_NAME, (char *)name_data, 57695d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton// image_infos[i].address, 57795d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton// image_infos[i].size, 57895d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton// image_infos[i].version, 57995d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton// image_infos[i].load_tag, 58095d7433db41808b55e10c11c1ffe92442298ebf0Greg Clayton// image_infos[i].flags); 581bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 582bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (i < image_infos.size()) 583bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton image_infos.resize(i); 584bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 585bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton else 586bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 587bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton image_infos.clear(); 588bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 589bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return image_infos.size(); 590bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 591bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 592bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool 59317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::ReadAllKextSummaries () 594bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 595645facaf9c247b20f0f135445d437181688711a7Greg Clayton LogSP log(GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER)); 596bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 597bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Mutex::Locker locker(m_mutex); 598645facaf9c247b20f0f135445d437181688711a7Greg Clayton 599bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (ReadKextSummaryHeader ()) 600bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 601645facaf9c247b20f0f135445d437181688711a7Greg Clayton if (m_kext_summary_header.entry_count > 0 && m_kext_summary_header_addr.IsValid()) 602bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 6038c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton Address summary_addr (m_kext_summary_header_addr); 6040fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton summary_addr.Slide(m_kext_summary_header.GetSize()); 6058c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton if (!ParseKextSummaries (summary_addr, m_kext_summary_header.entry_count)) 606bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 607bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kext_summaries.clear(); 608bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 609bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return true; 610bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 611bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 612bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return false; 613bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 614bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 615bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 616bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Dump an image info structure to the file handle provided. 617bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 618bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 61917f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::OSKextLoadedKextSummary::PutToLog (Log *log) const 620bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 621bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (log == NULL) 622bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return; 623234981a4559db084f9c90612660e40f19915b89cGreg Clayton const uint8_t *u = (uint8_t *)uuid.GetBytes(); 624bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 625bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (address == LLDB_INVALID_ADDRESS) 626bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 627bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (u) 628bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 6290fa512447e00da09d300fbabd18b5ce94f52fdaaGreg 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)", 630bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton u[ 0], u[ 1], u[ 2], u[ 3], 631bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton u[ 4], u[ 5], u[ 6], u[ 7], 632bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton u[ 8], u[ 9], u[10], u[11], 633bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton u[12], u[13], u[14], u[15], 634bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton name); 635bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 636bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton else 6370fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton log->Printf("\tname=\"%s\" (UNLOADED)", name); 638bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 639bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton else 640bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 641bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (u) 642bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 6430fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton log->Printf("\taddr=0x%16.16llx size=0x%16.16llx version=0x%16.16llx load-tag=0x%8.8x flags=0x%8.8x ref-list=0x%16.16llx 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\"", 6440fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton address, size, version, load_tag, flags, reference_list, 6450fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton u[ 0], u[ 1], u[ 2], u[ 3], u[ 4], u[ 5], u[ 6], u[ 7], 6460fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton u[ 8], u[ 9], u[10], u[11], u[12], u[13], u[14], u[15], 647bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton name); 648bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 649bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton else 650bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 6510fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton log->Printf("\t[0x%16.16llx - 0x%16.16llx) version=0x%16.16llx load-tag=0x%8.8x flags=0x%8.8x ref-list=0x%16.16llx name=\"%s\"", 6520fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton address, address+size, version, load_tag, flags, reference_list, 6530fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton name); 654bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 655bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 656bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 657bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 658bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 659bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Dump the _dyld_all_image_infos members and all current image infos 660bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// that we have parsed to the file handle provided. 661bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 662bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 66317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::PutToLog(Log *log) const 664bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 665bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (log == NULL) 666bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return; 667bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 668bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Mutex::Locker locker(m_mutex); 6690fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton log->Printf("gLoadedKextSummaries = 0x%16.16llx { version=%u, entry_size=%u, entry_count=%u }", 6708c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton m_kext_summary_header_addr.GetFileAddress(), 671bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kext_summary_header.version, 672bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kext_summary_header.entry_size, 6730fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton m_kext_summary_header.entry_count); 674bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 675bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton size_t i; 676bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const size_t count = m_kext_summaries.size(); 677bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (count > 0) 678bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 679bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton log->PutCString("Loaded:"); 680bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton for (i = 0; i<count; i++) 681bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kext_summaries[i].PutToLog(log); 682bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 683bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 684bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 685bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 68617f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::PrivateInitialize(Process *process) 687bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 68817f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton DEBUG_PRINTF("DynamicLoaderDarwinKernel::%s() process state = %s\n", __FUNCTION__, StateAsCString(m_process->GetState())); 689bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Clear(true); 690bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_process = process; 691bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_process->GetTarget().GetSectionLoadList().Clear(); 692bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 693bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 694645facaf9c247b20f0f135445d437181688711a7Greg Claytonvoid 69517f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::SetNotificationBreakpointIfNeeded () 696bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 6979ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (m_break_id == LLDB_INVALID_BREAK_ID && m_kernel.module_sp) 698645facaf9c247b20f0f135445d437181688711a7Greg Clayton { 69917f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton DEBUG_PRINTF("DynamicLoaderDarwinKernel::%s() process state = %s\n", __FUNCTION__, StateAsCString(m_process->GetState())); 700645facaf9c247b20f0f135445d437181688711a7Greg Clayton 7017dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton 702645facaf9c247b20f0f135445d437181688711a7Greg Clayton const bool internal_bp = false; 7037dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton const LazyBool skip_prologue = eLazyBoolNo; 70403c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham FileSpecList module_spec_list; 70503c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham module_spec_list.Append (m_kernel.module_sp->GetFileSpec()); 70603c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham Breakpoint *bp = m_process->GetTarget().CreateBreakpoint (&module_spec_list, 707d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham NULL, 708645facaf9c247b20f0f135445d437181688711a7Greg Clayton "OSKextLoadedKextSummariesUpdated", 709645facaf9c247b20f0f135445d437181688711a7Greg Clayton eFunctionNameTypeFull, 7107dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton internal_bp, 7117dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton skip_prologue).get(); 712645facaf9c247b20f0f135445d437181688711a7Greg Clayton 71317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton bp->SetCallback (DynamicLoaderDarwinKernel::BreakpointHitCallback, this, true); 714645facaf9c247b20f0f135445d437181688711a7Greg Clayton m_break_id = bp->GetID(); 715645facaf9c247b20f0f135445d437181688711a7Greg Clayton } 716bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 717bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 718bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 719bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Member function that gets called when the process state changes. 720bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 721bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 72217f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::PrivateProcessStateChanged (Process *process, StateType state) 723bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 72417f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton DEBUG_PRINTF("DynamicLoaderDarwinKernel::%s(%s)\n", __FUNCTION__, StateAsCString(state)); 725bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton switch (state) 726bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 727bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateConnected: 728bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateAttaching: 729bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateLaunching: 730bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateInvalid: 731bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateUnloaded: 732bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateExited: 733bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateDetached: 734bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Clear(false); 735bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton break; 736bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 737bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateStopped: 738645facaf9c247b20f0f135445d437181688711a7Greg Clayton UpdateIfNeeded(); 739bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton break; 740bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 741bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateRunning: 742bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateStepping: 743bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateCrashed: 744bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateSuspended: 745bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton break; 746bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 747bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton default: 748bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton break; 749bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 750bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 751bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 752bbea13375ec4ae876576fcb8608626d45880dd96Greg ClaytonThreadPlanSP 75317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetStepThroughTrampolinePlan (Thread &thread, bool stop_others) 754bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 755bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton ThreadPlanSP thread_plan_sp; 756645facaf9c247b20f0f135445d437181688711a7Greg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 757645facaf9c247b20f0f135445d437181688711a7Greg Clayton if (log) 758645facaf9c247b20f0f135445d437181688711a7Greg Clayton log->Printf ("Could not find symbol for step through."); 759bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return thread_plan_sp; 760bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 761bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 762bbea13375ec4ae876576fcb8608626d45880dd96Greg ClaytonError 76317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::CanLoadImage () 764bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 765bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Error error; 766bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton error.SetErrorString("always unsafe to load or unload shared libraries in the darwin kernel"); 767bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return error; 768bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 769bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 770bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 77117f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::Initialize() 772bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 773bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton PluginManager::RegisterPlugin (GetPluginNameStatic(), 774bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton GetPluginDescriptionStatic(), 775bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton CreateInstance); 776bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 777bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 778bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 77917f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::Terminate() 780bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 781bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton PluginManager::UnregisterPlugin (CreateInstance); 782bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 783bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 784bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 785bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonconst char * 78617f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetPluginNameStatic() 787bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 788bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return "dynamic-loader.macosx-kernel"; 789bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 790bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 791bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonconst char * 79217f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetPluginDescriptionStatic() 793bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 794bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return "Dynamic loader plug-in that watches for shared library loads/unloads in the MacOSX kernel."; 795bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 796bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 797bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 798bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------ 799bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// PluginInterface protocol 800bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------ 801bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonconst char * 80217f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetPluginName() 803bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 80417f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton return "DynamicLoaderDarwinKernel"; 805bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 806bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 807bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonconst char * 80817f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetShortPluginName() 809bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 810bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return GetPluginNameStatic(); 811bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 812bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 813bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonuint32_t 81417f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetPluginVersion() 815bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 816bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return 1; 817bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 818bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 819