DynamicLoaderDarwinKernel.cpp revision d891f9b872103235cfd2ed452c6f14a4394d9b3a
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 4487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonstatic PropertyDefinition 4587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytong_properties[] = 4687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton{ 472f27af8e7b2515b05e28653177da01c9a3fe0c52Greg Clayton { "load-kexts" , OptionValue::eTypeBoolean, true, true, NULL, NULL, "Automatically loads kext images when attaching to a kernel." }, 482f27af8e7b2515b05e28653177da01c9a3fe0c52Greg Clayton { NULL , OptionValue::eTypeInvalid, false, 0 , NULL, NULL, NULL } 4987e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton}; 5087e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 5187e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonenum { 522f27af8e7b2515b05e28653177da01c9a3fe0c52Greg Clayton ePropertyLoadKexts 5387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton}; 5487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 5587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonclass DynamicLoaderDarwinKernelProperties : public Properties 5687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton{ 5787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonpublic: 5887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 5987e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton static ConstString & 6087e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton GetSettingName () 6187e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton { 622acbc2a80c0116454426db2d8b55bc23e6cbb0c1Greg Clayton static ConstString g_setting_name("darwin-kernel"); 6387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton return g_setting_name; 6487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton } 6587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 6687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton DynamicLoaderDarwinKernelProperties() : 6787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton Properties () 6887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton { 6987e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton m_collection_sp.reset (new OptionValueProperties(GetSettingName())); 7087e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton m_collection_sp->Initialize(g_properties); 7187e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton } 7287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 7387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton virtual 7487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton ~DynamicLoaderDarwinKernelProperties() 7587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton { 7687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton } 7787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 7887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton bool 792f27af8e7b2515b05e28653177da01c9a3fe0c52Greg Clayton GetLoadKexts() const 8087e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton { 812f27af8e7b2515b05e28653177da01c9a3fe0c52Greg Clayton const uint32_t idx = ePropertyLoadKexts; 8287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 8387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton } 8487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 8587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton}; 8687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 8787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytontypedef STD_SHARED_PTR(DynamicLoaderDarwinKernelProperties) DynamicLoaderDarwinKernelPropertiesSP; 8887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 8987e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonstatic const DynamicLoaderDarwinKernelPropertiesSP & 9087e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg ClaytonGetGlobalProperties() 9187e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton{ 9287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton static DynamicLoaderDarwinKernelPropertiesSP g_settings_sp; 9387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton if (!g_settings_sp) 9487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton g_settings_sp.reset (new DynamicLoaderDarwinKernelProperties ()); 9587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton return g_settings_sp; 9687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton} 9787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 98bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 99bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Create an instance of this class. This function is filled into 100bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// the plugin info class that gets handed out by the plugin factory and 101bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// allows the lldb to instantiate an instance of this class. 102bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 103bbea13375ec4ae876576fcb8608626d45880dd96Greg ClaytonDynamicLoader * 10417f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::CreateInstance (Process* process, bool force) 105bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 106bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton bool create = force; 107bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (!create) 108bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 1095beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton Module* exe_module = process->GetTarget().GetExecutableModulePointer(); 11040f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton if (exe_module) 11140f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton { 11240f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton ObjectFile *object_file = exe_module->GetObjectFile(); 11340f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton if (object_file) 11440f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton { 115ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan create = (object_file->GetStrata() == ObjectFile::eStrataKernel); 11640f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton } 11740f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton } 11840f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton 11940f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton if (create) 12040f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton { 12140f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton const llvm::Triple &triple_ref = process->GetTarget().GetArchitecture().GetTriple(); 122b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton switch (triple_ref.getOS()) 123b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 124b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::Darwin: 125b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::MacOSX: 126b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::IOS: 127b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton create = triple_ref.getVendor() == llvm::Triple::Apple; 128b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 129b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: 130b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton create = false; 131b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 132b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 13340f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton } 134bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 135bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 136bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (create) 1376cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan { 1386cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan process->SetCanJIT(false); 13917f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton return new DynamicLoaderDarwinKernel (process); 1406cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan } 141bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return NULL; 142bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 143bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 144bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 145bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Constructor 146bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 14717f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::DynamicLoaderDarwinKernel (Process* process) : 148bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton DynamicLoader(process), 149bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kernel(), 1507dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton m_kext_summary_header_ptr_addr (), 1518c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton m_kext_summary_header_addr (), 152bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kext_summary_header (), 153bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kext_summaries(), 15497c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_mutex(Mutex::eMutexTypeRecursive), 15597c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_break_id (LLDB_INVALID_BREAK_ID) 156bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 157bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 158bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 159bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 160bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Destructor 161bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 16217f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::~DynamicLoaderDarwinKernel() 163bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 164bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Clear(true); 165bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 166bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 167645facaf9c247b20f0f135445d437181688711a7Greg Claytonvoid 16817f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::UpdateIfNeeded() 169645facaf9c247b20f0f135445d437181688711a7Greg Clayton{ 170645facaf9c247b20f0f135445d437181688711a7Greg Clayton LoadKernelModuleIfNeeded(); 171645facaf9c247b20f0f135445d437181688711a7Greg Clayton SetNotificationBreakpointIfNeeded (); 172645facaf9c247b20f0f135445d437181688711a7Greg Clayton} 173bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------ 174bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// Called after attaching a process. 175bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// 176bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// Allow DynamicLoader plug-ins to execute some code after 177bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// attaching to a process. 178bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------ 179bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 18017f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::DidAttach () 181bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 182bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton PrivateInitialize(m_process); 183645facaf9c247b20f0f135445d437181688711a7Greg Clayton UpdateIfNeeded(); 184bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 185bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 186bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------ 187bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// Called after attaching a process. 188bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// 189bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// Allow DynamicLoader plug-ins to execute some code after 190bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// attaching to a process. 191bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------ 192bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 19317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::DidLaunch () 194bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 195bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton PrivateInitialize(m_process); 196645facaf9c247b20f0f135445d437181688711a7Greg Clayton UpdateIfNeeded(); 197bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 198bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 199bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 200bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 201bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Clear out the state of this class. 202bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 203bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 20417f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::Clear (bool clear_process) 205bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 206bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Mutex::Locker locker(m_mutex); 207bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 208bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (m_process->IsAlive() && LLDB_BREAK_ID_IS_VALID(m_break_id)) 209bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_process->ClearBreakpointSiteByID(m_break_id); 210bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 211bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (clear_process) 212bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_process = NULL; 213bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kernel.Clear(false); 2147dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton m_kext_summary_header_ptr_addr.Clear(); 2158c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton m_kext_summary_header_addr.Clear(); 216bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kext_summaries.clear(); 217bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_break_id = LLDB_INVALID_BREAK_ID; 218bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 219bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 220bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 221bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool 222aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg ClaytonDynamicLoaderDarwinKernel::OSKextLoadedKextSummary::LoadImageAtFileAddress (Process *process) 223aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton{ 224aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton if (IsLoaded()) 225aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton return true; 226aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton 227aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton if (module_sp) 228aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton { 229aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton bool changed = false; 230aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton if (module_sp->SetLoadAddress (process->GetTarget(), 0, changed)) 231aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton load_process_stop_id = process->GetStopID(); 232aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton } 233aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton return false; 234aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton} 235aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton 236aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Claytonbool 2379ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonDynamicLoaderDarwinKernel::OSKextLoadedKextSummary::LoadImageUsingMemoryModule (Process *process) 238bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 2399ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (IsLoaded()) 2409ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return true; 241bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 2429ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton bool uuid_is_valid = uuid.IsValid(); 2434952db8c76f619e3d8a0cf13456097128009d67bJason Molenda bool memory_module_is_kernel = false; 244bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 2459ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton Target &target = process->GetTarget(); 2469ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton ModuleSP memory_module_sp; 247127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda 248127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda // If this is a kext and the user asked us to ignore kexts, don't try to load it. 2492f27af8e7b2515b05e28653177da01c9a3fe0c52Greg Clayton if (kernel_image == false && GetGlobalProperties()->GetLoadKexts() == false) 250127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda { 251127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda return false; 252127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda } 253127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda 254127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda // Use the memory module as the module if we have one 2559ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (address != LLDB_INVALID_ADDRESS) 256bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 2579ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton FileSpec file_spec; 2589ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (module_sp) 2599ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton file_spec = module_sp->GetFileSpec(); 2609ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton else 2619ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton file_spec.SetFile (name, false); 2629ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 2639ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton memory_module_sp = process->ReadModuleFromMemory (file_spec, address, false, false); 2649ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (memory_module_sp && !uuid_is_valid) 265bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 2669ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton uuid = memory_module_sp->GetUUID(); 2679ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton uuid_is_valid = uuid.IsValid(); 268bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 269b6ea174785a93f6dc227d886eba3af72faa2cf98Jason Molenda if (memory_module_sp 270b6ea174785a93f6dc227d886eba3af72faa2cf98Jason Molenda && memory_module_sp->GetObjectFile() 2714952db8c76f619e3d8a0cf13456097128009d67bJason Molenda && memory_module_sp->GetObjectFile()->GetType() == ObjectFile::eTypeExecutable 2724952db8c76f619e3d8a0cf13456097128009d67bJason Molenda && memory_module_sp->GetObjectFile()->GetStrata() == ObjectFile::eStrataKernel) 2734952db8c76f619e3d8a0cf13456097128009d67bJason Molenda { 2744952db8c76f619e3d8a0cf13456097128009d67bJason Molenda memory_module_is_kernel = true; 275d6b8122cee3dd02255bf50a7d019f17dfeba463aJason Molenda if (memory_module_sp->GetArchitecture().IsValid()) 276d6b8122cee3dd02255bf50a7d019f17dfeba463aJason Molenda { 277d6b8122cee3dd02255bf50a7d019f17dfeba463aJason Molenda target.SetArchitecture(memory_module_sp->GetArchitecture()); 278d6b8122cee3dd02255bf50a7d019f17dfeba463aJason Molenda } 2794952db8c76f619e3d8a0cf13456097128009d67bJason Molenda } 280bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 281bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 2829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (!module_sp) 283bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 2849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (uuid_is_valid) 285bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 286146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata const ModuleList &target_images = target.GetImages(); 2879ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_sp = target_images.FindModule(uuid); 288d6b8122cee3dd02255bf50a7d019f17dfeba463aJason Molenda 2899ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (!module_sp) 290444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 291aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton ModuleSpec module_spec; 292444fe998bf707bd076a70c3a779db8575533695eGreg Clayton module_spec.GetUUID() = uuid; 293d6b8122cee3dd02255bf50a7d019f17dfeba463aJason Molenda module_spec.GetArchitecture() = target.GetArchitecture(); 294d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda 295d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda // For the kernel, we really do need an on-disk file copy of the 296d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda // binary. 297d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda bool force_symbols_search = false; 298d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda if (memory_module_is_kernel) 299d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda { 300d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda force_symbols_search = true; 301d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda } 302d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda 303d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda if (Symbols::DownloadObjectAndSymbolFile (module_spec, force_symbols_search)) 304d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda { 305d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda if (module_spec.GetFileSpec().Exists()) 306d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda { 307d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda module_sp.reset(new Module (module_spec.GetFileSpec(), target.GetArchitecture())); 308d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda if (module_sp.get() && module_sp->MatchesModuleSpec (module_spec)) 309d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda { 310d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda ModuleList loaded_module_list; 311d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda loaded_module_list.Append (module_sp); 312d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda target.ModulesDidLoad (loaded_module_list); 313d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda } 314d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda } 315d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda } 316d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda 317d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda // Ask the Target to find this file on the local system, if possible. 318d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda // This will search in the list of currently-loaded files, look in the 319d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda // standard search paths on the system, and on a Mac it will try calling 320d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda // the DebugSymbols framework with the UUID to find the binary via its 321d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda // search methods. 322d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda if (!module_sp) 323d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda { 324d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda module_sp = target.GetSharedModule (module_spec); 325d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda } 3265fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda 3275fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda // If we managed to find a module, append it to the target's list of images 3285fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda if (module_sp && module_sp->GetUUID() == memory_module_sp->GetUUID()) 3295fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda { 3305fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda target.GetImages().Append(module_sp); 3315fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda if (memory_module_is_kernel && target.GetExecutableModulePointer() != module_sp.get()) 3325fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda { 3335fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda target.SetExecutableModule (module_sp, false); 3345fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda } 3355fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda } 336444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 337bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 338bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 3399ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 340bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 341d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda if (memory_module_sp && module_sp) 342bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 343d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda if (module_sp->GetUUID() == memory_module_sp->GetUUID()) 344bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 345d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda ObjectFile *ondisk_object_file = module_sp->GetObjectFile(); 346d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda ObjectFile *memory_object_file = memory_module_sp->GetObjectFile(); 347d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda if (memory_object_file && ondisk_object_file) 348d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda { 349d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda SectionList *ondisk_section_list = ondisk_object_file->GetSectionList (); 350d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda SectionList *memory_section_list = memory_object_file->GetSectionList (); 351d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda if (memory_section_list && ondisk_section_list) 352bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 353d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda const uint32_t num_ondisk_sections = ondisk_section_list->GetSize(); 354d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda // There may be CTF sections in the memory image so we can't 355d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda // always just compare the number of sections (which are actually 356d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda // segments in mach-o parlance) 357d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda uint32_t sect_idx = 0; 358d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda 359d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda // Use the memory_module's addresses for each section to set the 360d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda // file module's load address as appropriate. We don't want to use 361d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda // a single slide value for the entire kext - different segments may 362d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda // be slid different amounts by the kext loader. 363d6b8122cee3dd02255bf50a7d019f17dfeba463aJason Molenda 364d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda uint32_t num_sections_loaded = 0; 365d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda for (sect_idx=0; sect_idx<num_ondisk_sections; ++sect_idx) 366d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda { 367d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda SectionSP ondisk_section_sp(ondisk_section_list->GetSectionAtIndex(sect_idx)); 368d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda if (ondisk_section_sp) 369bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 370d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda const Section *memory_section = memory_section_list->FindSectionByName(ondisk_section_sp->GetName()).get(); 371d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda if (memory_section) 3720fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton { 373d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda target.GetSectionLoadList().SetSectionLoadAddress (ondisk_section_sp, memory_section->GetFileAddress()); 374d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda ++num_sections_loaded; 3750fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton } 3760fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton } 377bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 378d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda if (num_sections_loaded > 0) 379d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda load_process_stop_id = process->GetStopID(); 3809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton else 381d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda module_sp.reset(); // No sections were loaded 382bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 3839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton else 384d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda module_sp.reset(); // One or both section lists 385bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 3869ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton else 387d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda module_sp.reset(); // One or both object files missing 388bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 389d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda else 390d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda module_sp.reset(); // UUID mismatch 391bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 392d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda 3939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton bool is_loaded = IsLoaded(); 3949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 3959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (so_address.IsValid()) 3969ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 3979ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (is_loaded) 3989ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton so_address.SetLoadAddress (address, &target); 3999ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton else 4009ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton target.GetImages().ResolveFileAddress (address, so_address); 4019ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 4029ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 4034952db8c76f619e3d8a0cf13456097128009d67bJason Molenda 4044952db8c76f619e3d8a0cf13456097128009d67bJason Molenda if (is_loaded && module_sp && memory_module_is_kernel) 4054952db8c76f619e3d8a0cf13456097128009d67bJason Molenda { 4064952db8c76f619e3d8a0cf13456097128009d67bJason Molenda Stream *s = &target.GetDebugger().GetOutputStream(); 4074952db8c76f619e3d8a0cf13456097128009d67bJason Molenda if (s) 4084952db8c76f619e3d8a0cf13456097128009d67bJason Molenda { 4094952db8c76f619e3d8a0cf13456097128009d67bJason Molenda char uuidbuf[64]; 4104952db8c76f619e3d8a0cf13456097128009d67bJason Molenda s->Printf ("Kernel UUID: %s\n", module_sp->GetUUID().GetAsCString(uuidbuf, sizeof (uuidbuf))); 4115f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s->Printf ("Load Address: 0x%" PRIx64 "\n", address); 41263e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda if (module_sp->GetFileSpec().GetDirectory().IsEmpty()) 41363e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda { 41463e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda s->Printf ("Loaded kernel file %s\n", module_sp->GetFileSpec().GetFilename().AsCString()); 41563e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda } 41663e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda else 41763e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda { 41863e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda s->Printf ("Loaded kernel file %s/%s\n", 41963e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda module_sp->GetFileSpec().GetDirectory().AsCString(), 42063e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda module_sp->GetFileSpec().GetFilename().AsCString()); 42163e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda } 4224952db8c76f619e3d8a0cf13456097128009d67bJason Molenda s->Flush (); 4234952db8c76f619e3d8a0cf13456097128009d67bJason Molenda } 4244952db8c76f619e3d8a0cf13456097128009d67bJason Molenda } 4259ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return is_loaded; 426bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 427bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 42849ce8969d3154e1560106cfe530444c09410f217Greg Claytonuint32_t 42949ce8969d3154e1560106cfe530444c09410f217Greg ClaytonDynamicLoaderDarwinKernel::OSKextLoadedKextSummary::GetAddressByteSize () 43049ce8969d3154e1560106cfe530444c09410f217Greg Clayton{ 43149ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (module_sp) 43249ce8969d3154e1560106cfe530444c09410f217Greg Clayton return module_sp->GetArchitecture().GetAddressByteSize(); 43349ce8969d3154e1560106cfe530444c09410f217Greg Clayton return 0; 43449ce8969d3154e1560106cfe530444c09410f217Greg Clayton} 43549ce8969d3154e1560106cfe530444c09410f217Greg Clayton 43649ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb::ByteOrder 43749ce8969d3154e1560106cfe530444c09410f217Greg ClaytonDynamicLoaderDarwinKernel::OSKextLoadedKextSummary::GetByteOrder() 43849ce8969d3154e1560106cfe530444c09410f217Greg Clayton{ 43949ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (module_sp) 44049ce8969d3154e1560106cfe530444c09410f217Greg Clayton return module_sp->GetArchitecture().GetByteOrder(); 44149ce8969d3154e1560106cfe530444c09410f217Greg Clayton return lldb::endian::InlHostByteOrder(); 44249ce8969d3154e1560106cfe530444c09410f217Greg Clayton} 44349ce8969d3154e1560106cfe530444c09410f217Greg Clayton 44449ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb_private::ArchSpec 44549ce8969d3154e1560106cfe530444c09410f217Greg ClaytonDynamicLoaderDarwinKernel::OSKextLoadedKextSummary::GetArchitecture () const 44649ce8969d3154e1560106cfe530444c09410f217Greg Clayton{ 44749ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (module_sp) 44849ce8969d3154e1560106cfe530444c09410f217Greg Clayton return module_sp->GetArchitecture(); 44949ce8969d3154e1560106cfe530444c09410f217Greg Clayton return lldb_private::ArchSpec (); 45049ce8969d3154e1560106cfe530444c09410f217Greg Clayton} 45149ce8969d3154e1560106cfe530444c09410f217Greg Clayton 45249ce8969d3154e1560106cfe530444c09410f217Greg Clayton 453bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 4549ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// Load the kernel module and initialize the "m_kernel" member. Return 4559ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// true _only_ if the kernel is loaded the first time through (subsequent 4569ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// calls to this function should return false after the kernel has been 4579ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// already loaded). 458bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 4599ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonvoid 4609ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonDynamicLoaderDarwinKernel::LoadKernelModuleIfNeeded() 461bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 4629ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (!m_kext_summary_header_ptr_addr.IsValid()) 463bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 4649ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_kernel.Clear(false); 4659ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_kernel.module_sp = m_process->GetTarget().GetExecutableModule(); 466127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda m_kernel.kernel_image = true; 467fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda 468fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda ConstString kernel_name("mach_kernel"); 469fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda if (m_kernel.module_sp.get() 470fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda && m_kernel.module_sp->GetObjectFile() 471fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda && !m_kernel.module_sp->GetObjectFile()->GetFileSpec().GetFilename().IsEmpty()) 472fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda { 473fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda kernel_name = m_kernel.module_sp->GetObjectFile()->GetFileSpec().GetFilename(); 474fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda } 4754a55d75b00a2956f5a26f15c03137c090d142a38Jason Molenda strncpy (m_kernel.name, kernel_name.AsCString(), sizeof(m_kernel.name)); 4764a55d75b00a2956f5a26f15c03137c090d142a38Jason Molenda m_kernel.name[sizeof (m_kernel.name) - 1] = '\0'; 477fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda 4789ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (m_kernel.address == LLDB_INVALID_ADDRESS) 479bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 4809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_kernel.address = m_process->GetImageInfoAddress (); 4819ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (m_kernel.address == LLDB_INVALID_ADDRESS && m_kernel.module_sp) 482bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 4839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // We didn't get a hint from the process, so we will 4849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // try the kernel at the address that it exists at in 4859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // the file if we have one 4869ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton ObjectFile *kernel_object_file = m_kernel.module_sp->GetObjectFile(); 4879ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (kernel_object_file) 488fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda { 489fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda addr_t load_address = kernel_object_file->GetHeaderAddress().GetLoadAddress(&m_process->GetTarget()); 490fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda addr_t file_address = kernel_object_file->GetHeaderAddress().GetFileAddress(); 491fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda if (load_address != LLDB_INVALID_ADDRESS && load_address != 0) 492fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda { 493fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda m_kernel.address = load_address; 494fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda if (load_address != file_address) 495fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda { 496fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda // Don't accidentally relocate the kernel to the File address -- 497fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda // the Load address has already been set to its actual in-memory address. 498fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda // Mark it as IsLoaded. 499fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda m_kernel.load_process_stop_id = m_process->GetStopID(); 500fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda } 501fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda } 502fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda else 503fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda { 504fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda m_kernel.address = file_address; 505fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda } 506fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda } 507bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 508bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 5099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 5109ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (m_kernel.address != LLDB_INVALID_ADDRESS) 511aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton { 512aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton if (!m_kernel.LoadImageUsingMemoryModule (m_process)) 513aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton { 514aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton m_kernel.LoadImageAtFileAddress (m_process); 515aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton } 516aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton } 5179ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 5186f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham if (m_kernel.IsLoaded() && m_kernel.module_sp) 5199ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 5209ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton static ConstString kext_summary_symbol ("gLoadedKextSummaries"); 5219ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const Symbol *symbol = m_kernel.module_sp->FindFirstSymbolWithNameAndType (kext_summary_symbol, eSymbolTypeData); 5229ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (symbol) 5239ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 5240c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton m_kext_summary_header_ptr_addr = symbol->GetAddress(); 5259ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Update all image infos 5269ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton ReadAllKextSummaries (); 5279ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 5289ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 5299ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton else 5309ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 5319ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_kernel.Clear(false); 5329ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 533bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 534bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 535bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 536bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 537bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Static callback function that gets called when our DYLD notification 538bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// breakpoint gets hit. We update all of our image infos and then 539bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// let our super class DynamicLoader class decide if we should stop 540bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// or not (based on global preference). 541bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 542bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool 54317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::BreakpointHitCallback (void *baton, 544645facaf9c247b20f0f135445d437181688711a7Greg Clayton StoppointCallbackContext *context, 545645facaf9c247b20f0f135445d437181688711a7Greg Clayton user_id_t break_id, 546645facaf9c247b20f0f135445d437181688711a7Greg Clayton user_id_t break_loc_id) 5478c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton{ 54817f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton return static_cast<DynamicLoaderDarwinKernel*>(baton)->BreakpointHit (context, break_id, break_loc_id); 549bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 550bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 551bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool 55217f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::BreakpointHit (StoppointCallbackContext *context, 553645facaf9c247b20f0f135445d437181688711a7Greg Clayton user_id_t break_id, 554645facaf9c247b20f0f135445d437181688711a7Greg Clayton user_id_t break_loc_id) 555645facaf9c247b20f0f135445d437181688711a7Greg Clayton{ 5567dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton LogSP log(GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER)); 5577dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton if (log) 55817f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton log->Printf ("DynamicLoaderDarwinKernel::BreakpointHit (...)\n"); 5597dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton 560645facaf9c247b20f0f135445d437181688711a7Greg Clayton ReadAllKextSummaries (); 5617dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton 5627dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton if (log) 5637dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton PutToLog(log.get()); 5647dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton 565645facaf9c247b20f0f135445d437181688711a7Greg Clayton return GetStopWhenImagesChange(); 566645facaf9c247b20f0f135445d437181688711a7Greg Clayton} 567645facaf9c247b20f0f135445d437181688711a7Greg Clayton 568645facaf9c247b20f0f135445d437181688711a7Greg Clayton 569645facaf9c247b20f0f135445d437181688711a7Greg Claytonbool 57017f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::ReadKextSummaryHeader () 571bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 572bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Mutex::Locker locker(m_mutex); 573bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 574bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton // the all image infos is already valid for this process stop ID 575bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 576bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kext_summaries.clear(); 5777dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton if (m_kext_summary_header_ptr_addr.IsValid()) 578bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 579bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const uint32_t addr_size = m_kernel.GetAddressByteSize (); 580bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const ByteOrder byte_order = m_kernel.GetByteOrder(); 581bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Error error; 582bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton // Read enough bytes for a "OSKextLoadedKextSummaryHeader" structure 583bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton // which is currenty 4 uint32_t and a pointer. 584bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton uint8_t buf[24]; 585bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton DataExtractor data (buf, sizeof(buf), byte_order, addr_size); 586bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const size_t count = 4 * sizeof(uint32_t) + addr_size; 5878c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton const bool prefer_file_cache = false; 5887dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton if (m_process->GetTarget().ReadPointerFromMemory (m_kext_summary_header_ptr_addr, 5897dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton prefer_file_cache, 5907dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton error, 5917dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton m_kext_summary_header_addr)) 592bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 5937dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton // We got a valid address for our kext summary header and make sure it isn't NULL 5947dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton if (m_kext_summary_header_addr.IsValid() && 5957dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton m_kext_summary_header_addr.GetFileAddress() != 0) 5967dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton { 5977dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton const size_t bytes_read = m_process->GetTarget().ReadMemory (m_kext_summary_header_addr, prefer_file_cache, buf, count, error); 5987dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton if (bytes_read == count) 5997dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton { 6007dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton uint32_t offset = 0; 6010fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton m_kext_summary_header.version = data.GetU32(&offset); 6020fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton if (m_kext_summary_header.version >= 2) 6030fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton { 6040fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton m_kext_summary_header.entry_size = data.GetU32(&offset); 6050fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton } 6060fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton else 6070fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton { 6080fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton // Versions less than 2 didn't have an entry size, it was hard coded 6090fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton m_kext_summary_header.entry_size = KERNEL_MODULE_ENTRY_SIZE_VERSION_1; 6100fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton } 6110fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton m_kext_summary_header.entry_count = data.GetU32(&offset); 6127dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton return true; 6137dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton } 6147dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton } 615bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 616bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 6177dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton m_kext_summary_header_addr.Clear(); 618bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return false; 619bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 620bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 621bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 622bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool 62317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::ParseKextSummaries (const Address &kext_summary_addr, 6248c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton uint32_t count) 625bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 626bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton OSKextLoadedKextSummary::collection kext_summaries; 627645facaf9c247b20f0f135445d437181688711a7Greg Clayton LogSP log(GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER)); 628bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (log) 6297e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda log->Printf ("Adding %d modules.\n", count); 630bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 631bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Mutex::Locker locker(m_mutex); 632bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 633bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (!ReadKextSummaries (kext_summary_addr, count, kext_summaries)) 634bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return false; 635bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 636234981a4559db084f9c90612660e40f19915b89cGreg Clayton Stream *s = &m_process->GetTarget().GetDebugger().GetOutputStream(); 6374952db8c76f619e3d8a0cf13456097128009d67bJason Molenda if (s) 6384952db8c76f619e3d8a0cf13456097128009d67bJason Molenda s->Printf ("Loading %d kext modules ", count); 639bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton for (uint32_t i = 0; i < count; i++) 640bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 641aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton if (!kext_summaries[i].LoadImageUsingMemoryModule (m_process)) 642aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton kext_summaries[i].LoadImageAtFileAddress (m_process); 6439ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 6447b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton if (s) 6454952db8c76f619e3d8a0cf13456097128009d67bJason Molenda s->Printf ("."); 6464952db8c76f619e3d8a0cf13456097128009d67bJason Molenda 6470fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton if (log) 6480fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton kext_summaries[i].PutToLog (log.get()); 649bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 6504952db8c76f619e3d8a0cf13456097128009d67bJason Molenda if (s) 6514952db8c76f619e3d8a0cf13456097128009d67bJason Molenda { 6524952db8c76f619e3d8a0cf13456097128009d67bJason Molenda s->Printf (" done.\n"); 6534952db8c76f619e3d8a0cf13456097128009d67bJason Molenda s->Flush (); 6544952db8c76f619e3d8a0cf13456097128009d67bJason Molenda } 6554952db8c76f619e3d8a0cf13456097128009d67bJason Molenda 656bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton bool return_value = AddModulesUsingImageInfos (kext_summaries); 657bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return return_value; 658bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 659bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 660bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Adds the modules in image_infos to m_kext_summaries. 661bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// NB don't call this passing in m_kext_summaries. 662bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 663bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool 66417f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::AddModulesUsingImageInfos (OSKextLoadedKextSummary::collection &image_infos) 665bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 666bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton // Now add these images to the main list. 667bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton ModuleList loaded_module_list; 668bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 669bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton for (uint32_t idx = 0; idx < image_infos.size(); ++idx) 670bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 6719ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton OSKextLoadedKextSummary &image_info = image_infos[idx]; 6729ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_kext_summaries.push_back(image_info); 673bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 6749ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (image_info.module_sp && m_process->GetStopID() == image_info.load_process_stop_id) 6759ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton loaded_module_list.AppendIfNeeded (image_infos[idx].module_sp); 676bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 677bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 678146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata m_process->GetTarget().ModulesDidLoad (loaded_module_list); 679bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return true; 680bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 681bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 682bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 683bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonuint32_t 68417f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::ReadKextSummaries (const Address &kext_summary_addr, 685bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton uint32_t image_infos_count, 686bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton OSKextLoadedKextSummary::collection &image_infos) 687bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 688bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const ByteOrder endian = m_kernel.GetByteOrder(); 689bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const uint32_t addr_size = m_kernel.GetAddressByteSize(); 690bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 691bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton image_infos.resize(image_infos_count); 692bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const size_t count = image_infos.size() * m_kext_summary_header.entry_size; 693bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton DataBufferHeap data(count, 0); 694bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Error error; 6957b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton 6968c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton const bool prefer_file_cache = false; 6978c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton const size_t bytes_read = m_process->GetTarget().ReadMemory (kext_summary_addr, 6988c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton prefer_file_cache, 6998c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton data.GetBytes(), 7008c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton data.GetByteSize(), 7018c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton error); 702bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (bytes_read == count) 703bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 7040fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton 705bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton DataExtractor extractor (data.GetBytes(), data.GetByteSize(), endian, addr_size); 706bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton uint32_t i=0; 7070fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton for (uint32_t kext_summary_offset = 0; 7080fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton i < image_infos.size() && extractor.ValidOffsetForDataOfSize(kext_summary_offset, m_kext_summary_header.entry_size); 7090fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton ++i, kext_summary_offset += m_kext_summary_header.entry_size) 710bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 7110fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton uint32_t offset = kext_summary_offset; 712bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const void *name_data = extractor.GetData(&offset, KERNEL_MODULE_MAX_NAME); 713bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (name_data == NULL) 714bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton break; 715bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton memcpy (image_infos[i].name, name_data, KERNEL_MODULE_MAX_NAME); 716bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton image_infos[i].uuid.SetBytes(extractor.GetData (&offset, 16)); 717bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton image_infos[i].address = extractor.GetU64(&offset); 7188c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton if (!image_infos[i].so_address.SetLoadAddress (image_infos[i].address, &m_process->GetTarget())) 7198c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton m_process->GetTarget().GetImages().ResolveFileAddress (image_infos[i].address, image_infos[i].so_address); 720bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton image_infos[i].size = extractor.GetU64(&offset); 721bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton image_infos[i].version = extractor.GetU64(&offset); 722bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton image_infos[i].load_tag = extractor.GetU32(&offset); 723bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton image_infos[i].flags = extractor.GetU32(&offset); 7240fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton if ((offset - kext_summary_offset) < m_kext_summary_header.entry_size) 7250fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton { 7260fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton image_infos[i].reference_list = extractor.GetU64(&offset); 7270fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton } 7280fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton else 7290fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton { 7300fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton image_infos[i].reference_list = 0; 7310fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton } 732bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 733bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (i < image_infos.size()) 734bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton image_infos.resize(i); 735bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 736bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton else 737bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 738bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton image_infos.clear(); 739bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 740bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return image_infos.size(); 741bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 742bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 743bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool 74417f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::ReadAllKextSummaries () 745bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 746645facaf9c247b20f0f135445d437181688711a7Greg Clayton LogSP log(GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER)); 747bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 748bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Mutex::Locker locker(m_mutex); 749645facaf9c247b20f0f135445d437181688711a7Greg Clayton 750bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (ReadKextSummaryHeader ()) 751bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 752645facaf9c247b20f0f135445d437181688711a7Greg Clayton if (m_kext_summary_header.entry_count > 0 && m_kext_summary_header_addr.IsValid()) 753bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 7548c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton Address summary_addr (m_kext_summary_header_addr); 7550fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton summary_addr.Slide(m_kext_summary_header.GetSize()); 7568c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton if (!ParseKextSummaries (summary_addr, m_kext_summary_header.entry_count)) 757bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 758bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kext_summaries.clear(); 759bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 760bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return true; 761bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 762bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 763bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return false; 764bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 765bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 766bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 767bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Dump an image info structure to the file handle provided. 768bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 769bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 77017f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::OSKextLoadedKextSummary::PutToLog (Log *log) const 771bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 772bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (log == NULL) 773bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return; 774234981a4559db084f9c90612660e40f19915b89cGreg Clayton const uint8_t *u = (uint8_t *)uuid.GetBytes(); 775bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 776bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (address == LLDB_INVALID_ADDRESS) 777bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 778bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (u) 779bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 7800fa512447e00da09d300fbabd18b5ce94f52fdaaGreg 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)", 781bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton u[ 0], u[ 1], u[ 2], u[ 3], 782bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton u[ 4], u[ 5], u[ 6], u[ 7], 783bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton u[ 8], u[ 9], u[10], u[11], 784bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton u[12], u[13], u[14], u[15], 785bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton name); 786bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 787bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton else 7880fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton log->Printf("\tname=\"%s\" (UNLOADED)", name); 789bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 790bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton else 791bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 792bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (u) 793bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 7945f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("\taddr=0x%16.16" PRIx64 " size=0x%16.16" PRIx64 " version=0x%16.16" PRIx64 " load-tag=0x%8.8x flags=0x%8.8x ref-list=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\"", 7950fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton address, size, version, load_tag, flags, reference_list, 7960fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton u[ 0], u[ 1], u[ 2], u[ 3], u[ 4], u[ 5], u[ 6], u[ 7], 7970fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton u[ 8], u[ 9], u[10], u[11], u[12], u[13], u[14], u[15], 798bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton name); 799bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 800bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton else 801bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 8025f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("\t[0x%16.16" PRIx64 " - 0x%16.16" PRIx64 ") version=0x%16.16" PRIx64 " load-tag=0x%8.8x flags=0x%8.8x ref-list=0x%16.16" PRIx64 " name=\"%s\"", 8030fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton address, address+size, version, load_tag, flags, reference_list, 8040fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton name); 805bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 806bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 807bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 808bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 809bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 810bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Dump the _dyld_all_image_infos members and all current image infos 811bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// that we have parsed to the file handle provided. 812bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 813bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 81417f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::PutToLog(Log *log) const 815bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 816bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (log == NULL) 817bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return; 818bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 819bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Mutex::Locker locker(m_mutex); 8205f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("gLoadedKextSummaries = 0x%16.16" PRIx64 " { version=%u, entry_size=%u, entry_count=%u }", 8218c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton m_kext_summary_header_addr.GetFileAddress(), 822bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kext_summary_header.version, 823bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kext_summary_header.entry_size, 8240fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton m_kext_summary_header.entry_count); 825bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 826bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton size_t i; 827bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton const size_t count = m_kext_summaries.size(); 828bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton if (count > 0) 829bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 830bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton log->PutCString("Loaded:"); 831bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton for (i = 0; i<count; i++) 832bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_kext_summaries[i].PutToLog(log); 833bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 834bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 835bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 836bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 83717f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::PrivateInitialize(Process *process) 838bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 83917f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton DEBUG_PRINTF("DynamicLoaderDarwinKernel::%s() process state = %s\n", __FUNCTION__, StateAsCString(m_process->GetState())); 840bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Clear(true); 841bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton m_process = process; 842bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 843bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 844645facaf9c247b20f0f135445d437181688711a7Greg Claytonvoid 84517f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::SetNotificationBreakpointIfNeeded () 846bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 8479ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (m_break_id == LLDB_INVALID_BREAK_ID && m_kernel.module_sp) 848645facaf9c247b20f0f135445d437181688711a7Greg Clayton { 84917f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton DEBUG_PRINTF("DynamicLoaderDarwinKernel::%s() process state = %s\n", __FUNCTION__, StateAsCString(m_process->GetState())); 850645facaf9c247b20f0f135445d437181688711a7Greg Clayton 8517dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton 8522cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham const bool internal_bp = true; 8537dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton const LazyBool skip_prologue = eLazyBoolNo; 85403c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham FileSpecList module_spec_list; 85503c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham module_spec_list.Append (m_kernel.module_sp->GetFileSpec()); 85603c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham Breakpoint *bp = m_process->GetTarget().CreateBreakpoint (&module_spec_list, 857d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham NULL, 858645facaf9c247b20f0f135445d437181688711a7Greg Clayton "OSKextLoadedKextSummariesUpdated", 859645facaf9c247b20f0f135445d437181688711a7Greg Clayton eFunctionNameTypeFull, 8602cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham skip_prologue, 8612cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham internal_bp).get(); 862645facaf9c247b20f0f135445d437181688711a7Greg Clayton 86317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton bp->SetCallback (DynamicLoaderDarwinKernel::BreakpointHitCallback, this, true); 864645facaf9c247b20f0f135445d437181688711a7Greg Clayton m_break_id = bp->GetID(); 865645facaf9c247b20f0f135445d437181688711a7Greg Clayton } 866bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 867bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 868bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 869bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Member function that gets called when the process state changes. 870bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//---------------------------------------------------------------------- 871bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 87217f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::PrivateProcessStateChanged (Process *process, StateType state) 873bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 87417f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton DEBUG_PRINTF("DynamicLoaderDarwinKernel::%s(%s)\n", __FUNCTION__, StateAsCString(state)); 875bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton switch (state) 876bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton { 877bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateConnected: 878bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateAttaching: 879bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateLaunching: 880bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateInvalid: 881bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateUnloaded: 882bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateExited: 883bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateDetached: 884bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Clear(false); 885bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton break; 886bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 887bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateStopped: 888645facaf9c247b20f0f135445d437181688711a7Greg Clayton UpdateIfNeeded(); 889bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton break; 890bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 891bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateRunning: 892bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateStepping: 893bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateCrashed: 894bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton case eStateSuspended: 895bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton break; 896bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 897bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton default: 898bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton break; 899bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton } 900bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 901bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 902bbea13375ec4ae876576fcb8608626d45880dd96Greg ClaytonThreadPlanSP 90317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetStepThroughTrampolinePlan (Thread &thread, bool stop_others) 904bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 905bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton ThreadPlanSP thread_plan_sp; 906645facaf9c247b20f0f135445d437181688711a7Greg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 907645facaf9c247b20f0f135445d437181688711a7Greg Clayton if (log) 908645facaf9c247b20f0f135445d437181688711a7Greg Clayton log->Printf ("Could not find symbol for step through."); 909bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return thread_plan_sp; 910bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 911bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 912bbea13375ec4ae876576fcb8608626d45880dd96Greg ClaytonError 91317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::CanLoadImage () 914bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 915bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton Error error; 916bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton error.SetErrorString("always unsafe to load or unload shared libraries in the darwin kernel"); 917bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return error; 918bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 919bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 920bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 92117f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::Initialize() 922bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 923bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton PluginManager::RegisterPlugin (GetPluginNameStatic(), 924bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton GetPluginDescriptionStatic(), 92587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton CreateInstance, 92687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton DebuggerInitialize); 927bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 928bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 929bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid 93017f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::Terminate() 931bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 932bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton PluginManager::UnregisterPlugin (CreateInstance); 933bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 934bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 93587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonvoid 93687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg ClaytonDynamicLoaderDarwinKernel::DebuggerInitialize (lldb_private::Debugger &debugger) 93787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton{ 93887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton if (!PluginManager::GetSettingForDynamicLoaderPlugin (debugger, DynamicLoaderDarwinKernelProperties::GetSettingName())) 93987e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton { 94087e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton const bool is_global_setting = true; 94187e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton PluginManager::CreateSettingForDynamicLoaderPlugin (debugger, 94287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton GetGlobalProperties()->GetValueProperties(), 94387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton ConstString ("Properties for the DynamicLoaderDarwinKernel plug-in."), 94487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton is_global_setting); 94587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton } 94687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton} 947bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 948bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonconst char * 94917f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetPluginNameStatic() 950bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 9512acbc2a80c0116454426db2d8b55bc23e6cbb0c1Greg Clayton return "dynamic-loader.darwin-kernel"; 952bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 953bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 954bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonconst char * 95517f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetPluginDescriptionStatic() 956bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 957bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return "Dynamic loader plug-in that watches for shared library loads/unloads in the MacOSX kernel."; 958bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 959bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 960bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 961bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------ 962bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// PluginInterface protocol 963bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------ 964bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonconst char * 96517f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetPluginName() 966bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 96717f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton return "DynamicLoaderDarwinKernel"; 968bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 969bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 970bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonconst char * 97117f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetShortPluginName() 972bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 973bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return GetPluginNameStatic(); 974bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 975bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 976bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonuint32_t 97717f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetPluginVersion() 978bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{ 979bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton return 1; 980bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton} 981bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton 98249ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb::ByteOrder 98349ce8969d3154e1560106cfe530444c09410f217Greg ClaytonDynamicLoaderDarwinKernel::GetByteOrderFromMagic (uint32_t magic) 98449ce8969d3154e1560106cfe530444c09410f217Greg Clayton{ 98549ce8969d3154e1560106cfe530444c09410f217Greg Clayton switch (magic) 98649ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 98749ce8969d3154e1560106cfe530444c09410f217Greg Clayton case llvm::MachO::HeaderMagic32: 98849ce8969d3154e1560106cfe530444c09410f217Greg Clayton case llvm::MachO::HeaderMagic64: 98949ce8969d3154e1560106cfe530444c09410f217Greg Clayton return lldb::endian::InlHostByteOrder(); 99049ce8969d3154e1560106cfe530444c09410f217Greg Clayton 99149ce8969d3154e1560106cfe530444c09410f217Greg Clayton case llvm::MachO::HeaderMagic32Swapped: 99249ce8969d3154e1560106cfe530444c09410f217Greg Clayton case llvm::MachO::HeaderMagic64Swapped: 99349ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (lldb::endian::InlHostByteOrder() == lldb::eByteOrderBig) 99449ce8969d3154e1560106cfe530444c09410f217Greg Clayton return lldb::eByteOrderLittle; 99549ce8969d3154e1560106cfe530444c09410f217Greg Clayton else 99649ce8969d3154e1560106cfe530444c09410f217Greg Clayton return lldb::eByteOrderBig; 99749ce8969d3154e1560106cfe530444c09410f217Greg Clayton 99849ce8969d3154e1560106cfe530444c09410f217Greg Clayton default: 99949ce8969d3154e1560106cfe530444c09410f217Greg Clayton break; 100049ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 100149ce8969d3154e1560106cfe530444c09410f217Greg Clayton return lldb::eByteOrderInvalid; 100249ce8969d3154e1560106cfe530444c09410f217Greg Clayton} 100349ce8969d3154e1560106cfe530444c09410f217Greg Clayton 1004