DynamicLoaderDarwinKernel.cpp revision 5fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18
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"
1649ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ModuleSpec.h"
17bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Core/PluginManager.h"
1849ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Section.h"
19bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Core/State.h"
204952db8c76f619e3d8a0cf13456097128009d67bJason Molenda#include "lldb/Host/Symbols.h"
21bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Symbol/ObjectFile.h"
22bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Target/RegisterContext.h"
234952db8c76f619e3d8a0cf13456097128009d67bJason Molenda#include "lldb/Target/StackFrame.h"
24bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Target/Target.h"
25bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Target/Thread.h"
26bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include "lldb/Target/ThreadPlanRunToAddress.h"
274952db8c76f619e3d8a0cf13456097128009d67bJason Molenda
28bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
2917f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton#include "DynamicLoaderDarwinKernel.h"
30bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
31bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//#define ENABLE_DEBUG_PRINTF // COMMENT THIS LINE OUT PRIOR TO CHECKIN
32bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#ifdef ENABLE_DEBUG_PRINTF
33bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#include <stdio.h>
34bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#define DEBUG_PRINTF(fmt, ...) printf(fmt, ## __VA_ARGS__)
35bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#else
36bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#define DEBUG_PRINTF(fmt, ...)
37bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton#endif
38bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
39bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonusing namespace lldb;
40bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonusing namespace lldb_private;
41bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
4287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonstatic PropertyDefinition
4387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytong_properties[] =
4487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton{
452f27af8e7b2515b05e28653177da01c9a3fe0c52Greg Clayton    { "load-kexts" , OptionValue::eTypeBoolean, true, true, NULL, NULL, "Automatically loads kext images when attaching to a kernel." },
462f27af8e7b2515b05e28653177da01c9a3fe0c52Greg Clayton    {  NULL        , OptionValue::eTypeInvalid, false, 0  , NULL, NULL, NULL  }
4787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton};
4887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton
4987e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonenum {
502f27af8e7b2515b05e28653177da01c9a3fe0c52Greg Clayton    ePropertyLoadKexts
5187e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton};
5287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton
5387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonclass DynamicLoaderDarwinKernelProperties : public Properties
5487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton{
5587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonpublic:
5687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton
5787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    static ConstString &
5887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    GetSettingName ()
5987e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    {
602acbc2a80c0116454426db2d8b55bc23e6cbb0c1Greg Clayton        static ConstString g_setting_name("darwin-kernel");
6187e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton        return g_setting_name;
6287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    }
6387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton
6487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    DynamicLoaderDarwinKernelProperties() :
6587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton        Properties ()
6687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    {
6787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton        m_collection_sp.reset (new OptionValueProperties(GetSettingName()));
6887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton        m_collection_sp->Initialize(g_properties);
6987e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    }
7087e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton
7187e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    virtual
7287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    ~DynamicLoaderDarwinKernelProperties()
7387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    {
7487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    }
7587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton
7687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    bool
772f27af8e7b2515b05e28653177da01c9a3fe0c52Greg Clayton    GetLoadKexts() const
7887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    {
792f27af8e7b2515b05e28653177da01c9a3fe0c52Greg Clayton        const uint32_t idx = ePropertyLoadKexts;
8087e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton        return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
8187e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    }
8287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton
8387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton};
8487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton
8587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytontypedef STD_SHARED_PTR(DynamicLoaderDarwinKernelProperties) DynamicLoaderDarwinKernelPropertiesSP;
8687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton
8787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonstatic const DynamicLoaderDarwinKernelPropertiesSP &
8887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg ClaytonGetGlobalProperties()
8987e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton{
9087e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    static DynamicLoaderDarwinKernelPropertiesSP g_settings_sp;
9187e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    if (!g_settings_sp)
9287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton        g_settings_sp.reset (new DynamicLoaderDarwinKernelProperties ());
9387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    return g_settings_sp;
9487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton}
9587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton
96bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
97bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Create an instance of this class. This function is filled into
98bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// the plugin info class that gets handed out by the plugin factory and
99bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// allows the lldb to instantiate an instance of this class.
100bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
101bbea13375ec4ae876576fcb8608626d45880dd96Greg ClaytonDynamicLoader *
10217f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::CreateInstance (Process* process, bool force)
103bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
104bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    bool create = force;
105bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    if (!create)
106bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
1075beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton        Module* exe_module = process->GetTarget().GetExecutableModulePointer();
10840f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton        if (exe_module)
10940f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton        {
11040f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton            ObjectFile *object_file = exe_module->GetObjectFile();
11140f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton            if (object_file)
11240f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton            {
113ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan                create = (object_file->GetStrata() == ObjectFile::eStrataKernel);
11440f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton            }
11540f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton        }
11640f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton
11740f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton        if (create)
11840f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton        {
11940f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton            const llvm::Triple &triple_ref = process->GetTarget().GetArchitecture().GetTriple();
120b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            switch (triple_ref.getOS())
121b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            {
122b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                case llvm::Triple::Darwin:
123b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                case llvm::Triple::MacOSX:
124b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                case llvm::Triple::IOS:
125b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    create = triple_ref.getVendor() == llvm::Triple::Apple;
126b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    break;
127b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                default:
128b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    create = false;
129b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    break;
130b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            }
13140f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton        }
132bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
133bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
134bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    if (create)
1356cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan    {
1366cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan        process->SetCanJIT(false);
13717f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton        return new DynamicLoaderDarwinKernel (process);
1386cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan    }
139bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    return NULL;
140bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
141bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
142bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
143bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Constructor
144bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
14517f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::DynamicLoaderDarwinKernel (Process* process) :
146bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    DynamicLoader(process),
147bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    m_kernel(),
1487dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton    m_kext_summary_header_ptr_addr (),
1498c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton    m_kext_summary_header_addr (),
150bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    m_kext_summary_header (),
151bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    m_kext_summaries(),
15297c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar    m_mutex(Mutex::eMutexTypeRecursive),
15397c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar    m_break_id (LLDB_INVALID_BREAK_ID)
154bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
155bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
156bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
157bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
158bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Destructor
159bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
16017f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::~DynamicLoaderDarwinKernel()
161bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
162bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    Clear(true);
163bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
164bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
165645facaf9c247b20f0f135445d437181688711a7Greg Claytonvoid
16617f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::UpdateIfNeeded()
167645facaf9c247b20f0f135445d437181688711a7Greg Clayton{
168645facaf9c247b20f0f135445d437181688711a7Greg Clayton    LoadKernelModuleIfNeeded();
169645facaf9c247b20f0f135445d437181688711a7Greg Clayton    SetNotificationBreakpointIfNeeded ();
170645facaf9c247b20f0f135445d437181688711a7Greg Clayton}
171bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------
172bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// Called after attaching a process.
173bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton///
174bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// Allow DynamicLoader plug-ins to execute some code after
175bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// attaching to a process.
176bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------
177bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid
17817f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::DidAttach ()
179bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
180bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    PrivateInitialize(m_process);
181645facaf9c247b20f0f135445d437181688711a7Greg Clayton    UpdateIfNeeded();
182bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
183bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
184bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------
185bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// Called after attaching a process.
186bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton///
187bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// Allow DynamicLoader plug-ins to execute some code after
188bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// attaching to a process.
189bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------
190bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid
19117f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::DidLaunch ()
192bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
193bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    PrivateInitialize(m_process);
194645facaf9c247b20f0f135445d437181688711a7Greg Clayton    UpdateIfNeeded();
195bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
196bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
197bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
198bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
199bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Clear out the state of this class.
200bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
201bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid
20217f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::Clear (bool clear_process)
203bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
204bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    Mutex::Locker locker(m_mutex);
205bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
206bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    if (m_process->IsAlive() && LLDB_BREAK_ID_IS_VALID(m_break_id))
207bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        m_process->ClearBreakpointSiteByID(m_break_id);
208bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
209bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    if (clear_process)
210bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        m_process = NULL;
211bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    m_kernel.Clear(false);
2127dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton    m_kext_summary_header_ptr_addr.Clear();
2138c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton    m_kext_summary_header_addr.Clear();
214bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    m_kext_summaries.clear();
215bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    m_break_id = LLDB_INVALID_BREAK_ID;
216bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
217bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
218bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
219bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool
220aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg ClaytonDynamicLoaderDarwinKernel::OSKextLoadedKextSummary::LoadImageAtFileAddress (Process *process)
221aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton{
222aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton    if (IsLoaded())
223aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton        return true;
224aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton
225aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton    if (module_sp)
226aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton    {
227aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton        bool changed = false;
228aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton        if (module_sp->SetLoadAddress (process->GetTarget(), 0, changed))
229aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton            load_process_stop_id = process->GetStopID();
230aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton    }
231aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton    return false;
232aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton}
233aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton
234aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Claytonbool
2359ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonDynamicLoaderDarwinKernel::OSKextLoadedKextSummary::LoadImageUsingMemoryModule (Process *process)
236bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
2379ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (IsLoaded())
2389ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return true;
239bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
2409ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    bool uuid_is_valid = uuid.IsValid();
2414952db8c76f619e3d8a0cf13456097128009d67bJason Molenda    bool memory_module_is_kernel = false;
242bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
2439ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    Target &target = process->GetTarget();
2449ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    ModuleSP memory_module_sp;
245127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda
246127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda    // If this is a kext and the user asked us to ignore kexts, don't try to load it.
2472f27af8e7b2515b05e28653177da01c9a3fe0c52Greg Clayton    if (kernel_image == false && GetGlobalProperties()->GetLoadKexts() == false)
248127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda    {
249127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda        return false;
250127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda    }
251127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda
252127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda    // Use the memory module as the module if we have one
2539ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (address != LLDB_INVALID_ADDRESS)
254bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
2559ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        FileSpec file_spec;
2569ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        if (module_sp)
2579ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            file_spec = module_sp->GetFileSpec();
2589ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        else
2599ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            file_spec.SetFile (name, false);
2609ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
2619ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        memory_module_sp = process->ReadModuleFromMemory (file_spec, address, false, false);
2629ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        if (memory_module_sp && !uuid_is_valid)
263bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        {
2649ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            uuid = memory_module_sp->GetUUID();
2659ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            uuid_is_valid = uuid.IsValid();
266bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        }
267b6ea174785a93f6dc227d886eba3af72faa2cf98Jason Molenda        if (memory_module_sp
268b6ea174785a93f6dc227d886eba3af72faa2cf98Jason Molenda            && memory_module_sp->GetObjectFile()
2694952db8c76f619e3d8a0cf13456097128009d67bJason Molenda            && memory_module_sp->GetObjectFile()->GetType() == ObjectFile::eTypeExecutable
2704952db8c76f619e3d8a0cf13456097128009d67bJason Molenda            && memory_module_sp->GetObjectFile()->GetStrata() == ObjectFile::eStrataKernel)
2714952db8c76f619e3d8a0cf13456097128009d67bJason Molenda        {
2724952db8c76f619e3d8a0cf13456097128009d67bJason Molenda            memory_module_is_kernel = true;
273d6b8122cee3dd02255bf50a7d019f17dfeba463aJason Molenda            if (memory_module_sp->GetArchitecture().IsValid())
274d6b8122cee3dd02255bf50a7d019f17dfeba463aJason Molenda            {
275d6b8122cee3dd02255bf50a7d019f17dfeba463aJason Molenda                target.SetArchitecture(memory_module_sp->GetArchitecture());
276d6b8122cee3dd02255bf50a7d019f17dfeba463aJason Molenda            }
2774952db8c76f619e3d8a0cf13456097128009d67bJason Molenda        }
278bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
279bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
2809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (!module_sp)
281bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
2829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        if (uuid_is_valid)
283bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        {
284146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata            const ModuleList &target_images = target.GetImages();
2859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            module_sp = target_images.FindModule(uuid);
286d6b8122cee3dd02255bf50a7d019f17dfeba463aJason Molenda
2879ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            if (!module_sp)
288444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            {
289aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton                ModuleSpec module_spec;
290444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                module_spec.GetUUID() = uuid;
291d6b8122cee3dd02255bf50a7d019f17dfeba463aJason Molenda                module_spec.GetArchitecture() = target.GetArchitecture();
292d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda
293d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                // For the kernel, we really do need an on-disk file copy of the
294d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                // binary.
295d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                bool force_symbols_search = false;
296d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                if (memory_module_is_kernel)
297d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                {
298d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    force_symbols_search = true;
299d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                }
300d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda
301d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                if (Symbols::DownloadObjectAndSymbolFile (module_spec, force_symbols_search))
302d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                {
303d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    if (module_spec.GetFileSpec().Exists())
304d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    {
305d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                        module_sp.reset(new Module (module_spec.GetFileSpec(), target.GetArchitecture()));
306d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                        if (module_sp.get() && module_sp->MatchesModuleSpec (module_spec))
307d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                        {
308d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                            ModuleList loaded_module_list;
309d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                            loaded_module_list.Append (module_sp);
310d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                            target.ModulesDidLoad (loaded_module_list);
311d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                        }
312d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    }
313d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                }
314d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda
315d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                // Ask the Target to find this file on the local system, if possible.
316d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                // This will search in the list of currently-loaded files, look in the
317d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                // standard search paths on the system, and on a Mac it will try calling
318d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                // the DebugSymbols framework with the UUID to find the binary via its
319d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                // search methods.
320d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                if (!module_sp)
321d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                {
322d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    module_sp = target.GetSharedModule (module_spec);
323d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                }
3245fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda
3255fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda                // If we managed to find a module, append it to the target's list of images
3265fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda                if (module_sp && module_sp->GetUUID() == memory_module_sp->GetUUID())
3275fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda                {
3285fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda                    target.GetImages().Append(module_sp);
3295fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda                    if (memory_module_is_kernel && target.GetExecutableModulePointer() != module_sp.get())
3305fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda                    {
3315fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda                        target.SetExecutableModule (module_sp, false);
3325fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda                    }
3335fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda                }
334444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            }
335bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        }
336bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
3379ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
338bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
339d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda    if (memory_module_sp && module_sp)
340bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
341d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda        if (module_sp->GetUUID() == memory_module_sp->GetUUID())
342bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        {
343d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda            ObjectFile *ondisk_object_file = module_sp->GetObjectFile();
344d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda            ObjectFile *memory_object_file = memory_module_sp->GetObjectFile();
345d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda            if (memory_object_file && ondisk_object_file)
346d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda            {
347d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                SectionList *ondisk_section_list = ondisk_object_file->GetSectionList ();
348d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                SectionList *memory_section_list = memory_object_file->GetSectionList ();
349d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                if (memory_section_list && ondisk_section_list)
350bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                {
351d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    const uint32_t num_ondisk_sections = ondisk_section_list->GetSize();
352d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    // There may be CTF sections in the memory image so we can't
353d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    // always just compare the number of sections (which are actually
354d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    // segments in mach-o parlance)
355d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    uint32_t sect_idx = 0;
356d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda
357d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    // Use the memory_module's addresses for each section to set the
358d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    // file module's load address as appropriate.  We don't want to use
359d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    // a single slide value for the entire kext - different segments may
360d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    // be slid different amounts by the kext loader.
361d6b8122cee3dd02255bf50a7d019f17dfeba463aJason Molenda
362d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    uint32_t num_sections_loaded = 0;
363d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    for (sect_idx=0; sect_idx<num_ondisk_sections; ++sect_idx)
364d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    {
365d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                        SectionSP ondisk_section_sp(ondisk_section_list->GetSectionAtIndex(sect_idx));
366d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                        if (ondisk_section_sp)
367bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                        {
368d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                            const Section *memory_section = memory_section_list->FindSectionByName(ondisk_section_sp->GetName()).get();
369d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                            if (memory_section)
3700fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                            {
371d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                                target.GetSectionLoadList().SetSectionLoadAddress (ondisk_section_sp, memory_section->GetFileAddress());
372d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                                ++num_sections_loaded;
3730fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                            }
3740fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                        }
375bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                    }
376d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    if (num_sections_loaded > 0)
377d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                        load_process_stop_id = process->GetStopID();
3789ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    else
379d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                        module_sp.reset(); // No sections were loaded
380bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                }
3819ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                else
382d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    module_sp.reset(); // One or both section lists
383bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            }
3849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            else
385d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                module_sp.reset(); // One or both object files missing
386bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        }
387d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda        else
388d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda            module_sp.reset(); // UUID mismatch
389bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
390d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda
3919ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    bool is_loaded = IsLoaded();
3929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
3939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (so_address.IsValid())
3949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
3959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        if (is_loaded)
3969ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            so_address.SetLoadAddress (address, &target);
3979ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        else
3989ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            target.GetImages().ResolveFileAddress (address, so_address);
3999ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
4009ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
4014952db8c76f619e3d8a0cf13456097128009d67bJason Molenda
4024952db8c76f619e3d8a0cf13456097128009d67bJason Molenda    if (is_loaded && module_sp && memory_module_is_kernel)
4034952db8c76f619e3d8a0cf13456097128009d67bJason Molenda    {
4044952db8c76f619e3d8a0cf13456097128009d67bJason Molenda        Stream *s = &target.GetDebugger().GetOutputStream();
4054952db8c76f619e3d8a0cf13456097128009d67bJason Molenda        if (s)
4064952db8c76f619e3d8a0cf13456097128009d67bJason Molenda        {
4074952db8c76f619e3d8a0cf13456097128009d67bJason Molenda            char uuidbuf[64];
4084952db8c76f619e3d8a0cf13456097128009d67bJason Molenda            s->Printf ("Kernel UUID: %s\n", module_sp->GetUUID().GetAsCString(uuidbuf, sizeof (uuidbuf)));
4095f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea            s->Printf ("Load Address: 0x%" PRIx64 "\n", address);
41063e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda            if (module_sp->GetFileSpec().GetDirectory().IsEmpty())
41163e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda            {
41263e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda                s->Printf ("Loaded kernel file %s\n", module_sp->GetFileSpec().GetFilename().AsCString());
41363e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda            }
41463e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda            else
41563e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda            {
41663e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda                s->Printf ("Loaded kernel file %s/%s\n",
41763e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda                              module_sp->GetFileSpec().GetDirectory().AsCString(),
41863e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda                              module_sp->GetFileSpec().GetFilename().AsCString());
41963e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda            }
4204952db8c76f619e3d8a0cf13456097128009d67bJason Molenda            s->Flush ();
4214952db8c76f619e3d8a0cf13456097128009d67bJason Molenda        }
4224952db8c76f619e3d8a0cf13456097128009d67bJason Molenda    }
4239ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    return is_loaded;
424bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
425bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
42649ce8969d3154e1560106cfe530444c09410f217Greg Claytonuint32_t
42749ce8969d3154e1560106cfe530444c09410f217Greg ClaytonDynamicLoaderDarwinKernel::OSKextLoadedKextSummary::GetAddressByteSize ()
42849ce8969d3154e1560106cfe530444c09410f217Greg Clayton{
42949ce8969d3154e1560106cfe530444c09410f217Greg Clayton    if (module_sp)
43049ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return module_sp->GetArchitecture().GetAddressByteSize();
43149ce8969d3154e1560106cfe530444c09410f217Greg Clayton    return 0;
43249ce8969d3154e1560106cfe530444c09410f217Greg Clayton}
43349ce8969d3154e1560106cfe530444c09410f217Greg Clayton
43449ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb::ByteOrder
43549ce8969d3154e1560106cfe530444c09410f217Greg ClaytonDynamicLoaderDarwinKernel::OSKextLoadedKextSummary::GetByteOrder()
43649ce8969d3154e1560106cfe530444c09410f217Greg Clayton{
43749ce8969d3154e1560106cfe530444c09410f217Greg Clayton    if (module_sp)
43849ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return module_sp->GetArchitecture().GetByteOrder();
43949ce8969d3154e1560106cfe530444c09410f217Greg Clayton    return lldb::endian::InlHostByteOrder();
44049ce8969d3154e1560106cfe530444c09410f217Greg Clayton}
44149ce8969d3154e1560106cfe530444c09410f217Greg Clayton
44249ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb_private::ArchSpec
44349ce8969d3154e1560106cfe530444c09410f217Greg ClaytonDynamicLoaderDarwinKernel::OSKextLoadedKextSummary::GetArchitecture () const
44449ce8969d3154e1560106cfe530444c09410f217Greg Clayton{
44549ce8969d3154e1560106cfe530444c09410f217Greg Clayton    if (module_sp)
44649ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return module_sp->GetArchitecture();
44749ce8969d3154e1560106cfe530444c09410f217Greg Clayton    return lldb_private::ArchSpec ();
44849ce8969d3154e1560106cfe530444c09410f217Greg Clayton}
44949ce8969d3154e1560106cfe530444c09410f217Greg Clayton
45049ce8969d3154e1560106cfe530444c09410f217Greg Clayton
451bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
4529ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// Load the kernel module and initialize the "m_kernel" member. Return
4539ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// true _only_ if the kernel is loaded the first time through (subsequent
4549ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// calls to this function should return false after the kernel has been
4559ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// already loaded).
456bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
4579ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonvoid
4589ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonDynamicLoaderDarwinKernel::LoadKernelModuleIfNeeded()
459bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
4609ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (!m_kext_summary_header_ptr_addr.IsValid())
461bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
4629ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        m_kernel.Clear(false);
4639ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        m_kernel.module_sp = m_process->GetTarget().GetExecutableModule();
464127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda        m_kernel.kernel_image = true;
465fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda
466fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda        ConstString kernel_name("mach_kernel");
467fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda        if (m_kernel.module_sp.get()
468fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda            && m_kernel.module_sp->GetObjectFile()
469fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda            && !m_kernel.module_sp->GetObjectFile()->GetFileSpec().GetFilename().IsEmpty())
470fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda        {
471fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda            kernel_name = m_kernel.module_sp->GetObjectFile()->GetFileSpec().GetFilename();
472fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda        }
4734a55d75b00a2956f5a26f15c03137c090d142a38Jason Molenda        strncpy (m_kernel.name, kernel_name.AsCString(), sizeof(m_kernel.name));
4744a55d75b00a2956f5a26f15c03137c090d142a38Jason Molenda        m_kernel.name[sizeof (m_kernel.name) - 1] = '\0';
475fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda
4769ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        if (m_kernel.address == LLDB_INVALID_ADDRESS)
477bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        {
4789ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            m_kernel.address = m_process->GetImageInfoAddress ();
4799ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            if (m_kernel.address == LLDB_INVALID_ADDRESS && m_kernel.module_sp)
480bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            {
4819ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                // We didn't get a hint from the process, so we will
4829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                // try the kernel at the address that it exists at in
4839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                // the file if we have one
4849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                ObjectFile *kernel_object_file = m_kernel.module_sp->GetObjectFile();
4859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                if (kernel_object_file)
486fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                {
487fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                    addr_t load_address = kernel_object_file->GetHeaderAddress().GetLoadAddress(&m_process->GetTarget());
488fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                    addr_t file_address = kernel_object_file->GetHeaderAddress().GetFileAddress();
489fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                    if (load_address != LLDB_INVALID_ADDRESS && load_address != 0)
490fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                    {
491fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                        m_kernel.address = load_address;
492fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                        if (load_address != file_address)
493fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                        {
494fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                            // Don't accidentally relocate the kernel to the File address --
495fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                            // the Load address has already been set to its actual in-memory address.
496fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                            // Mark it as IsLoaded.
497fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                            m_kernel.load_process_stop_id = m_process->GetStopID();
498fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                        }
499fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                    }
500fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                    else
501fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                    {
502fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                        m_kernel.address = file_address;
503fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                    }
504fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                }
505bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            }
506bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        }
5079ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
5089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        if (m_kernel.address != LLDB_INVALID_ADDRESS)
509aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton        {
510aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton            if (!m_kernel.LoadImageUsingMemoryModule (m_process))
511aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton            {
512aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton                m_kernel.LoadImageAtFileAddress (m_process);
513aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton            }
514aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton        }
5159ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
5166f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham        if (m_kernel.IsLoaded() && m_kernel.module_sp)
5179ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        {
5189ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            static ConstString kext_summary_symbol ("gLoadedKextSummaries");
5199ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            const Symbol *symbol = m_kernel.module_sp->FindFirstSymbolWithNameAndType (kext_summary_symbol, eSymbolTypeData);
5209ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            if (symbol)
5219ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            {
5220c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton                m_kext_summary_header_ptr_addr = symbol->GetAddress();
5239ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                // Update all image infos
5249ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                ReadAllKextSummaries ();
5259ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            }
5269ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        }
5279ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        else
5289ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        {
5299ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            m_kernel.Clear(false);
5309ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        }
531bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
532bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
533bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
534bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
535bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Static callback function that gets called when our DYLD notification
536bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// breakpoint gets hit. We update all of our image infos and then
537bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// let our super class DynamicLoader class decide if we should stop
538bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// or not (based on global preference).
539bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
540bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool
54117f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::BreakpointHitCallback (void *baton,
542645facaf9c247b20f0f135445d437181688711a7Greg Clayton                                                  StoppointCallbackContext *context,
543645facaf9c247b20f0f135445d437181688711a7Greg Clayton                                                  user_id_t break_id,
544645facaf9c247b20f0f135445d437181688711a7Greg Clayton                                                  user_id_t break_loc_id)
5458c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton{
54617f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton    return static_cast<DynamicLoaderDarwinKernel*>(baton)->BreakpointHit (context, break_id, break_loc_id);
547bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
548bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
549bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool
55017f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::BreakpointHit (StoppointCallbackContext *context,
551645facaf9c247b20f0f135445d437181688711a7Greg Clayton                                          user_id_t break_id,
552645facaf9c247b20f0f135445d437181688711a7Greg Clayton                                          user_id_t break_loc_id)
553645facaf9c247b20f0f135445d437181688711a7Greg Clayton{
5547dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton    LogSP log(GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER));
5557dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton    if (log)
55617f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton        log->Printf ("DynamicLoaderDarwinKernel::BreakpointHit (...)\n");
5577dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton
558645facaf9c247b20f0f135445d437181688711a7Greg Clayton    ReadAllKextSummaries ();
5597dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton
5607dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton    if (log)
5617dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton        PutToLog(log.get());
5627dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton
563645facaf9c247b20f0f135445d437181688711a7Greg Clayton    return GetStopWhenImagesChange();
564645facaf9c247b20f0f135445d437181688711a7Greg Clayton}
565645facaf9c247b20f0f135445d437181688711a7Greg Clayton
566645facaf9c247b20f0f135445d437181688711a7Greg Clayton
567645facaf9c247b20f0f135445d437181688711a7Greg Claytonbool
56817f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::ReadKextSummaryHeader ()
569bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
570bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    Mutex::Locker locker(m_mutex);
571bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
572bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    // the all image infos is already valid for this process stop ID
573bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
574bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    m_kext_summaries.clear();
5757dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton    if (m_kext_summary_header_ptr_addr.IsValid())
576bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
577bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        const uint32_t addr_size = m_kernel.GetAddressByteSize ();
578bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        const ByteOrder byte_order = m_kernel.GetByteOrder();
579bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        Error error;
580bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        // Read enough bytes for a "OSKextLoadedKextSummaryHeader" structure
581bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        // which is currenty 4 uint32_t and a pointer.
582bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        uint8_t buf[24];
583bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        DataExtractor data (buf, sizeof(buf), byte_order, addr_size);
584bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        const size_t count = 4 * sizeof(uint32_t) + addr_size;
5858c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton        const bool prefer_file_cache = false;
5867dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton        if (m_process->GetTarget().ReadPointerFromMemory (m_kext_summary_header_ptr_addr,
5877dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton                                                          prefer_file_cache,
5887dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton                                                          error,
5897dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton                                                          m_kext_summary_header_addr))
590bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        {
5917dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton            // We got a valid address for our kext summary header and make sure it isn't NULL
5927dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton            if (m_kext_summary_header_addr.IsValid() &&
5937dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton                m_kext_summary_header_addr.GetFileAddress() != 0)
5947dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton            {
5957dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton                const size_t bytes_read = m_process->GetTarget().ReadMemory (m_kext_summary_header_addr, prefer_file_cache, buf, count, error);
5967dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton                if (bytes_read == count)
5977dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton                {
5987dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton                    uint32_t offset = 0;
5990fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                    m_kext_summary_header.version = data.GetU32(&offset);
6000fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                    if (m_kext_summary_header.version >= 2)
6010fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                    {
6020fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                        m_kext_summary_header.entry_size = data.GetU32(&offset);
6030fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                    }
6040fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                    else
6050fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                    {
6060fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                        // Versions less than 2 didn't have an entry size, it was hard coded
6070fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                        m_kext_summary_header.entry_size = KERNEL_MODULE_ENTRY_SIZE_VERSION_1;
6080fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                    }
6090fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                    m_kext_summary_header.entry_count = data.GetU32(&offset);
6107dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton                    return true;
6117dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton                }
6127dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton            }
613bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        }
614bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
6157dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton    m_kext_summary_header_addr.Clear();
616bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    return false;
617bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
618bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
619bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
620bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool
62117f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::ParseKextSummaries (const Address &kext_summary_addr,
6228c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton                                               uint32_t count)
623bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
624bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    OSKextLoadedKextSummary::collection kext_summaries;
625645facaf9c247b20f0f135445d437181688711a7Greg Clayton    LogSP log(GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER));
626bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    if (log)
6277e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda        log->Printf ("Adding %d modules.\n", count);
628bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
629bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    Mutex::Locker locker(m_mutex);
630bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
631bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    if (!ReadKextSummaries (kext_summary_addr, count, kext_summaries))
632bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        return false;
633bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
634234981a4559db084f9c90612660e40f19915b89cGreg Clayton    Stream *s = &m_process->GetTarget().GetDebugger().GetOutputStream();
6354952db8c76f619e3d8a0cf13456097128009d67bJason Molenda    if (s)
6364952db8c76f619e3d8a0cf13456097128009d67bJason Molenda        s->Printf ("Loading %d kext modules ", count);
637bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    for (uint32_t i = 0; i < count; i++)
638bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
639aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton        if (!kext_summaries[i].LoadImageUsingMemoryModule (m_process))
640aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton            kext_summaries[i].LoadImageAtFileAddress (m_process);
6419ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
6427b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton        if (s)
6434952db8c76f619e3d8a0cf13456097128009d67bJason Molenda            s->Printf (".");
6444952db8c76f619e3d8a0cf13456097128009d67bJason Molenda
6450fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton        if (log)
6460fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton            kext_summaries[i].PutToLog (log.get());
647bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
6484952db8c76f619e3d8a0cf13456097128009d67bJason Molenda    if (s)
6494952db8c76f619e3d8a0cf13456097128009d67bJason Molenda    {
6504952db8c76f619e3d8a0cf13456097128009d67bJason Molenda        s->Printf (" done.\n");
6514952db8c76f619e3d8a0cf13456097128009d67bJason Molenda        s->Flush ();
6524952db8c76f619e3d8a0cf13456097128009d67bJason Molenda    }
6534952db8c76f619e3d8a0cf13456097128009d67bJason Molenda
654bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    bool return_value = AddModulesUsingImageInfos (kext_summaries);
655bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    return return_value;
656bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
657bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
658bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Adds the modules in image_infos to m_kext_summaries.
659bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// NB don't call this passing in m_kext_summaries.
660bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
661bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool
66217f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::AddModulesUsingImageInfos (OSKextLoadedKextSummary::collection &image_infos)
663bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
664bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    // Now add these images to the main list.
665bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    ModuleList loaded_module_list;
666bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
667bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    for (uint32_t idx = 0; idx < image_infos.size(); ++idx)
668bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
6699ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        OSKextLoadedKextSummary &image_info = image_infos[idx];
6709ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        m_kext_summaries.push_back(image_info);
671bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
6729ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        if (image_info.module_sp && m_process->GetStopID() == image_info.load_process_stop_id)
6739ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            loaded_module_list.AppendIfNeeded (image_infos[idx].module_sp);
674bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
675bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
676146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata    m_process->GetTarget().ModulesDidLoad (loaded_module_list);
677bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    return true;
678bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
679bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
680bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
681bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonuint32_t
68217f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::ReadKextSummaries (const Address &kext_summary_addr,
683bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                                              uint32_t image_infos_count,
684bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                                              OSKextLoadedKextSummary::collection &image_infos)
685bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
686bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    const ByteOrder endian = m_kernel.GetByteOrder();
687bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    const uint32_t addr_size = m_kernel.GetAddressByteSize();
688bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
689bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    image_infos.resize(image_infos_count);
690bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    const size_t count = image_infos.size() * m_kext_summary_header.entry_size;
691bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    DataBufferHeap data(count, 0);
692bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    Error error;
6937b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton
6948c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton    const bool prefer_file_cache = false;
6958c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton    const size_t bytes_read = m_process->GetTarget().ReadMemory (kext_summary_addr,
6968c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton                                                                 prefer_file_cache,
6978c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton                                                                 data.GetBytes(),
6988c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton                                                                 data.GetByteSize(),
6998c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton                                                                 error);
700bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    if (bytes_read == count)
701bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
7020fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton
703bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        DataExtractor extractor (data.GetBytes(), data.GetByteSize(), endian, addr_size);
704bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        uint32_t i=0;
7050fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton        for (uint32_t kext_summary_offset = 0;
7060fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton             i < image_infos.size() && extractor.ValidOffsetForDataOfSize(kext_summary_offset, m_kext_summary_header.entry_size);
7070fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton             ++i, kext_summary_offset += m_kext_summary_header.entry_size)
708bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        {
7090fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton            uint32_t offset = kext_summary_offset;
710bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            const void *name_data = extractor.GetData(&offset, KERNEL_MODULE_MAX_NAME);
711bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            if (name_data == NULL)
712bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                break;
713bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            memcpy (image_infos[i].name, name_data, KERNEL_MODULE_MAX_NAME);
714bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            image_infos[i].uuid.SetBytes(extractor.GetData (&offset, 16));
715bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            image_infos[i].address          = extractor.GetU64(&offset);
7168c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton            if (!image_infos[i].so_address.SetLoadAddress (image_infos[i].address, &m_process->GetTarget()))
7178c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton                m_process->GetTarget().GetImages().ResolveFileAddress (image_infos[i].address, image_infos[i].so_address);
718bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            image_infos[i].size             = extractor.GetU64(&offset);
719bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            image_infos[i].version          = extractor.GetU64(&offset);
720bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            image_infos[i].load_tag         = extractor.GetU32(&offset);
721bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            image_infos[i].flags            = extractor.GetU32(&offset);
7220fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton            if ((offset - kext_summary_offset) < m_kext_summary_header.entry_size)
7230fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton            {
7240fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                image_infos[i].reference_list = extractor.GetU64(&offset);
7250fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton            }
7260fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton            else
7270fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton            {
7280fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                image_infos[i].reference_list = 0;
7290fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton            }
730bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        }
731bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        if (i < image_infos.size())
732bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            image_infos.resize(i);
733bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
734bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    else
735bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
736bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        image_infos.clear();
737bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
738bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    return image_infos.size();
739bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
740bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
741bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool
74217f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::ReadAllKextSummaries ()
743bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
744645facaf9c247b20f0f135445d437181688711a7Greg Clayton    LogSP log(GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER));
745bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
746bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    Mutex::Locker locker(m_mutex);
747645facaf9c247b20f0f135445d437181688711a7Greg Clayton
748bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    if (ReadKextSummaryHeader ())
749bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
750645facaf9c247b20f0f135445d437181688711a7Greg Clayton        if (m_kext_summary_header.entry_count > 0 && m_kext_summary_header_addr.IsValid())
751bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        {
7528c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton            Address summary_addr (m_kext_summary_header_addr);
7530fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton            summary_addr.Slide(m_kext_summary_header.GetSize());
7548c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton            if (!ParseKextSummaries (summary_addr, m_kext_summary_header.entry_count))
755bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            {
756bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                m_kext_summaries.clear();
757bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            }
758bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            return true;
759bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        }
760bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
761bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    return false;
762bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
763bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
764bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
765bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Dump an image info structure to the file handle provided.
766bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
767bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid
76817f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::OSKextLoadedKextSummary::PutToLog (Log *log) const
769bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
770bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    if (log == NULL)
771bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        return;
772234981a4559db084f9c90612660e40f19915b89cGreg Clayton    const uint8_t *u = (uint8_t *)uuid.GetBytes();
773bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
774bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    if (address == LLDB_INVALID_ADDRESS)
775bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
776bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        if (u)
777bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        {
7780fa512447e00da09d300fbabd18b5ce94f52fdaaGreg 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)",
779bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                        u[ 0], u[ 1], u[ 2], u[ 3],
780bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                        u[ 4], u[ 5], u[ 6], u[ 7],
781bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                        u[ 8], u[ 9], u[10], u[11],
782bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                        u[12], u[13], u[14], u[15],
783bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                        name);
784bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        }
785bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        else
7860fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton            log->Printf("\tname=\"%s\" (UNLOADED)", name);
787bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
788bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    else
789bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
790bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        if (u)
791bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        {
7925f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel 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\"",
7930fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                        address, size, version, load_tag, flags, reference_list,
7940fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                        u[ 0], u[ 1], u[ 2], u[ 3], u[ 4], u[ 5], u[ 6], u[ 7],
7950fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                        u[ 8], u[ 9], u[10], u[11], u[12], u[13], u[14], u[15],
796bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                        name);
797bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        }
798bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        else
799bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        {
8005f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel 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\"",
8010fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                        address, address+size, version, load_tag, flags, reference_list,
8020fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                        name);
803bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        }
804bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
805bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
806bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
807bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
808bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Dump the _dyld_all_image_infos members and all current image infos
809bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// that we have parsed to the file handle provided.
810bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
811bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid
81217f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::PutToLog(Log *log) const
813bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
814bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    if (log == NULL)
815bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        return;
816bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
817bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    Mutex::Locker locker(m_mutex);
8185f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    log->Printf("gLoadedKextSummaries = 0x%16.16" PRIx64 " { version=%u, entry_size=%u, entry_count=%u }",
8198c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton                m_kext_summary_header_addr.GetFileAddress(),
820bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                m_kext_summary_header.version,
821bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                m_kext_summary_header.entry_size,
8220fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                m_kext_summary_header.entry_count);
823bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
824bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    size_t i;
825bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    const size_t count = m_kext_summaries.size();
826bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    if (count > 0)
827bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
828bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        log->PutCString("Loaded:");
829bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        for (i = 0; i<count; i++)
830bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            m_kext_summaries[i].PutToLog(log);
831bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
832bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
833bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
834bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid
83517f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::PrivateInitialize(Process *process)
836bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
83717f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton    DEBUG_PRINTF("DynamicLoaderDarwinKernel::%s() process state = %s\n", __FUNCTION__, StateAsCString(m_process->GetState()));
838bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    Clear(true);
839bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    m_process = process;
840bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
841bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
842645facaf9c247b20f0f135445d437181688711a7Greg Claytonvoid
84317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::SetNotificationBreakpointIfNeeded ()
844bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
8459ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (m_break_id == LLDB_INVALID_BREAK_ID && m_kernel.module_sp)
846645facaf9c247b20f0f135445d437181688711a7Greg Clayton    {
84717f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton        DEBUG_PRINTF("DynamicLoaderDarwinKernel::%s() process state = %s\n", __FUNCTION__, StateAsCString(m_process->GetState()));
848645facaf9c247b20f0f135445d437181688711a7Greg Clayton
8497dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton
8502cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham        const bool internal_bp = true;
8517dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton        const LazyBool skip_prologue = eLazyBoolNo;
85203c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham        FileSpecList module_spec_list;
85303c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham        module_spec_list.Append (m_kernel.module_sp->GetFileSpec());
85403c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham        Breakpoint *bp = m_process->GetTarget().CreateBreakpoint (&module_spec_list,
855d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham                                                                  NULL,
856645facaf9c247b20f0f135445d437181688711a7Greg Clayton                                                                  "OSKextLoadedKextSummariesUpdated",
857645facaf9c247b20f0f135445d437181688711a7Greg Clayton                                                                  eFunctionNameTypeFull,
8582cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham                                                                  skip_prologue,
8592cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham                                                                  internal_bp).get();
860645facaf9c247b20f0f135445d437181688711a7Greg Clayton
86117f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton        bp->SetCallback (DynamicLoaderDarwinKernel::BreakpointHitCallback, this, true);
862645facaf9c247b20f0f135445d437181688711a7Greg Clayton        m_break_id = bp->GetID();
863645facaf9c247b20f0f135445d437181688711a7Greg Clayton    }
864bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
865bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
866bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
867bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Member function that gets called when the process state changes.
868bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
869bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid
87017f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::PrivateProcessStateChanged (Process *process, StateType state)
871bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
87217f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton    DEBUG_PRINTF("DynamicLoaderDarwinKernel::%s(%s)\n", __FUNCTION__, StateAsCString(state));
873bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    switch (state)
874bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
875bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateConnected:
876bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateAttaching:
877bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateLaunching:
878bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateInvalid:
879bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateUnloaded:
880bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateExited:
881bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateDetached:
882bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        Clear(false);
883bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        break;
884bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
885bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateStopped:
886645facaf9c247b20f0f135445d437181688711a7Greg Clayton        UpdateIfNeeded();
887bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        break;
888bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
889bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateRunning:
890bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateStepping:
891bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateCrashed:
892bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateSuspended:
893bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        break;
894bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
895bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    default:
896bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        break;
897bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
898bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
899bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
900bbea13375ec4ae876576fcb8608626d45880dd96Greg ClaytonThreadPlanSP
90117f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetStepThroughTrampolinePlan (Thread &thread, bool stop_others)
902bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
903bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    ThreadPlanSP thread_plan_sp;
904645facaf9c247b20f0f135445d437181688711a7Greg Clayton    LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
905645facaf9c247b20f0f135445d437181688711a7Greg Clayton    if (log)
906645facaf9c247b20f0f135445d437181688711a7Greg Clayton        log->Printf ("Could not find symbol for step through.");
907bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    return thread_plan_sp;
908bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
909bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
910bbea13375ec4ae876576fcb8608626d45880dd96Greg ClaytonError
91117f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::CanLoadImage ()
912bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
913bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    Error error;
914bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    error.SetErrorString("always unsafe to load or unload shared libraries in the darwin kernel");
915bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    return error;
916bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
917bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
918bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid
91917f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::Initialize()
920bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
921bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    PluginManager::RegisterPlugin (GetPluginNameStatic(),
922bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                                   GetPluginDescriptionStatic(),
92387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton                                   CreateInstance,
92487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton                                   DebuggerInitialize);
925bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
926bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
927bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid
92817f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::Terminate()
929bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
930bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    PluginManager::UnregisterPlugin (CreateInstance);
931bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
932bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
93387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonvoid
93487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg ClaytonDynamicLoaderDarwinKernel::DebuggerInitialize (lldb_private::Debugger &debugger)
93587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton{
93687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    if (!PluginManager::GetSettingForDynamicLoaderPlugin (debugger, DynamicLoaderDarwinKernelProperties::GetSettingName()))
93787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    {
93887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton        const bool is_global_setting = true;
93987e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton        PluginManager::CreateSettingForDynamicLoaderPlugin (debugger,
94087e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton                                                            GetGlobalProperties()->GetValueProperties(),
94187e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton                                                            ConstString ("Properties for the DynamicLoaderDarwinKernel plug-in."),
94287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton                                                            is_global_setting);
94387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    }
94487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton}
945bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
946bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonconst char *
94717f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetPluginNameStatic()
948bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
9492acbc2a80c0116454426db2d8b55bc23e6cbb0c1Greg Clayton    return "dynamic-loader.darwin-kernel";
950bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
951bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
952bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonconst char *
95317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetPluginDescriptionStatic()
954bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
955bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    return "Dynamic loader plug-in that watches for shared library loads/unloads in the MacOSX kernel.";
956bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
957bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
958bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
959bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------
960bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// PluginInterface protocol
961bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------
962bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonconst char *
96317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetPluginName()
964bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
96517f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton    return "DynamicLoaderDarwinKernel";
966bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
967bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
968bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonconst char *
96917f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetShortPluginName()
970bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
971bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    return GetPluginNameStatic();
972bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
973bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
974bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonuint32_t
97517f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetPluginVersion()
976bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
977bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    return 1;
978bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
979bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
98049ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb::ByteOrder
98149ce8969d3154e1560106cfe530444c09410f217Greg ClaytonDynamicLoaderDarwinKernel::GetByteOrderFromMagic (uint32_t magic)
98249ce8969d3154e1560106cfe530444c09410f217Greg Clayton{
98349ce8969d3154e1560106cfe530444c09410f217Greg Clayton    switch (magic)
98449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
98549ce8969d3154e1560106cfe530444c09410f217Greg Clayton        case llvm::MachO::HeaderMagic32:
98649ce8969d3154e1560106cfe530444c09410f217Greg Clayton        case llvm::MachO::HeaderMagic64:
98749ce8969d3154e1560106cfe530444c09410f217Greg Clayton            return lldb::endian::InlHostByteOrder();
98849ce8969d3154e1560106cfe530444c09410f217Greg Clayton
98949ce8969d3154e1560106cfe530444c09410f217Greg Clayton        case llvm::MachO::HeaderMagic32Swapped:
99049ce8969d3154e1560106cfe530444c09410f217Greg Clayton        case llvm::MachO::HeaderMagic64Swapped:
99149ce8969d3154e1560106cfe530444c09410f217Greg Clayton            if (lldb::endian::InlHostByteOrder() == lldb::eByteOrderBig)
99249ce8969d3154e1560106cfe530444c09410f217Greg Clayton                return lldb::eByteOrderLittle;
99349ce8969d3154e1560106cfe530444c09410f217Greg Clayton            else
99449ce8969d3154e1560106cfe530444c09410f217Greg Clayton                return lldb::eByteOrderBig;
99549ce8969d3154e1560106cfe530444c09410f217Greg Clayton
99649ce8969d3154e1560106cfe530444c09410f217Greg Clayton        default:
99749ce8969d3154e1560106cfe530444c09410f217Greg Clayton            break;
99849ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
99949ce8969d3154e1560106cfe530444c09410f217Greg Clayton    return lldb::eByteOrderInvalid;
100049ce8969d3154e1560106cfe530444c09410f217Greg Clayton}
100149ce8969d3154e1560106cfe530444c09410f217Greg Clayton
1002