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