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