DynamicLoaderDarwinKernel.cpp revision b5229b189ca5a589b4d634271cfc0f83610b8030
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
449338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// Progressively greater amounts of scanning we will allow
459338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// For some targets very early in startup, we can't do any random reads of memory or we can crash the device
469338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// so a setting is needed that can completely disable the KASLR scans.
479338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
489338dd571e7781a89724d79e1f54385c282d0316Jason Molendaenum KASLRScanType
499338dd571e7781a89724d79e1f54385c282d0316Jason Molenda{
509338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    eKASLRScanNone = 0,         // No reading into the inferior at all
519338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    eKASLRScanLowgloAddresses,  // Check one word of memory for a possible kernel addr, then see if a kernel is there
5294c0f4c378f39b540ffb46992c5741a4bc59e2e2Jason Molenda    eKASLRScanNearPC,           // Scan backwards from the current $pc looking for kernel; checking at 96 locations total
539338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    eKASLRScanExhaustiveScan    // Scan through the entire possible kernel address range looking for a kernel
549338dd571e7781a89724d79e1f54385c282d0316Jason Molenda};
559338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
569338dd571e7781a89724d79e1f54385c282d0316Jason MolendaOptionEnumValueElement
579338dd571e7781a89724d79e1f54385c282d0316Jason Molendag_kaslr_kernel_scan_enum_values[] =
589338dd571e7781a89724d79e1f54385c282d0316Jason Molenda{
599338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    { eKASLRScanNone,            "none",            "Do not read memory looking for a Darwin kernel when attaching." },
609338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    { eKASLRScanLowgloAddresses, "basic",           "Check for the Darwin kernel's load addr in the lowglo page (boot-args=debug) only." },
619338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    { eKASLRScanNearPC,          "fast-scan",       "Scan near the pc value on attach to find the Darwin kernel's load address."},
629338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    { eKASLRScanExhaustiveScan,  "exhaustive-scan", "Scan through the entire potential address range of Darwin kernel (only on 32-bit targets)."},
639338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    { 0, NULL, NULL }
649338dd571e7781a89724d79e1f54385c282d0316Jason Molenda};
659338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
6687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonstatic PropertyDefinition
6787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytong_properties[] =
6887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton{
692f27af8e7b2515b05e28653177da01c9a3fe0c52Greg Clayton    { "load-kexts" , OptionValue::eTypeBoolean, true, true, NULL, NULL, "Automatically loads kext images when attaching to a kernel." },
709338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    { "scan-type",   OptionValue::eTypeEnum,    true, eKASLRScanNearPC, NULL, g_kaslr_kernel_scan_enum_values, "Control how many reads lldb will make while searching for a Darwin kernel on attach." },
712f27af8e7b2515b05e28653177da01c9a3fe0c52Greg Clayton    {  NULL        , OptionValue::eTypeInvalid, false, 0  , NULL, NULL, NULL  }
7287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton};
7387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton
7487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonenum {
759338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    ePropertyLoadKexts,
769338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    ePropertyScanType
7787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton};
7887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton
7987e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonclass DynamicLoaderDarwinKernelProperties : public Properties
8087e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton{
8187e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonpublic:
8287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton
8387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    static ConstString &
8487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    GetSettingName ()
8587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    {
862acbc2a80c0116454426db2d8b55bc23e6cbb0c1Greg Clayton        static ConstString g_setting_name("darwin-kernel");
8787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton        return g_setting_name;
8887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    }
8987e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton
9087e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    DynamicLoaderDarwinKernelProperties() :
9187e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton        Properties ()
9287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    {
9387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton        m_collection_sp.reset (new OptionValueProperties(GetSettingName()));
9487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton        m_collection_sp->Initialize(g_properties);
9587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    }
9687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton
9787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    virtual
9887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    ~DynamicLoaderDarwinKernelProperties()
9987e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    {
10087e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    }
1019338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
10287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    bool
1032f27af8e7b2515b05e28653177da01c9a3fe0c52Greg Clayton    GetLoadKexts() const
10487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    {
1052f27af8e7b2515b05e28653177da01c9a3fe0c52Greg Clayton        const uint32_t idx = ePropertyLoadKexts;
10687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton        return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
10787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    }
1089338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
1099338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    KASLRScanType
1109338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    GetScanType() const
1119338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    {
1129338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        const uint32_t idx = ePropertyScanType;
11394c0f4c378f39b540ffb46992c5741a4bc59e2e2Jason Molenda        return (KASLRScanType) m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
1149338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    }
1159338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
1169338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
11787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton};
11887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton
119102b2c2681c9a830afe25bfea35557421905e42cGreg Claytontypedef std::shared_ptr<DynamicLoaderDarwinKernelProperties> DynamicLoaderDarwinKernelPropertiesSP;
12087e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton
12187e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonstatic const DynamicLoaderDarwinKernelPropertiesSP &
12287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg ClaytonGetGlobalProperties()
12387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton{
12487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    static DynamicLoaderDarwinKernelPropertiesSP g_settings_sp;
12587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    if (!g_settings_sp)
12687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton        g_settings_sp.reset (new DynamicLoaderDarwinKernelProperties ());
12787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    return g_settings_sp;
12887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton}
12987e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton
130bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
131bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Create an instance of this class. This function is filled into
132bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// the plugin info class that gets handed out by the plugin factory and
133bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// allows the lldb to instantiate an instance of this class.
134bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
135bbea13375ec4ae876576fcb8608626d45880dd96Greg ClaytonDynamicLoader *
13617f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::CreateInstance (Process* process, bool force)
137bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
1389338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (!force)
139bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
1409338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        // If the user provided an executable binary and it is not a kernel,
1419338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        // this plugin should not create an instance.
1425beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton        Module* exe_module = process->GetTarget().GetExecutableModulePointer();
14340f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton        if (exe_module)
14440f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton        {
14540f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton            ObjectFile *object_file = exe_module->GetObjectFile();
14640f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton            if (object_file)
14740f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton            {
1489338dd571e7781a89724d79e1f54385c282d0316Jason Molenda                if (object_file->GetStrata() != ObjectFile::eStrataKernel)
1499338dd571e7781a89724d79e1f54385c282d0316Jason Molenda                {
1509338dd571e7781a89724d79e1f54385c282d0316Jason Molenda                    return NULL;
1519338dd571e7781a89724d79e1f54385c282d0316Jason Molenda                }
15240f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton            }
15340f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton        }
1549338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
1559338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        // If the target's architecture does not look like an Apple environment,
1569338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        // this plugin should not create an instance.
1579338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        const llvm::Triple &triple_ref = process->GetTarget().GetArchitecture().GetTriple();
1589338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        switch (triple_ref.getOS())
1599338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        {
1609338dd571e7781a89724d79e1f54385c282d0316Jason Molenda            case llvm::Triple::Darwin:
1619338dd571e7781a89724d79e1f54385c282d0316Jason Molenda            case llvm::Triple::MacOSX:
1629338dd571e7781a89724d79e1f54385c282d0316Jason Molenda            case llvm::Triple::IOS:
1639338dd571e7781a89724d79e1f54385c282d0316Jason Molenda                if (triple_ref.getVendor() != llvm::Triple::Apple)
1649338dd571e7781a89724d79e1f54385c282d0316Jason Molenda                {
1659338dd571e7781a89724d79e1f54385c282d0316Jason Molenda                   return NULL;
1669338dd571e7781a89724d79e1f54385c282d0316Jason Molenda                }
1679338dd571e7781a89724d79e1f54385c282d0316Jason Molenda                break;
1689338dd571e7781a89724d79e1f54385c282d0316Jason Molenda            // If we have triple like armv7-unknown-unknown, we should try looking for a Darwin kernel.
1699338dd571e7781a89724d79e1f54385c282d0316Jason Molenda            case llvm::Triple::UnknownOS:
1709338dd571e7781a89724d79e1f54385c282d0316Jason Molenda                break;
1719338dd571e7781a89724d79e1f54385c282d0316Jason Molenda            default:
1729338dd571e7781a89724d79e1f54385c282d0316Jason Molenda                return NULL;
1739338dd571e7781a89724d79e1f54385c282d0316Jason Molenda                break;
1749338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        }
1759338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    }
1769338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
1779338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    // At this point if there is an ExecutableModule, it is a kernel and the Target is some variant of an Apple system.
1789338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    // If the Process hasn't provided the kernel load address, we need to look around in memory to find it.
1799338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
180cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda    addr_t kernel_load_address = SearchForDarwinKernel (process);
181cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda    if (kernel_load_address != LLDB_INVALID_ADDRESS)
182cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda    {
183cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda        process->SetCanJIT(false);
184cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda        return new DynamicLoaderDarwinKernel (process, kernel_load_address);
185cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda    }
186cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda    return NULL;
187cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda}
188cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda
189cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molendalldb::addr_t
190cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason MolendaDynamicLoaderDarwinKernel::SearchForDarwinKernel (Process *process)
191cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda{
1929338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    addr_t kernel_load_address = process->GetImageInfoAddress();
1939338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (kernel_load_address == LLDB_INVALID_ADDRESS)
1949338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    {
1959338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        kernel_load_address = SearchForKernelAtSameLoadAddr (process);
1969338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        if (kernel_load_address == LLDB_INVALID_ADDRESS)
19740f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton        {
1989338dd571e7781a89724d79e1f54385c282d0316Jason Molenda            kernel_load_address = SearchForKernelWithDebugHints (process);
1999338dd571e7781a89724d79e1f54385c282d0316Jason Molenda            if (kernel_load_address == LLDB_INVALID_ADDRESS)
200b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            {
2019338dd571e7781a89724d79e1f54385c282d0316Jason Molenda                kernel_load_address = SearchForKernelNearPC (process);
2029338dd571e7781a89724d79e1f54385c282d0316Jason Molenda                if (kernel_load_address == LLDB_INVALID_ADDRESS)
2039338dd571e7781a89724d79e1f54385c282d0316Jason Molenda                {
2049338dd571e7781a89724d79e1f54385c282d0316Jason Molenda                    kernel_load_address = SearchForKernelViaExhaustiveSearch (process);
2059338dd571e7781a89724d79e1f54385c282d0316Jason Molenda                }
206b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            }
20740f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton        }
208bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
209cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda    return kernel_load_address;
210bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
211bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
212bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
2139338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// Check if the kernel binary is loaded in memory without a slide.
2149338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// First verify that the ExecutableModule is a kernel before we proceed.
2159338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// Returns the address of the kernel if one was found, else LLDB_INVALID_ADDRESS.
2169338dd571e7781a89724d79e1f54385c282d0316Jason Molenda//----------------------------------------------------------------------
2179338dd571e7781a89724d79e1f54385c282d0316Jason Molendalldb::addr_t
2189338dd571e7781a89724d79e1f54385c282d0316Jason MolendaDynamicLoaderDarwinKernel::SearchForKernelAtSameLoadAddr (Process *process)
2199338dd571e7781a89724d79e1f54385c282d0316Jason Molenda{
2209338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    Module *exe_module = process->GetTarget().GetExecutableModulePointer();
2219338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (exe_module == NULL)
2229338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        return LLDB_INVALID_ADDRESS;
2239338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
2249338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    ObjectFile *exe_objfile = exe_module->GetObjectFile();
2259338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (exe_objfile == NULL)
2269338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        return LLDB_INVALID_ADDRESS;
2279338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
2289338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (exe_objfile->GetType() != ObjectFile::eTypeExecutable || exe_objfile->GetStrata() != ObjectFile::eStrataKernel)
2299338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        return LLDB_INVALID_ADDRESS;
2309338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
2319338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (!exe_objfile->GetHeaderAddress().IsValid())
2329338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        return LLDB_INVALID_ADDRESS;
2339338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
2349338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (CheckForKernelImageAtAddress (exe_objfile->GetHeaderAddress().GetFileAddress(), process) == exe_module->GetUUID())
2359338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        return exe_objfile->GetHeaderAddress().GetFileAddress();
2369338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
2379338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    return LLDB_INVALID_ADDRESS;
2389338dd571e7781a89724d79e1f54385c282d0316Jason Molenda}
2399338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
2409338dd571e7781a89724d79e1f54385c282d0316Jason Molenda//----------------------------------------------------------------------
2419338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// If the debug flag is included in the boot-args nvram setting, the kernel's load address
2429338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// will be noted in the lowglo page at a fixed address
2439338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// Returns the address of the kernel if one was found, else LLDB_INVALID_ADDRESS.
2449338dd571e7781a89724d79e1f54385c282d0316Jason Molenda//----------------------------------------------------------------------
2459338dd571e7781a89724d79e1f54385c282d0316Jason Molendalldb::addr_t
2469338dd571e7781a89724d79e1f54385c282d0316Jason MolendaDynamicLoaderDarwinKernel::SearchForKernelWithDebugHints (Process *process)
2479338dd571e7781a89724d79e1f54385c282d0316Jason Molenda{
2489338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (GetGlobalProperties()->GetScanType() == eKASLRScanNone)
2499338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        return LLDB_INVALID_ADDRESS;
2509338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
2519338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    Error read_err;
2529338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    addr_t addr = LLDB_INVALID_ADDRESS;
2539338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (process->GetTarget().GetArchitecture().GetAddressByteSize() == 8)
2549338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    {
2559338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        addr = process->ReadUnsignedIntegerFromMemory (0xffffff8000002010ULL, 8, LLDB_INVALID_ADDRESS, read_err);
2569338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    }
2579338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    else
2589338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    {
2599338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        addr = process->ReadUnsignedIntegerFromMemory (0xffff0110, 4, LLDB_INVALID_ADDRESS, read_err);
2609338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    }
2619338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
2629338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (addr == 0)
2639338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        addr = LLDB_INVALID_ADDRESS;
2649338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
2659338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (addr != LLDB_INVALID_ADDRESS)
2669338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    {
2679338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        if (CheckForKernelImageAtAddress (addr, process).IsValid())
2689338dd571e7781a89724d79e1f54385c282d0316Jason Molenda            return addr;
2699338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    }
2709338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
2719338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    return LLDB_INVALID_ADDRESS;
2729338dd571e7781a89724d79e1f54385c282d0316Jason Molenda}
2739338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
2749338dd571e7781a89724d79e1f54385c282d0316Jason Molenda//----------------------------------------------------------------------
2759338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// If the kernel is currently executing when lldb attaches, and we don't have
2769338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// a better way of finding the kernel's load address, try searching backwards
2779338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// from the current pc value looking for the kernel's Mach header in memory.
2789338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// Returns the address of the kernel if one was found, else LLDB_INVALID_ADDRESS.
2799338dd571e7781a89724d79e1f54385c282d0316Jason Molenda//----------------------------------------------------------------------
2809338dd571e7781a89724d79e1f54385c282d0316Jason Molendalldb::addr_t
2819338dd571e7781a89724d79e1f54385c282d0316Jason MolendaDynamicLoaderDarwinKernel::SearchForKernelNearPC (Process *process)
2829338dd571e7781a89724d79e1f54385c282d0316Jason Molenda{
2839338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (GetGlobalProperties()->GetScanType() == eKASLRScanNone
2849338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        || GetGlobalProperties()->GetScanType() == eKASLRScanLowgloAddresses)
2859338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    {
2869338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        return LLDB_INVALID_ADDRESS;
2879338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    }
2889338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
2899338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    ThreadSP thread = process->GetThreadList().GetSelectedThread ();
2909338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (thread.get() == NULL)
2919338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        return LLDB_INVALID_ADDRESS;
2929338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    addr_t pc = thread->GetRegisterContext ()->GetPC(LLDB_INVALID_ADDRESS);
2939338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
2949338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (pc == LLDB_INVALID_ADDRESS)
2959338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        return LLDB_INVALID_ADDRESS;
2969338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
2971377cdcb699024daa45ca40bcb65daaf963e16c5Jason Molenda    addr_t kernel_range_low;
2989338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (process->GetTarget().GetArchitecture().GetAddressByteSize() == 8)
2999338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    {
3009338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        kernel_range_low = 1ULL << 63;
3019338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    }
3029338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    else
3039338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    {
3049338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        kernel_range_low = 1ULL << 31;
3059338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    }
3069338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
3079338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    // Outside the normal kernel address range, this is probably userland code running right now
3089338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (pc < kernel_range_low)
3091377cdcb699024daa45ca40bcb65daaf963e16c5Jason Molenda        return LLDB_INVALID_ADDRESS;
3109338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
3119338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    // The kernel will load at at one megabyte boundary (0x100000), or at that boundary plus
3129338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    // an offset of one page (0x1000) or two, depending on the device.
3139338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
3149338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    // Round the current pc down to the nearest one megabyte boundary - the place where we will start searching.
3159338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    addr_t addr = pc & ~0xfffff;
3169338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
3179338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    int i = 0;
3189338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    while (i < 32 && pc >= kernel_range_low)
3199338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    {
3209338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        if (CheckForKernelImageAtAddress (addr, process).IsValid())
3219338dd571e7781a89724d79e1f54385c282d0316Jason Molenda            return addr;
3229338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        if (CheckForKernelImageAtAddress (addr + 0x1000, process).IsValid())
3239338dd571e7781a89724d79e1f54385c282d0316Jason Molenda            return addr + 0x1000;
3249338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        if (CheckForKernelImageAtAddress (addr + 0x2000, process).IsValid())
3259338dd571e7781a89724d79e1f54385c282d0316Jason Molenda            return addr + 0x2000;
3269338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        i++;
3279338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        addr -= 0x100000;
3289338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    }
3299338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
3309338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    return LLDB_INVALID_ADDRESS;
3319338dd571e7781a89724d79e1f54385c282d0316Jason Molenda}
3329338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
3339338dd571e7781a89724d79e1f54385c282d0316Jason Molenda//----------------------------------------------------------------------
3349338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// Scan through the valid address range for a kernel binary.
3359338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// This is uselessly slow in 64-bit environments so we don't even try it.
3369338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// This scan is not enabled by default even for 32-bit targets.
3379338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// Returns the address of the kernel if one was found, else LLDB_INVALID_ADDRESS.
3389338dd571e7781a89724d79e1f54385c282d0316Jason Molenda//----------------------------------------------------------------------
3399338dd571e7781a89724d79e1f54385c282d0316Jason Molendalldb::addr_t
3409338dd571e7781a89724d79e1f54385c282d0316Jason MolendaDynamicLoaderDarwinKernel::SearchForKernelViaExhaustiveSearch (Process *process)
3419338dd571e7781a89724d79e1f54385c282d0316Jason Molenda{
3429338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (GetGlobalProperties()->GetScanType() != eKASLRScanExhaustiveScan)
3439338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    {
3449338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        return LLDB_INVALID_ADDRESS;
3459338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    }
3469338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
3479338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    addr_t kernel_range_low, kernel_range_high;
3489338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (process->GetTarget().GetArchitecture().GetAddressByteSize() == 8)
3499338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    {
3509338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        kernel_range_low = 1ULL << 63;
3519338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        kernel_range_high = UINT64_MAX;
3529338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    }
3539338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    else
3549338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    {
3559338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        kernel_range_low = 1ULL << 31;
3569338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        kernel_range_high = UINT32_MAX;
3579338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    }
3589338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
3599338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    // Stepping through memory at one-megabyte resolution looking for a kernel
3609338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    // rarely works (fast enough) with a 64-bit address space -- for now, let's
3619338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    // not even bother.  We may be attaching to something which *isn't* a kernel
3629338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    // and we don't want to spin for minutes on-end looking for a kernel.
3639338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (process->GetTarget().GetArchitecture().GetAddressByteSize() == 8)
3649338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        return LLDB_INVALID_ADDRESS;
3659338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
3669338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    addr_t addr = kernel_range_low;
3679338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
3689338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    while (addr >= kernel_range_low && addr < kernel_range_high)
3699338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    {
3709338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        if (CheckForKernelImageAtAddress (addr, process).IsValid())
3719338dd571e7781a89724d79e1f54385c282d0316Jason Molenda            return addr;
3729338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        if (CheckForKernelImageAtAddress (addr + 0x1000, process).IsValid())
3739338dd571e7781a89724d79e1f54385c282d0316Jason Molenda            return addr + 0x1000;
3749338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        if (CheckForKernelImageAtAddress (addr + 0x2000, process).IsValid())
3759338dd571e7781a89724d79e1f54385c282d0316Jason Molenda            return addr + 0x2000;
3769338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        addr += 0x100000;
3779338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    }
3789338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    return LLDB_INVALID_ADDRESS;
3799338dd571e7781a89724d79e1f54385c282d0316Jason Molenda}
3809338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
3819338dd571e7781a89724d79e1f54385c282d0316Jason Molenda//----------------------------------------------------------------------
3829338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// Given an address in memory, look to see if there is a kernel image at that
3839338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// address.
3849338dd571e7781a89724d79e1f54385c282d0316Jason Molenda// Returns a UUID; if a kernel was not found at that address, UUID.IsValid() will be false.
3859338dd571e7781a89724d79e1f54385c282d0316Jason Molenda//----------------------------------------------------------------------
3869338dd571e7781a89724d79e1f54385c282d0316Jason Molendalldb_private::UUID
3879338dd571e7781a89724d79e1f54385c282d0316Jason MolendaDynamicLoaderDarwinKernel::CheckForKernelImageAtAddress (lldb::addr_t addr, Process *process)
3889338dd571e7781a89724d79e1f54385c282d0316Jason Molenda{
3899338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (addr == LLDB_INVALID_ADDRESS)
3909338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        return UUID();
3919338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
3929338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    // First try a quick test -- read the first 4 bytes and see if there is a valid Mach-O magic field there
3939338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    // (the first field of the mach_header/mach_header_64 struct).
3949338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
3959338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    Error read_error;
3969338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    uint64_t result = process->ReadUnsignedIntegerFromMemory (addr, 4, LLDB_INVALID_ADDRESS, read_error);
3979338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (result != llvm::MachO::HeaderMagic64
3989338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        && result != llvm::MachO::HeaderMagic32
3999338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        && result != llvm::MachO::HeaderMagic32Swapped
4009338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        && result != llvm::MachO::HeaderMagic64Swapped)
4019338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    {
4029338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        return UUID();
4039338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    }
4049338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
4059338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    // Read the mach header and see whether it looks like a kernel
4069338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    llvm::MachO::mach_header header;
4079338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (process->DoReadMemory (addr, &header, sizeof(header), read_error) != sizeof(header))
4089338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        return UUID();
4099338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
4109338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (header.magic == llvm::MachO::HeaderMagic32Swapped ||
4119338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        header.magic == llvm::MachO::HeaderMagic64Swapped)
4129338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    {
4139338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        header.magic        = llvm::ByteSwap_32(header.magic);
4149338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        header.cputype      = llvm::ByteSwap_32(header.cputype);
4159338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        header.cpusubtype   = llvm::ByteSwap_32(header.cpusubtype);
4169338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        header.filetype     = llvm::ByteSwap_32(header.filetype);
4179338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        header.ncmds        = llvm::ByteSwap_32(header.ncmds);
4189338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        header.sizeofcmds   = llvm::ByteSwap_32(header.sizeofcmds);
4199338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        header.flags        = llvm::ByteSwap_32(header.flags);
4209338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    }
4219338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
4229338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    // A kernel is an executable which does not have the dynamic link object flag set.
4239338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    if (header.filetype == llvm::MachO::HeaderFileTypeExecutable
4249338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        && (header.flags & llvm::MachO::HeaderFlagBitIsDynamicLinkObject) == 0)
4259338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    {
4269338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        // Create a full module to get the UUID
4272ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton        ModuleSP memory_module_sp = process->ReadModuleFromMemory (FileSpec ("temp_mach_kernel", false), addr);
4289338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        if (!memory_module_sp.get())
4299338dd571e7781a89724d79e1f54385c282d0316Jason Molenda            return UUID();
4309338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
4319338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        ObjectFile *exe_objfile = memory_module_sp->GetObjectFile();
4329338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        if (exe_objfile == NULL)
4339338dd571e7781a89724d79e1f54385c282d0316Jason Molenda            return UUID();
4349338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
4359338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        if (exe_objfile->GetType() == ObjectFile::eTypeExecutable && exe_objfile->GetStrata() == ObjectFile::eStrataKernel)
4369338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        {
4379338dd571e7781a89724d79e1f54385c282d0316Jason Molenda            return memory_module_sp->GetUUID();
4389338dd571e7781a89724d79e1f54385c282d0316Jason Molenda        }
4399338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    }
4409338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
4419338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    return UUID();
4429338dd571e7781a89724d79e1f54385c282d0316Jason Molenda}
4439338dd571e7781a89724d79e1f54385c282d0316Jason Molenda
4449338dd571e7781a89724d79e1f54385c282d0316Jason Molenda//----------------------------------------------------------------------
445bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Constructor
446bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
4479338dd571e7781a89724d79e1f54385c282d0316Jason MolendaDynamicLoaderDarwinKernel::DynamicLoaderDarwinKernel (Process* process, lldb::addr_t kernel_addr) :
448bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    DynamicLoader(process),
4499338dd571e7781a89724d79e1f54385c282d0316Jason Molenda    m_kernel_load_address (kernel_addr),
450bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    m_kernel(),
4517dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton    m_kext_summary_header_ptr_addr (),
4528c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton    m_kext_summary_header_addr (),
453bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    m_kext_summary_header (),
45432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    m_known_kexts (),
45597c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar    m_mutex(Mutex::eMutexTypeRecursive),
45697c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar    m_break_id (LLDB_INVALID_BREAK_ID)
457bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
458e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda    PlatformSP platform_sp(Platform::FindPlugin (process, "darwin-kernel"));
459e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda    // Only select the darwin-kernel Platform if we've been asked to load kexts.
460e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda    // It can take some time to scan over all of the kext info.plists and that
461e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda    // shouldn't be done if kext loading is explicitly disabled.
462e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda    if (platform_sp.get() && GetGlobalProperties()->GetLoadKexts())
463e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda    {
464e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda        process->GetTarget().SetPlatform (platform_sp);
465e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda    }
466bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
467bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
468bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
469bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Destructor
470bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
47117f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::~DynamicLoaderDarwinKernel()
472bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
473bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    Clear(true);
474bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
475bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
476645facaf9c247b20f0f135445d437181688711a7Greg Claytonvoid
47717f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::UpdateIfNeeded()
478645facaf9c247b20f0f135445d437181688711a7Greg Clayton{
479645facaf9c247b20f0f135445d437181688711a7Greg Clayton    LoadKernelModuleIfNeeded();
480645facaf9c247b20f0f135445d437181688711a7Greg Clayton    SetNotificationBreakpointIfNeeded ();
481645facaf9c247b20f0f135445d437181688711a7Greg Clayton}
482bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------
483bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// Called after attaching a process.
484bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton///
485bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// Allow DynamicLoader plug-ins to execute some code after
486bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// attaching to a process.
487bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------
488bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid
48917f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::DidAttach ()
490bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
491bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    PrivateInitialize(m_process);
492645facaf9c247b20f0f135445d437181688711a7Greg Clayton    UpdateIfNeeded();
493bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
494bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
495bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------
496bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// Called after attaching a process.
497bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton///
498bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// Allow DynamicLoader plug-ins to execute some code after
499bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton/// attaching to a process.
500bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------
501bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid
50217f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::DidLaunch ()
503bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
504bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    PrivateInitialize(m_process);
505645facaf9c247b20f0f135445d437181688711a7Greg Clayton    UpdateIfNeeded();
506bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
507bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
508bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
509bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
510bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Clear out the state of this class.
511bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
512bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid
51317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::Clear (bool clear_process)
514bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
515bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    Mutex::Locker locker(m_mutex);
516bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
517bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    if (m_process->IsAlive() && LLDB_BREAK_ID_IS_VALID(m_break_id))
518bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        m_process->ClearBreakpointSiteByID(m_break_id);
519bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
520bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    if (clear_process)
521bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        m_process = NULL;
52232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    m_kernel.Clear();
52332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    m_known_kexts.clear();
5247dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton    m_kext_summary_header_ptr_addr.Clear();
5258c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton    m_kext_summary_header_addr.Clear();
526bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    m_break_id = LLDB_INVALID_BREAK_ID;
527bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
528bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
529bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
530bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool
53132a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::LoadImageAtFileAddress (Process *process)
532aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton{
533aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton    if (IsLoaded())
534aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton        return true;
535aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton
53632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (m_module_sp)
537aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton    {
538aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton        bool changed = false;
53932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        if (m_module_sp->SetLoadAddress (process->GetTarget(), 0, changed))
54032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            m_load_process_stop_id = process->GetStopID();
541aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton    }
542aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton    return false;
543aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton}
544aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton
54532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendavoid
54632a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::SetModule (ModuleSP module_sp)
54732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{
54832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    m_module_sp = module_sp;
54932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (module_sp.get() && module_sp->GetObjectFile())
55032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    {
55132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        if (module_sp->GetObjectFile()->GetType() == ObjectFile::eTypeExecutable
55232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            && module_sp->GetObjectFile()->GetStrata() == ObjectFile::eStrataKernel)
55332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        {
55432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            m_kernel_image = true;
55532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        }
55632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        else
55732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        {
55832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            m_kernel_image = false;
55932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        }
56032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    }
56132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda}
56232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
56332a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaModuleSP
56432a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::GetModule ()
56532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{
56632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    return m_module_sp;
56732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda}
56832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
56932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendavoid
57032a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::SetLoadAddress (addr_t load_addr)
57132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{
57232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    m_load_address = load_addr;
57332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda}
57432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
57532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendaaddr_t
57632a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::GetLoadAddress () const
57732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{
57832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    return m_load_address;
57932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda}
58032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
58132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendauint64_t
58232a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::GetSize () const
58332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{
58432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    return m_size;
58532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda}
58632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
58732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendavoid
58832a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::SetSize (uint64_t size)
58932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{
59032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    m_size = size;
59132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda}
59232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
59332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendauint32_t
59432a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::GetProcessStopId () const
59532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{
59632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    return m_load_process_stop_id;
59732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda}
59832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
59932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendavoid
60032a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::SetProcessStopId (uint32_t stop_id)
60132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{
60232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    m_load_process_stop_id = stop_id;
60332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda}
60432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
605aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Claytonbool
60632a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::operator== (const KextImageInfo &rhs)
607bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
60832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (m_uuid.IsValid() || rhs.GetUUID().IsValid())
60932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    {
61032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        if (m_uuid == rhs.GetUUID())
61132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        {
61232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            return true;
61332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        }
61432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        return false;
61532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    }
61632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
61732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (m_name == rhs.GetName() && m_load_address == rhs.GetLoadAddress())
6189ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return true;
619bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
62032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    return false;
62132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda}
622bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
62332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendavoid
62432a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::SetName (const char *name)
62532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{
62632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    m_name = name;
62732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda}
628127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda
62932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendastd::string
63032a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::GetName () const
63132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{
63232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    return m_name;
63332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda}
63432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
63532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendavoid
63632a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::SetUUID (const UUID &uuid)
63732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{
63832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    m_uuid = uuid;
63932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda}
64032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
64132a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaUUID
64232a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::GetUUID () const
64332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{
64432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    return m_uuid;
64532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda}
64632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
64732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda// Given the m_load_address from the kext summaries, and a UUID, try to create an in-memory
64832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda// Module at that address.  Require that the MemoryModule have a matching UUID and detect
64932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda// if this MemoryModule is a kernel or a kext.
65032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda//
65132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda// Returns true if m_memory_module_sp is now set to a valid Module.
65232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
65332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendabool
65432a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::ReadMemoryModule (Process *process)
65532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{
65632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (m_memory_module_sp.get() != NULL)
65732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        return true;
65832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (m_load_address == LLDB_INVALID_ADDRESS)
659127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda        return false;
66032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
66132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    FileSpec file_spec;
66232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    file_spec.SetFile (m_name.c_str(), false);
66332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
66432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    ModuleSP memory_module_sp = process->ReadModuleFromMemory (file_spec, m_load_address);
66532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
66632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (memory_module_sp.get() == NULL)
66732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        return false;
66832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
66932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    bool is_kernel = false;
67032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (memory_module_sp->GetObjectFile())
67132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    {
67232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        if (memory_module_sp->GetObjectFile()->GetType() == ObjectFile::eTypeExecutable
67332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            && memory_module_sp->GetObjectFile()->GetStrata() == ObjectFile::eStrataKernel)
67432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        {
67532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            is_kernel = true;
67632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        }
67732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        else if (memory_module_sp->GetObjectFile()->GetType() == ObjectFile::eTypeSharedLibrary)
67832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        {
67932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            is_kernel = false;
68032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        }
681127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda    }
682127291c8222625f1c8e31dfbb41c95103251ff56Jason Molenda
6836699c6eed148916de6a101ef1da8a859628fda63Jason Molenda    // If this is a kext, and the kernel specified what UUID we should find at this
6846699c6eed148916de6a101ef1da8a859628fda63Jason Molenda    // load address, require that the memory module have a matching UUID or something
6856699c6eed148916de6a101ef1da8a859628fda63Jason Molenda    // has gone wrong and we should discard it.
68632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (m_uuid.IsValid())
687bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
68832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        if (m_uuid != memory_module_sp->GetUUID())
689bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        {
69032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            return false;
691bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        }
69232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    }
69332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
69432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    // If the in-memory Module has a UUID, let's use that.
69532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (!m_uuid.IsValid() && memory_module_sp->GetUUID().IsValid())
69632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    {
69732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        m_uuid = memory_module_sp->GetUUID();
69832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    }
69932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
70032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    m_memory_module_sp = memory_module_sp;
70132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    m_kernel_image = is_kernel;
70232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (is_kernel)
70332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    {
7046699c6eed148916de6a101ef1da8a859628fda63Jason Molenda        if (memory_module_sp->GetArchitecture().IsValid())
7054952db8c76f619e3d8a0cf13456097128009d67bJason Molenda        {
70632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            process->GetTarget().SetArchitecture(memory_module_sp->GetArchitecture());
7074952db8c76f619e3d8a0cf13456097128009d67bJason Molenda        }
7086699c6eed148916de6a101ef1da8a859628fda63Jason Molenda        if (m_uuid.IsValid())
7096699c6eed148916de6a101ef1da8a859628fda63Jason Molenda        {
7106699c6eed148916de6a101ef1da8a859628fda63Jason Molenda            Module* exe_module = process->GetTarget().GetExecutableModulePointer();
7116699c6eed148916de6a101ef1da8a859628fda63Jason Molenda            if (exe_module && exe_module->GetUUID().IsValid())
7126699c6eed148916de6a101ef1da8a859628fda63Jason Molenda            {
7136699c6eed148916de6a101ef1da8a859628fda63Jason Molenda                if (m_uuid != exe_module->GetUUID())
7146699c6eed148916de6a101ef1da8a859628fda63Jason Molenda                {
7156699c6eed148916de6a101ef1da8a859628fda63Jason Molenda                    Stream *s = &process->GetTarget().GetDebugger().GetOutputStream();
7166699c6eed148916de6a101ef1da8a859628fda63Jason Molenda                    if (s)
7176699c6eed148916de6a101ef1da8a859628fda63Jason Molenda                    {
7186699c6eed148916de6a101ef1da8a859628fda63Jason Molenda                        char memory_module_uuidbuf[64];
7196699c6eed148916de6a101ef1da8a859628fda63Jason Molenda                        char exe_module_uuidbuf[64];
7206699c6eed148916de6a101ef1da8a859628fda63Jason Molenda                        s->Printf ("warning: Host-side kernel file has Mach-O UUID of %s but remote kernel has a UUID of %s -- a mismatched kernel file will result in a poor debugger experience.\n",
7216699c6eed148916de6a101ef1da8a859628fda63Jason Molenda                                   exe_module->GetUUID().GetAsCString(exe_module_uuidbuf, sizeof (exe_module_uuidbuf)),
7226699c6eed148916de6a101ef1da8a859628fda63Jason Molenda                                   m_uuid.GetAsCString(memory_module_uuidbuf, sizeof (memory_module_uuidbuf)));
7236699c6eed148916de6a101ef1da8a859628fda63Jason Molenda                        s->Flush ();
7246699c6eed148916de6a101ef1da8a859628fda63Jason Molenda                    }
7256699c6eed148916de6a101ef1da8a859628fda63Jason Molenda                }
7266699c6eed148916de6a101ef1da8a859628fda63Jason Molenda            }
7276699c6eed148916de6a101ef1da8a859628fda63Jason Molenda        }
728bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
729bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
73032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    return true;
73132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda}
73232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
73332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendabool
73432a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::IsKernel () const
73532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{
73632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    return m_kernel_image == true;
73732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda}
73832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
73932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendavoid
74032a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::SetIsKernel (bool is_kernel)
74132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{
74232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    m_kernel_image = is_kernel;
74332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda}
74432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
74532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molendabool
74632a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::LoadImageUsingMemoryModule (Process *process)
74732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda{
74832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (IsLoaded())
74932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        return true;
75032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
75132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
75232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    Target &target = process->GetTarget();
75332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
75432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    // If we don't have / can't create a memory module for this kext, don't try to load it - we won't
75532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    // have the correct segment load addresses.
75632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (!ReadMemoryModule (process))
75732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    {
75832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        return false;
75932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    }
76032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
76132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    bool uuid_is_valid = m_uuid.IsValid();
76232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
7630d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda    if (IsKernel() && uuid_is_valid && m_memory_module_sp.get())
7640d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda    {
7650d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda        Stream *s = &target.GetDebugger().GetOutputStream();
7660d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda        if (s)
7670d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda        {
7680d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda            char uuidbuf[64];
7690d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda            s->Printf ("Kernel UUID: %s\n", m_memory_module_sp->GetUUID().GetAsCString(uuidbuf, sizeof (uuidbuf)));
7700d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda            s->Printf ("Load Address: 0x%" PRIx64 "\n", m_load_address);
7710d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda        }
7720d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda    }
7730d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda
77432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (!m_module_sp)
775bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
77632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        // See if the kext has already been loaded into the target, probably by the user doing target modules add.
77732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        const ModuleList &target_images = target.GetImages();
77832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        m_module_sp = target_images.FindModule(m_uuid);
77932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
78032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        // Search for the kext on the local filesystem via the UUID
78132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        if (!m_module_sp && uuid_is_valid)
782bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        {
78332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            ModuleSpec module_spec;
78432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            module_spec.GetUUID() = m_uuid;
78532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            module_spec.GetArchitecture() = target.GetArchitecture();
786d6b8122cee3dd02255bf50a7d019f17dfeba463aJason Molenda
7872c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda            // For the kernel, we really do need an on-disk file copy of the binary to do anything useful.
7882c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda            // This will force a clal to
78932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            if (IsKernel())
790444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            {
7912c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda                if (Symbols::DownloadObjectAndSymbolFile (module_spec, true))
792d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                {
7932c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda                    if (module_spec.GetFileSpec().Exists())
794d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    {
7952c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda                        m_module_sp.reset(new Module (module_spec.GetFileSpec(), target.GetArchitecture()));
7962c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda                        if (m_module_sp.get() && m_module_sp->MatchesModuleSpec (module_spec))
7972c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda                        {
7982c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda                            ModuleList loaded_module_list;
7992c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda                            loaded_module_list.Append (m_module_sp);
8002c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda                            target.ModulesDidLoad (loaded_module_list);
8012c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda                        }
802d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    }
803d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                }
80432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            }
8052c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda
806e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda            // If the current platform is PlatformDarwinKernel, create a ModuleSpec with the filename set
807e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda            // to be the bundle ID for this kext, e.g. "com.apple.filesystems.msdosfs", and ask the platform
808e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda            // to find it.
809e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda            PlatformSP platform_sp (target.GetPlatform());
810e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda            if (platform_sp)
811e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda            {
812e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda                const char *pname = platform_sp->GetShortPluginName();
813e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda                if (pname && strcmp (pname, "darwin-kernel") == 0)
814e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda                {
815e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda                    ModuleSpec kext_bundle_module_spec(module_spec);
816e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda                    FileSpec kext_filespec(m_name.c_str(), false);
817e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda                    kext_bundle_module_spec.GetFileSpec() = kext_filespec;
818e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda                    platform_sp->GetSharedModule (kext_bundle_module_spec, m_module_sp, &target.GetExecutableSearchPaths(), NULL, NULL);
819e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda                }
820e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda            }
821e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda
8222c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda            // Ask the Target to find this file on the local system, if possible.
82332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            // This will search in the list of currently-loaded files, look in the
82432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            // standard search paths on the system, and on a Mac it will try calling
82532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            // the DebugSymbols framework with the UUID to find the binary via its
82632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            // search methods.
82732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            if (!m_module_sp)
82832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            {
82932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                m_module_sp = target.GetSharedModule (module_spec);
83032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            }
8310d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda
8322c529b11da5cf25be2859851fa231f6cd8788f66Jason Molenda            if (IsKernel() && !m_module_sp)
8330d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda            {
8340d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda                Stream *s = &target.GetDebugger().GetOutputStream();
8350d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda                if (s)
8360d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda                {
837b5229b189ca5a589b4d634271cfc0f83610b8030Jason Molenda                    s->Printf ("WARNING: Unable to locate kernel binary on the debugger system.\n");
8380d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda                }
8390d31111076a6048a83093ee98b219bdba05c0f16Jason Molenda            }
84032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        }
84132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
84232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        // If we managed to find a module, append it to the target's list of images.
84332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        // If we also have a memory module, require that they have matching UUIDs
84432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        if (m_module_sp)
84532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        {
84632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            bool uuid_match_ok = true;
84732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            if (m_memory_module_sp)
84832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            {
84932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                if (m_module_sp->GetUUID() != m_memory_module_sp->GetUUID())
850d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                {
85132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                    uuid_match_ok = false;
852d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                }
85332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            }
85432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            if (uuid_match_ok)
85532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            {
856d79d625a522afdbdd127924a10d3db7e71395cacJason Molenda                target.GetImages().AppendIfNeeded(m_module_sp);
85732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                if (IsKernel() && target.GetExecutableModulePointer() != m_module_sp.get())
8585fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda                {
85932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                    target.SetExecutableModule (m_module_sp, false);
8605fdfc6db0f03ed4dc45b54f1d65c8e7db4135c18Jason Molenda                }
861444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            }
862bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        }
863bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
8649ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
865fcd9bf14828ec4e4d2a69671eff05f0b824e46b3Jason Molenda    if (!m_module_sp && !IsKernel() && m_uuid.IsValid() && !m_name.empty())
866fcd9bf14828ec4e4d2a69671eff05f0b824e46b3Jason Molenda    {
867fcd9bf14828ec4e4d2a69671eff05f0b824e46b3Jason Molenda        Stream *s = &target.GetDebugger().GetOutputStream();
868fcd9bf14828ec4e4d2a69671eff05f0b824e46b3Jason Molenda        if (s)
869fcd9bf14828ec4e4d2a69671eff05f0b824e46b3Jason Molenda        {
870fcd9bf14828ec4e4d2a69671eff05f0b824e46b3Jason Molenda            char uuidbuf[64];
871fcd9bf14828ec4e4d2a69671eff05f0b824e46b3Jason Molenda            s->Printf ("warning: Can't find binary/dSYM for %s (%s)\n",
872fcd9bf14828ec4e4d2a69671eff05f0b824e46b3Jason Molenda                       m_name.c_str(), m_uuid.GetAsCString(uuidbuf, sizeof (uuidbuf)));
873fcd9bf14828ec4e4d2a69671eff05f0b824e46b3Jason Molenda        }
874fcd9bf14828ec4e4d2a69671eff05f0b824e46b3Jason Molenda    }
875bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
876a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton    static ConstString g_section_name_LINKEDIT ("__LINKEDIT");
877a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton
87832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (m_memory_module_sp && m_module_sp)
879bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
88032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        if (m_module_sp->GetUUID() == m_memory_module_sp->GetUUID())
881bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        {
88232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            ObjectFile *ondisk_object_file = m_module_sp->GetObjectFile();
88332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            ObjectFile *memory_object_file = m_memory_module_sp->GetObjectFile();
884a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton
885d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda            if (memory_object_file && ondisk_object_file)
886d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda            {
88732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                // The memory_module for kexts may have an invalid __LINKEDIT seg; skip it.
88832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                const bool ignore_linkedit = !IsKernel ();
889a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton
890d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                SectionList *ondisk_section_list = ondisk_object_file->GetSectionList ();
891d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                SectionList *memory_section_list = memory_object_file->GetSectionList ();
892d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                if (memory_section_list && ondisk_section_list)
893bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                {
894d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    const uint32_t num_ondisk_sections = ondisk_section_list->GetSize();
895d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    // There may be CTF sections in the memory image so we can't
896d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    // always just compare the number of sections (which are actually
897d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    // segments in mach-o parlance)
898d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    uint32_t sect_idx = 0;
899d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda
900d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    // Use the memory_module's addresses for each section to set the
901d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    // file module's load address as appropriate.  We don't want to use
902d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    // a single slide value for the entire kext - different segments may
903d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    // be slid different amounts by the kext loader.
904d6b8122cee3dd02255bf50a7d019f17dfeba463aJason Molenda
905d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    uint32_t num_sections_loaded = 0;
906d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    for (sect_idx=0; sect_idx<num_ondisk_sections; ++sect_idx)
907d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    {
908d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                        SectionSP ondisk_section_sp(ondisk_section_list->GetSectionAtIndex(sect_idx));
909d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                        if (ondisk_section_sp)
910bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                        {
911a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton                            // Don't ever load __LINKEDIT as it may or may not be actually
912a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton                            // mapped into memory and there is no current way to tell.
913a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton                            // I filed rdar://problem/12851706 to track being able to tell
914a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton                            // if the __LINKEDIT is actually mapped, but until then, we need
915a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton                            // to not load the __LINKEDIT
916a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton                            if (ignore_linkedit && ondisk_section_sp->GetName() == g_section_name_LINKEDIT)
917a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton                                continue;
918a4d860f139342acaf6a1c7a3f7ab5683b023c3baGreg Clayton
919d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                            const Section *memory_section = memory_section_list->FindSectionByName(ondisk_section_sp->GetName()).get();
920d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                            if (memory_section)
9210fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                            {
922d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                                target.GetSectionLoadList().SetSectionLoadAddress (ondisk_section_sp, memory_section->GetFileAddress());
923d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                                ++num_sections_loaded;
9240fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                            }
9250fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                        }
926bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                    }
927d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda                    if (num_sections_loaded > 0)
92832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                        m_load_process_stop_id = process->GetStopID();
9299ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    else
93032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                        m_module_sp.reset(); // No sections were loaded
931bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                }
9329ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                else
93332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                    m_module_sp.reset(); // One or both section lists
934bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            }
9359ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            else
93632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                m_module_sp.reset(); // One or both object files missing
937bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        }
938d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda        else
93932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            m_module_sp.reset(); // UUID mismatch
940bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
941d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda
9429ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    bool is_loaded = IsLoaded();
9439ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
94432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (is_loaded && m_module_sp && IsKernel())
9454952db8c76f619e3d8a0cf13456097128009d67bJason Molenda    {
9464952db8c76f619e3d8a0cf13456097128009d67bJason Molenda        Stream *s = &target.GetDebugger().GetOutputStream();
9474952db8c76f619e3d8a0cf13456097128009d67bJason Molenda        if (s)
9484952db8c76f619e3d8a0cf13456097128009d67bJason Molenda        {
94988f7e75c5d40b109e33fc0df08fa51a48d70e450Jason Molenda            ObjectFile *kernel_object_file = m_module_sp->GetObjectFile();
95088f7e75c5d40b109e33fc0df08fa51a48d70e450Jason Molenda            if (kernel_object_file)
95188f7e75c5d40b109e33fc0df08fa51a48d70e450Jason Molenda            {
95288f7e75c5d40b109e33fc0df08fa51a48d70e450Jason Molenda                addr_t file_address = kernel_object_file->GetHeaderAddress().GetFileAddress();
95388f7e75c5d40b109e33fc0df08fa51a48d70e450Jason Molenda                if (m_load_address != LLDB_INVALID_ADDRESS && file_address != LLDB_INVALID_ADDRESS)
95488f7e75c5d40b109e33fc0df08fa51a48d70e450Jason Molenda                {
955e5bc8c178390c217a91509e9f1db48cabbd11e33Matt Kopec                    s->Printf ("Kernel slid 0x%" PRIx64 " in memory.\n", m_load_address - file_address);
95688f7e75c5d40b109e33fc0df08fa51a48d70e450Jason Molenda                }
95788f7e75c5d40b109e33fc0df08fa51a48d70e450Jason Molenda            }
95863e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda            {
95997a19b21dacd9063bb5475812df7781777262198Greg Clayton                s->Printf ("Loaded kernel file %s\n",
96097a19b21dacd9063bb5475812df7781777262198Greg Clayton                           m_module_sp->GetFileSpec().GetPath().c_str());
96163e5cf65c43615da20b272fde2a21ffd4fa6eb29Jason Molenda            }
9624952db8c76f619e3d8a0cf13456097128009d67bJason Molenda            s->Flush ();
9634952db8c76f619e3d8a0cf13456097128009d67bJason Molenda        }
9644952db8c76f619e3d8a0cf13456097128009d67bJason Molenda    }
9659ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    return is_loaded;
966bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
967bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
96849ce8969d3154e1560106cfe530444c09410f217Greg Claytonuint32_t
96932a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::GetAddressByteSize ()
97049ce8969d3154e1560106cfe530444c09410f217Greg Clayton{
97132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (m_memory_module_sp)
97232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        return m_memory_module_sp->GetArchitecture().GetAddressByteSize();
97332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (m_module_sp)
97432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        return m_module_sp->GetArchitecture().GetAddressByteSize();
97549ce8969d3154e1560106cfe530444c09410f217Greg Clayton    return 0;
97649ce8969d3154e1560106cfe530444c09410f217Greg Clayton}
97749ce8969d3154e1560106cfe530444c09410f217Greg Clayton
97849ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb::ByteOrder
97932a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::GetByteOrder()
98049ce8969d3154e1560106cfe530444c09410f217Greg Clayton{
98132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (m_memory_module_sp)
98232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        return m_memory_module_sp->GetArchitecture().GetByteOrder();
98332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (m_module_sp)
98432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        return m_module_sp->GetArchitecture().GetByteOrder();
98549ce8969d3154e1560106cfe530444c09410f217Greg Clayton    return lldb::endian::InlHostByteOrder();
98649ce8969d3154e1560106cfe530444c09410f217Greg Clayton}
98749ce8969d3154e1560106cfe530444c09410f217Greg Clayton
98849ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb_private::ArchSpec
98932a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::GetArchitecture () const
99049ce8969d3154e1560106cfe530444c09410f217Greg Clayton{
99132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (m_memory_module_sp)
99232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        return m_memory_module_sp->GetArchitecture();
99332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (m_module_sp)
99432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        return m_module_sp->GetArchitecture();
99549ce8969d3154e1560106cfe530444c09410f217Greg Clayton    return lldb_private::ArchSpec ();
99649ce8969d3154e1560106cfe530444c09410f217Greg Clayton}
99749ce8969d3154e1560106cfe530444c09410f217Greg Clayton
99849ce8969d3154e1560106cfe530444c09410f217Greg Clayton
999bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
10009ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// Load the kernel module and initialize the "m_kernel" member. Return
10019ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// true _only_ if the kernel is loaded the first time through (subsequent
10029ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// calls to this function should return false after the kernel has been
10039ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// already loaded).
1004bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
10059ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonvoid
10069ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonDynamicLoaderDarwinKernel::LoadKernelModuleIfNeeded()
1007bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
10089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (!m_kext_summary_header_ptr_addr.IsValid())
1009bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
101032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        m_kernel.Clear();
101132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        m_kernel.SetModule (m_process->GetTarget().GetExecutableModule());
101232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        m_kernel.SetIsKernel(true);
1013fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda
1014fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda        ConstString kernel_name("mach_kernel");
101532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        if (m_kernel.GetModule().get()
101632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            && m_kernel.GetModule()->GetObjectFile()
101732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            && !m_kernel.GetModule()->GetObjectFile()->GetFileSpec().GetFilename().IsEmpty())
1018fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda        {
101932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            kernel_name = m_kernel.GetModule()->GetObjectFile()->GetFileSpec().GetFilename();
1020fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda        }
102132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        m_kernel.SetName (kernel_name.AsCString());
1022fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda
102332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        if (m_kernel.GetLoadAddress() == LLDB_INVALID_ADDRESS)
1024bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        {
102532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            m_kernel.SetLoadAddress(m_kernel_load_address);
102632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            if (m_kernel.GetLoadAddress() == LLDB_INVALID_ADDRESS && m_kernel.GetModule())
1027bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            {
10289ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                // We didn't get a hint from the process, so we will
10299ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                // try the kernel at the address that it exists at in
10309ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                // the file if we have one
103132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                ObjectFile *kernel_object_file = m_kernel.GetModule()->GetObjectFile();
10329ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                if (kernel_object_file)
1033fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                {
1034fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                    addr_t load_address = kernel_object_file->GetHeaderAddress().GetLoadAddress(&m_process->GetTarget());
1035fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                    addr_t file_address = kernel_object_file->GetHeaderAddress().GetFileAddress();
1036fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                    if (load_address != LLDB_INVALID_ADDRESS && load_address != 0)
1037fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                    {
103832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                        m_kernel.SetLoadAddress (load_address);
1039fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                        if (load_address != file_address)
1040fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                        {
1041fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                            // Don't accidentally relocate the kernel to the File address --
1042fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                            // the Load address has already been set to its actual in-memory address.
1043fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                            // Mark it as IsLoaded.
104432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                            m_kernel.SetProcessStopId (m_process->GetStopID());
1045fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                        }
1046fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                    }
1047fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                    else
1048fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                    {
104932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                        m_kernel.SetLoadAddress(file_address);
1050fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                    }
1051fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda                }
1052bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            }
1053bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        }
10549ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
105532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        if (m_kernel.GetLoadAddress() != LLDB_INVALID_ADDRESS)
1056aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton        {
1057aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton            if (!m_kernel.LoadImageUsingMemoryModule (m_process))
1058aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton            {
1059aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton                m_kernel.LoadImageAtFileAddress (m_process);
1060aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton            }
1061aa2063089f2397bd21cff2dab2e7c316ae5ff12cGreg Clayton        }
10629ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
106332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        if (m_kernel.IsLoaded() && m_kernel.GetModule())
10649ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        {
10659ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            static ConstString kext_summary_symbol ("gLoadedKextSummaries");
106632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            const Symbol *symbol = m_kernel.GetModule()->FindFirstSymbolWithNameAndType (kext_summary_symbol, eSymbolTypeData);
10679ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            if (symbol)
10689ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            {
10690c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton                m_kext_summary_header_ptr_addr = symbol->GetAddress();
10709ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                // Update all image infos
10719ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                ReadAllKextSummaries ();
10729ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            }
10739ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        }
10749ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        else
10759ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        {
107632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            m_kernel.Clear();
10779ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        }
1078bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
1079bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
1080bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1081bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
1082bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Static callback function that gets called when our DYLD notification
1083bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// breakpoint gets hit. We update all of our image infos and then
1084bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// let our super class DynamicLoader class decide if we should stop
1085bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// or not (based on global preference).
1086bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
1087bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool
108817f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::BreakpointHitCallback (void *baton,
1089645facaf9c247b20f0f135445d437181688711a7Greg Clayton                                                  StoppointCallbackContext *context,
1090645facaf9c247b20f0f135445d437181688711a7Greg Clayton                                                  user_id_t break_id,
1091645facaf9c247b20f0f135445d437181688711a7Greg Clayton                                                  user_id_t break_loc_id)
10928c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton{
109317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton    return static_cast<DynamicLoaderDarwinKernel*>(baton)->BreakpointHit (context, break_id, break_loc_id);
1094bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
1095bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1096bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool
109717f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::BreakpointHit (StoppointCallbackContext *context,
1098645facaf9c247b20f0f135445d437181688711a7Greg Clayton                                          user_id_t break_id,
1099645facaf9c247b20f0f135445d437181688711a7Greg Clayton                                          user_id_t break_loc_id)
1100645facaf9c247b20f0f135445d437181688711a7Greg Clayton{
1101952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER));
11027dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton    if (log)
110317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton        log->Printf ("DynamicLoaderDarwinKernel::BreakpointHit (...)\n");
11047dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton
1105645facaf9c247b20f0f135445d437181688711a7Greg Clayton    ReadAllKextSummaries ();
11067dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton
11077dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton    if (log)
1108952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton        PutToLog(log);
11097dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton
1110645facaf9c247b20f0f135445d437181688711a7Greg Clayton    return GetStopWhenImagesChange();
1111645facaf9c247b20f0f135445d437181688711a7Greg Clayton}
1112645facaf9c247b20f0f135445d437181688711a7Greg Clayton
1113645facaf9c247b20f0f135445d437181688711a7Greg Clayton
1114645facaf9c247b20f0f135445d437181688711a7Greg Claytonbool
111517f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::ReadKextSummaryHeader ()
1116bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
1117bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    Mutex::Locker locker(m_mutex);
1118bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1119bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    // the all image infos is already valid for this process stop ID
1120bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
11217dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton    if (m_kext_summary_header_ptr_addr.IsValid())
1122bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
1123bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        const uint32_t addr_size = m_kernel.GetAddressByteSize ();
1124bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        const ByteOrder byte_order = m_kernel.GetByteOrder();
1125bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        Error error;
1126bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        // Read enough bytes for a "OSKextLoadedKextSummaryHeader" structure
1127bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        // which is currenty 4 uint32_t and a pointer.
1128bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        uint8_t buf[24];
1129bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        DataExtractor data (buf, sizeof(buf), byte_order, addr_size);
1130bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        const size_t count = 4 * sizeof(uint32_t) + addr_size;
11318c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton        const bool prefer_file_cache = false;
11327dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton        if (m_process->GetTarget().ReadPointerFromMemory (m_kext_summary_header_ptr_addr,
11337dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton                                                          prefer_file_cache,
11347dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton                                                          error,
11357dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton                                                          m_kext_summary_header_addr))
1136bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        {
11377dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton            // We got a valid address for our kext summary header and make sure it isn't NULL
11387dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton            if (m_kext_summary_header_addr.IsValid() &&
11397dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton                m_kext_summary_header_addr.GetFileAddress() != 0)
11407dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton            {
11417dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton                const size_t bytes_read = m_process->GetTarget().ReadMemory (m_kext_summary_header_addr, prefer_file_cache, buf, count, error);
11427dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton                if (bytes_read == count)
11437dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton                {
114436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                    lldb::offset_t offset = 0;
11450fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                    m_kext_summary_header.version = data.GetU32(&offset);
11460fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                    if (m_kext_summary_header.version >= 2)
11470fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                    {
11480fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                        m_kext_summary_header.entry_size = data.GetU32(&offset);
11490fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                    }
11500fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                    else
11510fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                    {
11520fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                        // Versions less than 2 didn't have an entry size, it was hard coded
11530fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                        m_kext_summary_header.entry_size = KERNEL_MODULE_ENTRY_SIZE_VERSION_1;
11540fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                    }
11550fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                    m_kext_summary_header.entry_count = data.GetU32(&offset);
11567dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton                    return true;
11577dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton                }
11587dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton            }
1159bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        }
1160bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
11617dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton    m_kext_summary_header_addr.Clear();
1162bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    return false;
1163bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
1164bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
116532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda// We've either (a) just attached to a new kernel, or (b) the kexts-changed breakpoint was hit
116632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda// and we need to figure out what kexts have been added or removed.
116732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda// Read the kext summaries from the inferior kernel memory, compare them against the
116832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda// m_known_kexts vector and update the m_known_kexts vector as needed to keep in sync with the
116932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda// inferior.
1170bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1171bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool
117232a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::ParseKextSummaries (const Address &kext_summary_addr, uint32_t count)
1173bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
117432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    KextImageInfo::collection kext_summaries;
1175952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER));
1176bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    if (log)
117732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        log->Printf ("Kexts-changed breakpoint hit, there are %d kexts currently.\n", count);
1178bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1179bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    Mutex::Locker locker(m_mutex);
1180bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1181bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    if (!ReadKextSummaries (kext_summary_addr, count, kext_summaries))
1182bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        return false;
1183bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
11847cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda    // read the plugin.dynamic-loader.darwin-kernel.load-kexts setting -- if the user requested no
11857cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda    // kext loading, don't print any messages about kexts & don't try to read them.
11867cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda    const bool load_kexts = GetGlobalProperties()->GetLoadKexts();
11877cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda
118832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    // By default, all kexts we've loaded in the past are marked as "remove" and all of the kexts
118932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    // we just found out about from ReadKextSummaries are marked as "add".
119032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    std::vector<bool> to_be_removed(m_known_kexts.size(), true);
119132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    std::vector<bool> to_be_added(count, true);
119232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
119332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    int number_of_new_kexts_being_added = 0;
119432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    int number_of_old_kexts_being_removed = m_known_kexts.size();
119532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
119632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    const uint32_t new_kexts_size = kext_summaries.size();
119732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    const uint32_t old_kexts_size = m_known_kexts.size();
119832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
119932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    // The m_known_kexts vector may have entries that have been Cleared,
120032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    // or are a kernel.
120132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    for (uint32_t old_kext = 0; old_kext < old_kexts_size; old_kext++)
120232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    {
120332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        bool ignore = false;
120432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        KextImageInfo &image_info = m_known_kexts[old_kext];
120532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        if (image_info.IsKernel())
120632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        {
120732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            ignore = true;
120832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        }
120932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        else if (image_info.GetLoadAddress() == LLDB_INVALID_ADDRESS && !image_info.GetModule())
121032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        {
121132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            ignore = true;
121232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        }
121332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
121432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        if (ignore)
121532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        {
121632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            number_of_old_kexts_being_removed--;
121732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            to_be_removed[old_kext] = false;
121832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        }
121932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    }
122032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
122132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    // Scan over the list of kexts we just read from the kernel, note those that
122232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    // need to be added and those already loaded.
122332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    for (uint32_t new_kext = 0; new_kext < new_kexts_size; new_kext++)
122432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    {
122532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        bool add_this_one = true;
122632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        for (uint32_t old_kext = 0; old_kext < old_kexts_size; old_kext++)
122732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        {
122832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            if (m_known_kexts[old_kext] == kext_summaries[new_kext])
122932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            {
123032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                // We already have this kext, don't re-load it.
123132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                to_be_added[new_kext] = false;
123232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                // This kext is still present, do not remove it.
123332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                to_be_removed[old_kext] = false;
123432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
123532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                number_of_old_kexts_being_removed--;
123632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                add_this_one = false;
123732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                break;
123832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            }
123932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        }
124032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        if (add_this_one)
124132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        {
124232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            number_of_new_kexts_being_added++;
124332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        }
124432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    }
124532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
124632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (number_of_new_kexts_being_added == 0 && number_of_old_kexts_being_removed == 0)
124732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        return true;
124832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
1249234981a4559db084f9c90612660e40f19915b89cGreg Clayton    Stream *s = &m_process->GetTarget().GetDebugger().GetOutputStream();
12507cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda    if (s && load_kexts)
1251bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
125232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        if (number_of_new_kexts_being_added > 0 && number_of_old_kexts_being_removed > 0)
125332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        {
125432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            s->Printf ("Loading %d kext modules and unloading %d kext modules ", number_of_new_kexts_being_added, number_of_old_kexts_being_removed);
125532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        }
125632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        else if (number_of_new_kexts_being_added > 0)
125732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        {
125832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            s->Printf ("Loading %d kext modules ", number_of_new_kexts_being_added);
125932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        }
126032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        else if (number_of_old_kexts_being_removed > 0)
126132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        {
126232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            s->Printf ("Unloading %d kext modules ", number_of_old_kexts_being_removed);
126332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        }
126432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    }
12659ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
126632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (log)
12677cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda    {
12687cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda        if (load_kexts)
12697cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda        {
12707cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda            log->Printf ("DynamicLoaderDarwinKernel::ParseKextSummaries: %d kexts added, %d kexts removed", number_of_new_kexts_being_added, number_of_old_kexts_being_removed);
12717cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda        }
12727cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda        else
12737cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda        {
12747cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda            log->Printf ("DynamicLoaderDarwinKernel::ParseKextSummaries kext loading is disabled, else would have %d kexts added, %d kexts removed", number_of_new_kexts_being_added, number_of_old_kexts_being_removed);
12757cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda        }
12767cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda    }
12777cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda
12784952db8c76f619e3d8a0cf13456097128009d67bJason Molenda
127932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (number_of_new_kexts_being_added > 0)
128032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    {
128132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        ModuleList loaded_module_list;
128232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
128332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        const uint32_t num_of_new_kexts = kext_summaries.size();
128432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        for (uint32_t new_kext = 0; new_kext < num_of_new_kexts; new_kext++)
128532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        {
128632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            if (to_be_added[new_kext] == true)
128732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            {
128832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                KextImageInfo &image_info = kext_summaries[new_kext];
12897cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda                if (load_kexts)
12907cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda                {
12917cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda                    if (!image_info.LoadImageUsingMemoryModule (m_process))
12927cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda                    {
12937cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda                        image_info.LoadImageAtFileAddress (m_process);
12947cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda                    }
12957cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda                }
129632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
129732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                m_known_kexts.push_back(image_info);
129832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
129932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                if (image_info.GetModule() && m_process->GetStopID() == image_info.GetProcessStopId())
130032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                    loaded_module_list.AppendIfNeeded (image_info.GetModule());
130132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
13027cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda                if (s && load_kexts)
130332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                    s->Printf (".");
130432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
130532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                if (log)
1306952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton                    kext_summaries[new_kext].PutToLog (log);
130732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            }
130832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        }
130932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        m_process->GetTarget().ModulesDidLoad (loaded_module_list);
1310bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
131132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
131232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (number_of_old_kexts_being_removed > 0)
131332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    {
131432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        ModuleList loaded_module_list;
131532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        const uint32_t num_of_old_kexts = m_known_kexts.size();
131632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        for (uint32_t old_kext = 0; old_kext < num_of_old_kexts; old_kext++)
131732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        {
131832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            ModuleList unloaded_module_list;
131932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            if (to_be_removed[old_kext])
132032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            {
132132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                KextImageInfo &image_info = m_known_kexts[old_kext];
132232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                // You can't unload the kernel.
132332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                if (!image_info.IsKernel())
132432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                {
132532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                    if (image_info.GetModule())
132632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                    {
132732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                        unloaded_module_list.AppendIfNeeded (image_info.GetModule());
132832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                    }
132932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                    if (s)
133032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                        s->Printf (".");
133132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                    image_info.Clear();
133232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                    // should pull it out of the KextImageInfos vector but that would mutate the list and invalidate
133332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                    // the to_be_removed bool vector; leaving it in place once Cleared() is relatively harmless.
133432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                }
133532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            }
133632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            m_process->GetTarget().ModulesDidUnload (unloaded_module_list);
133732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        }
133832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    }
133932a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda
13407cb80c9728fa91a5b827ccb74592bf57ac6d4710Jason Molenda    if (s && load_kexts)
13414952db8c76f619e3d8a0cf13456097128009d67bJason Molenda    {
13424952db8c76f619e3d8a0cf13456097128009d67bJason Molenda        s->Printf (" done.\n");
13434952db8c76f619e3d8a0cf13456097128009d67bJason Molenda        s->Flush ();
13444952db8c76f619e3d8a0cf13456097128009d67bJason Molenda    }
13454952db8c76f619e3d8a0cf13456097128009d67bJason Molenda
134632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    return true;
1347bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
1348bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1349bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonuint32_t
135017f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::ReadKextSummaries (const Address &kext_summary_addr,
1351bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                                              uint32_t image_infos_count,
135232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                                              KextImageInfo::collection &image_infos)
1353bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
1354bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    const ByteOrder endian = m_kernel.GetByteOrder();
1355bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    const uint32_t addr_size = m_kernel.GetAddressByteSize();
1356bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1357bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    image_infos.resize(image_infos_count);
1358bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    const size_t count = image_infos.size() * m_kext_summary_header.entry_size;
1359bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    DataBufferHeap data(count, 0);
1360bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    Error error;
13617b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton
13628c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton    const bool prefer_file_cache = false;
13638c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton    const size_t bytes_read = m_process->GetTarget().ReadMemory (kext_summary_addr,
13648c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton                                                                 prefer_file_cache,
13658c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton                                                                 data.GetBytes(),
13668c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton                                                                 data.GetByteSize(),
13678c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton                                                                 error);
1368bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    if (bytes_read == count)
1369bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
13700fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton
1371bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        DataExtractor extractor (data.GetBytes(), data.GetByteSize(), endian, addr_size);
1372bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        uint32_t i=0;
13730fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton        for (uint32_t kext_summary_offset = 0;
13740fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton             i < image_infos.size() && extractor.ValidOffsetForDataOfSize(kext_summary_offset, m_kext_summary_header.entry_size);
13750fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton             ++i, kext_summary_offset += m_kext_summary_header.entry_size)
1376bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        {
137736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            lldb::offset_t offset = kext_summary_offset;
1378bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            const void *name_data = extractor.GetData(&offset, KERNEL_MODULE_MAX_NAME);
1379bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            if (name_data == NULL)
1380bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                break;
138132a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            image_infos[i].SetName ((const char *) name_data);
138232a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            UUID uuid (extractor.GetData (&offset, 16), 16);
138332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            image_infos[i].SetUUID (uuid);
138432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            image_infos[i].SetLoadAddress (extractor.GetU64(&offset));
138532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            image_infos[i].SetSize (extractor.GetU64(&offset));
1386bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        }
1387bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        if (i < image_infos.size())
1388bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            image_infos.resize(i);
1389bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
1390bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    else
1391bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
1392bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        image_infos.clear();
1393bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
1394bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    return image_infos.size();
1395bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
1396bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1397bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonbool
139817f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::ReadAllKextSummaries ()
1399bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
1400bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    Mutex::Locker locker(m_mutex);
1401645facaf9c247b20f0f135445d437181688711a7Greg Clayton
1402bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    if (ReadKextSummaryHeader ())
1403bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
1404645facaf9c247b20f0f135445d437181688711a7Greg Clayton        if (m_kext_summary_header.entry_count > 0 && m_kext_summary_header_addr.IsValid())
1405bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        {
14068c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton            Address summary_addr (m_kext_summary_header_addr);
14070fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton            summary_addr.Slide(m_kext_summary_header.GetSize());
14088c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton            if (!ParseKextSummaries (summary_addr, m_kext_summary_header.entry_count))
1409bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            {
141032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                m_known_kexts.clear();
1411bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            }
1412bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton            return true;
1413bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        }
1414bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
1415bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    return false;
1416bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
1417bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1418bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
1419bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Dump an image info structure to the file handle provided.
1420bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
1421bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid
142232a45285f51d27b91f17ea15124ef44a2efd2511Jason MolendaDynamicLoaderDarwinKernel::KextImageInfo::PutToLog (Log *log) const
1423bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
1424bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    if (log == NULL)
1425bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        return;
142632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    const uint8_t *u = (uint8_t *) m_uuid.GetBytes();
1427bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
142832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (m_load_address == LLDB_INVALID_ADDRESS)
1429bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
1430bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        if (u)
1431bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        {
14320fa512447e00da09d300fbabd18b5ce94f52fdaaGreg 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)",
1433bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                        u[ 0], u[ 1], u[ 2], u[ 3],
1434bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                        u[ 4], u[ 5], u[ 6], u[ 7],
1435bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                        u[ 8], u[ 9], u[10], u[11],
1436bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                        u[12], u[13], u[14], u[15],
143732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                        m_name.c_str());
1438bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        }
1439bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        else
144032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            log->Printf("\tname=\"%s\" (UNLOADED)", m_name.c_str());
1441bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
1442bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    else
1443bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
1444bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        if (u)
1445bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        {
144632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            log->Printf("\taddr=0x%16.16" PRIx64 " size=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\"",
144732a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                        m_load_address, m_size,
14480fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                        u[ 0], u[ 1], u[ 2], u[ 3], u[ 4], u[ 5], u[ 6], u[ 7],
14490fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                        u[ 8], u[ 9], u[10], u[11], u[12], u[13], u[14], u[15],
145032a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                        m_name.c_str());
1451bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        }
1452bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        else
1453bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        {
145432a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            log->Printf("\t[0x%16.16" PRIx64 " - 0x%16.16" PRIx64 ") name=\"%s\"",
145532a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda                        m_load_address, m_load_address+m_size, m_name.c_str());
1456bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        }
1457bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
1458bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
1459bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1460bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
1461bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Dump the _dyld_all_image_infos members and all current image infos
1462bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// that we have parsed to the file handle provided.
1463bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
1464bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid
146517f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::PutToLog(Log *log) const
1466bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
1467bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    if (log == NULL)
1468bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        return;
1469bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1470bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    Mutex::Locker locker(m_mutex);
14715f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    log->Printf("gLoadedKextSummaries = 0x%16.16" PRIx64 " { version=%u, entry_size=%u, entry_count=%u }",
14728c547d425c39c58bfd76e31b3a567f8ca27b3617Greg Clayton                m_kext_summary_header_addr.GetFileAddress(),
1473bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                m_kext_summary_header.version,
1474bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                m_kext_summary_header.entry_size,
14750fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                m_kext_summary_header.entry_count);
1476bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1477bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    size_t i;
147832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    const size_t count = m_known_kexts.size();
1479bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    if (count > 0)
1480bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
1481bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        log->PutCString("Loaded:");
1482bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        for (i = 0; i<count; i++)
148332a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda            m_known_kexts[i].PutToLog(log);
1484bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
1485bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
1486bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1487bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid
148817f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::PrivateInitialize(Process *process)
1489bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
149017f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton    DEBUG_PRINTF("DynamicLoaderDarwinKernel::%s() process state = %s\n", __FUNCTION__, StateAsCString(m_process->GetState()));
1491bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    Clear(true);
1492bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    m_process = process;
1493bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
1494bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1495645facaf9c247b20f0f135445d437181688711a7Greg Claytonvoid
149617f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::SetNotificationBreakpointIfNeeded ()
1497bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
149832a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda    if (m_break_id == LLDB_INVALID_BREAK_ID && m_kernel.GetModule())
1499645facaf9c247b20f0f135445d437181688711a7Greg Clayton    {
150017f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton        DEBUG_PRINTF("DynamicLoaderDarwinKernel::%s() process state = %s\n", __FUNCTION__, StateAsCString(m_process->GetState()));
1501645facaf9c247b20f0f135445d437181688711a7Greg Clayton
15027dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton
15032cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham        const bool internal_bp = true;
15047dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton        const LazyBool skip_prologue = eLazyBoolNo;
150503c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham        FileSpecList module_spec_list;
150632a45285f51d27b91f17ea15124ef44a2efd2511Jason Molenda        module_spec_list.Append (m_kernel.GetModule()->GetFileSpec());
150703c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham        Breakpoint *bp = m_process->GetTarget().CreateBreakpoint (&module_spec_list,
1508d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham                                                                  NULL,
1509645facaf9c247b20f0f135445d437181688711a7Greg Clayton                                                                  "OSKextLoadedKextSummariesUpdated",
1510645facaf9c247b20f0f135445d437181688711a7Greg Clayton                                                                  eFunctionNameTypeFull,
15112cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham                                                                  skip_prologue,
15122cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham                                                                  internal_bp).get();
1513645facaf9c247b20f0f135445d437181688711a7Greg Clayton
151417f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton        bp->SetCallback (DynamicLoaderDarwinKernel::BreakpointHitCallback, this, true);
1515645facaf9c247b20f0f135445d437181688711a7Greg Clayton        m_break_id = bp->GetID();
1516645facaf9c247b20f0f135445d437181688711a7Greg Clayton    }
1517bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
1518bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1519bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
1520bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// Member function that gets called when the process state changes.
1521bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//----------------------------------------------------------------------
1522bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid
152317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::PrivateProcessStateChanged (Process *process, StateType state)
1524bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
152517f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton    DEBUG_PRINTF("DynamicLoaderDarwinKernel::%s(%s)\n", __FUNCTION__, StateAsCString(state));
1526bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    switch (state)
1527bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    {
1528bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateConnected:
1529bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateAttaching:
1530bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateLaunching:
1531bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateInvalid:
1532bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateUnloaded:
1533bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateExited:
1534bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateDetached:
1535bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        Clear(false);
1536bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        break;
1537bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1538bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateStopped:
1539645facaf9c247b20f0f135445d437181688711a7Greg Clayton        UpdateIfNeeded();
1540bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        break;
1541bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1542bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateRunning:
1543bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateStepping:
1544bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateCrashed:
1545bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    case eStateSuspended:
1546bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton        break;
1547bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    }
1548bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
1549bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1550bbea13375ec4ae876576fcb8608626d45880dd96Greg ClaytonThreadPlanSP
155117f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetStepThroughTrampolinePlan (Thread &thread, bool stop_others)
1552bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
1553bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    ThreadPlanSP thread_plan_sp;
1554952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
1555645facaf9c247b20f0f135445d437181688711a7Greg Clayton    if (log)
1556645facaf9c247b20f0f135445d437181688711a7Greg Clayton        log->Printf ("Could not find symbol for step through.");
1557bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    return thread_plan_sp;
1558bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
1559bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1560bbea13375ec4ae876576fcb8608626d45880dd96Greg ClaytonError
156117f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::CanLoadImage ()
1562bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
1563bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    Error error;
1564bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    error.SetErrorString("always unsafe to load or unload shared libraries in the darwin kernel");
1565bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    return error;
1566bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
1567bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1568bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid
156917f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::Initialize()
1570bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
1571bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    PluginManager::RegisterPlugin (GetPluginNameStatic(),
1572bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton                                   GetPluginDescriptionStatic(),
157387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton                                   CreateInstance,
157487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton                                   DebuggerInitialize);
1575bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
1576bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1577bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonvoid
157817f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::Terminate()
1579bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
1580bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    PluginManager::UnregisterPlugin (CreateInstance);
1581bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
1582bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
158387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Claytonvoid
158487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg ClaytonDynamicLoaderDarwinKernel::DebuggerInitialize (lldb_private::Debugger &debugger)
158587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton{
158687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    if (!PluginManager::GetSettingForDynamicLoaderPlugin (debugger, DynamicLoaderDarwinKernelProperties::GetSettingName()))
158787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    {
158887e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton        const bool is_global_setting = true;
158987e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton        PluginManager::CreateSettingForDynamicLoaderPlugin (debugger,
159087e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton                                                            GetGlobalProperties()->GetValueProperties(),
159187e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton                                                            ConstString ("Properties for the DynamicLoaderDarwinKernel plug-in."),
159287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton                                                            is_global_setting);
159387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton    }
159487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton}
1595bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1596bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonconst char *
159717f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetPluginNameStatic()
1598bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
15992acbc2a80c0116454426db2d8b55bc23e6cbb0c1Greg Clayton    return "dynamic-loader.darwin-kernel";
1600bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
1601bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1602bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonconst char *
160317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetPluginDescriptionStatic()
1604bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
1605bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    return "Dynamic loader plug-in that watches for shared library loads/unloads in the MacOSX kernel.";
1606bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
1607bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1608bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1609bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------
1610bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton// PluginInterface protocol
1611bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton//------------------------------------------------------------------
1612bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonconst char *
161317f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetPluginName()
1614bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
161517f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg Clayton    return "DynamicLoaderDarwinKernel";
1616bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
1617bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1618bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonconst char *
161917f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetShortPluginName()
1620bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
1621bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    return GetPluginNameStatic();
1622bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
1623bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
1624bbea13375ec4ae876576fcb8608626d45880dd96Greg Claytonuint32_t
162517f3d054e3d27fb7ce0892945c6ffb6c11516f88Greg ClaytonDynamicLoaderDarwinKernel::GetPluginVersion()
1626bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton{
1627bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton    return 1;
1628bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton}
1629bbea13375ec4ae876576fcb8608626d45880dd96Greg Clayton
163049ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb::ByteOrder
163149ce8969d3154e1560106cfe530444c09410f217Greg ClaytonDynamicLoaderDarwinKernel::GetByteOrderFromMagic (uint32_t magic)
163249ce8969d3154e1560106cfe530444c09410f217Greg Clayton{
163349ce8969d3154e1560106cfe530444c09410f217Greg Clayton    switch (magic)
163449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
163549ce8969d3154e1560106cfe530444c09410f217Greg Clayton        case llvm::MachO::HeaderMagic32:
163649ce8969d3154e1560106cfe530444c09410f217Greg Clayton        case llvm::MachO::HeaderMagic64:
163749ce8969d3154e1560106cfe530444c09410f217Greg Clayton            return lldb::endian::InlHostByteOrder();
163849ce8969d3154e1560106cfe530444c09410f217Greg Clayton
163949ce8969d3154e1560106cfe530444c09410f217Greg Clayton        case llvm::MachO::HeaderMagic32Swapped:
164049ce8969d3154e1560106cfe530444c09410f217Greg Clayton        case llvm::MachO::HeaderMagic64Swapped:
164149ce8969d3154e1560106cfe530444c09410f217Greg Clayton            if (lldb::endian::InlHostByteOrder() == lldb::eByteOrderBig)
164249ce8969d3154e1560106cfe530444c09410f217Greg Clayton                return lldb::eByteOrderLittle;
164349ce8969d3154e1560106cfe530444c09410f217Greg Clayton            else
164449ce8969d3154e1560106cfe530444c09410f217Greg Clayton                return lldb::eByteOrderBig;
164549ce8969d3154e1560106cfe530444c09410f217Greg Clayton
164649ce8969d3154e1560106cfe530444c09410f217Greg Clayton        default:
164749ce8969d3154e1560106cfe530444c09410f217Greg Clayton            break;
164849ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
164949ce8969d3154e1560106cfe530444c09410f217Greg Clayton    return lldb::eByteOrderInvalid;
165049ce8969d3154e1560106cfe530444c09410f217Greg Clayton}
165149ce8969d3154e1560106cfe530444c09410f217Greg Clayton
1652