1269f91e066c5991a4d4aa2945ea2c285f8589b12Greg Clayton//===-- ProcessKDP.cpp ------------------------------------------*- C++ -*-===// 2363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// 3363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// The LLVM Compiler Infrastructure 4363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// 5363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// This file is distributed under the University of Illinois Open Source 6363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// License. See LICENSE.TXT for details. 7363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// 8363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//===----------------------------------------------------------------------===// 9363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 10363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// C Includes 11363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton#include <errno.h> 12363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton#include <stdlib.h> 13363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 14363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// C++ Includes 15363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// Other libraries and framework includes 168d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton#include "lldb/Core/ConnectionFileDescriptor.h" 17234981a4559db084f9c90612660e40f19915b89cGreg Clayton#include "lldb/Core/Debugger.h" 18363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton#include "lldb/Core/PluginManager.h" 1949ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Module.h" 20fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda#include "lldb/Core/ModuleSpec.h" 21363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton#include "lldb/Core/State.h" 22fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda#include "lldb/Core/UUID.h" 23363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton#include "lldb/Host/Host.h" 24fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda#include "lldb/Host/Symbols.h" 25307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton#include "lldb/Interpreter/CommandInterpreter.h" 26307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton#include "lldb/Interpreter/CommandObject.h" 27307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton#include "lldb/Interpreter/CommandObjectMultiword.h" 28307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton#include "lldb/Interpreter/CommandReturnObject.h" 29307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton#include "lldb/Interpreter/OptionGroupString.h" 30307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton#include "lldb/Interpreter/OptionGroupUInt64.h" 3149ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/ObjectFile.h" 32e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton#include "lldb/Target/RegisterContext.h" 331e5b02176d6952d0679479926fa557534313472bGreg Clayton#include "lldb/Target/Target.h" 340fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton#include "lldb/Target/Thread.h" 35363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 36363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// Project includes 37363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton#include "ProcessKDP.h" 38363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton#include "ProcessKDPLog.h" 390fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton#include "ThreadKDP.h" 40b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda#include "Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.h" 41d06bb5007b310b5498f7c47006022561ce1ceb4dJason Molenda#include "Plugins/DynamicLoader/Static/DynamicLoaderStatic.h" 42307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton#include "Utility/StringExtractor.h" 43363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 44363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonusing namespace lldb; 45363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonusing namespace lldb_private; 46363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 4797abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Claytonnamespace { 4897abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton 4997abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton static PropertyDefinition 5097abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton g_properties[] = 5197abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton { 5297abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton { "packet-timeout" , OptionValue::eTypeUInt64 , true , 5, NULL, NULL, "Specify the default packet timeout in seconds." }, 5397abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton { NULL , OptionValue::eTypeInvalid, false, 0, NULL, NULL, NULL } 5497abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton }; 5597abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton 5697abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton enum 5797abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton { 5897abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton ePropertyPacketTimeout 5997abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton }; 6097abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton 6197abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton class PluginProperties : public Properties 6297abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton { 6397abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton public: 6497abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton 6597abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton static ConstString 6697abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton GetSettingName () 6797abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton { 6897abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton return ProcessKDP::GetPluginNameStatic(); 6997abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton } 7097abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton 7197abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton PluginProperties() : 7297abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton Properties () 7397abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton { 7497abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton m_collection_sp.reset (new OptionValueProperties(GetSettingName())); 7597abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton m_collection_sp->Initialize(g_properties); 7697abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton } 7797abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton 7897abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton virtual 7997abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton ~PluginProperties() 8097abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton { 8197abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton } 8297abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton 8397abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton uint64_t 8497abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton GetPacketTimeout() 8597abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton { 8697abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton const uint32_t idx = ePropertyPacketTimeout; 8797abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton return m_collection_sp->GetPropertyAtIndexAsUInt64(NULL, idx, g_properties[idx].default_uint_value); 8897abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton } 8997abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton }; 9097abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton 9197abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton typedef std::shared_ptr<PluginProperties> ProcessKDPPropertiesSP; 9297abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton 9397abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton static const ProcessKDPPropertiesSP & 9497abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton GetGlobalPluginProperties() 9597abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton { 9697abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton static ProcessKDPPropertiesSP g_settings_sp; 9797abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton if (!g_settings_sp) 9897abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton g_settings_sp.reset (new PluginProperties ()); 9997abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton return g_settings_sp; 10097abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton } 10197abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton 10297abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton} // anonymous namespace end 10397abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton 1044e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylorstatic const lldb::tid_t g_kernel_tid = 1; 1054e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor 1060e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonConstString 107363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::GetPluginNameStatic() 108363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 1090e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton static ConstString g_name("kdp-remote"); 1100e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton return g_name; 111363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 112363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 113363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonconst char * 114363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::GetPluginDescriptionStatic() 115363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 116363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return "KDP Remote protocol based debugging plug-in for darwin kernel debugging."; 117363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 118363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 119363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonvoid 120363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::Terminate() 121363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 122363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton PluginManager::UnregisterPlugin (ProcessKDP::CreateInstance); 123363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 124363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 125363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 12646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonlldb::ProcessSP 12746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessKDP::CreateInstance (Target &target, 12846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton Listener &listener, 12946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton const FileSpec *crash_file_path) 130363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 13146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton lldb::ProcessSP process_sp; 13246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (crash_file_path == NULL) 13346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton process_sp.reset(new ProcessKDP (target, listener)); 13446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return process_sp; 135363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 136363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 137363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonbool 1388d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg ClaytonProcessKDP::CanDebug(Target &target, bool plugin_specified_by_name) 139363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 14061ddf56b2526dab3f9485c87db414978cbd9e285Greg Clayton if (plugin_specified_by_name) 14161ddf56b2526dab3f9485c87db414978cbd9e285Greg Clayton return true; 14261ddf56b2526dab3f9485c87db414978cbd9e285Greg Clayton 143363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // For now we are just making sure the file exists for a given module 1445beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton Module *exe_module = target.GetExecutableModulePointer(); 1455beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton if (exe_module) 146363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 147363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton const llvm::Triple &triple_ref = target.GetArchitecture().GetTriple(); 148b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton switch (triple_ref.getOS()) 149363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 150b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::Darwin: // Should use "macosx" for desktop and "ios" for iOS, but accept darwin just in case 151b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::MacOSX: // For desktop targets 152b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::IOS: // For arm targets 153b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (triple_ref.getVendor() == llvm::Triple::Apple) 154b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 155b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton ObjectFile *exe_objfile = exe_module->GetObjectFile(); 156b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (exe_objfile->GetType() == ObjectFile::eTypeExecutable && 157b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton exe_objfile->GetStrata() == ObjectFile::eStrataKernel) 158b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return true; 159b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 160b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 161b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 162b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: 163b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 164363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 165363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 16661ddf56b2526dab3f9485c87db414978cbd9e285Greg Clayton return false; 167363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 168363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 169363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 170363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// ProcessKDP constructor 171363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 172363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::ProcessKDP(Target& target, Listener &listener) : 173363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Process (target, listener), 174363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_comm("lldb.process.kdp-remote.communication"), 1755a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham m_async_broadcaster (NULL, "lldb.process.kdp-remote.async-broadcaster"), 1763acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton m_async_thread (LLDB_INVALID_HOST_THREAD), 177b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda m_dyld_plugin_name (), 178307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton m_kernel_load_addr (LLDB_INVALID_ADDRESS), 1794e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor m_command_sp(), 1804e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor m_kernel_thread_wp() 181363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 182e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton m_async_broadcaster.SetEventName (eBroadcastBitAsyncThreadShouldExit, "async thread should exit"); 183e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton m_async_broadcaster.SetEventName (eBroadcastBitAsyncContinue, "async thread continue"); 18497abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton const uint64_t timeout_seconds = GetGlobalPluginProperties()->GetPacketTimeout(); 18597abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton if (timeout_seconds > 0) 18697abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton m_comm.SetPacketTimeout(timeout_seconds); 187363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 188363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 189363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 190363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// Destructor 191363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 192363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::~ProcessKDP() 193363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 194363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Clear(); 195ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // We need to call finalize on the process before destroying ourselves 196ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // to make sure all of the broadcaster cleanup goes as planned. If we 197ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // destruct this class, then Process::~Process() might have problems 198ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // trying to fully destroy the broadcaster. 199ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton Finalize(); 200363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 201363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 202363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 203363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// PluginInterface 204363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 2050e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString 206363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::GetPluginName() 207363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 208363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return GetPluginNameStatic(); 209363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 210363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 211363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonuint32_t 212363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::GetPluginVersion() 213363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 214363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return 1; 215363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 216363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 217363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 218363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::WillLaunch (Module* module) 219363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 220363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 221363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("launching not supported in kdp-remote plug-in"); 222363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 223363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 224363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 225363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 226363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::WillAttachToProcessWithID (lldb::pid_t pid) 227363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 228363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 229363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("attaching to a by process ID not supported in kdp-remote plug-in"); 230363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 231363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 232363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 233363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 234363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::WillAttachToProcessWithName (const char *process_name, bool wait_for_launch) 235363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 236363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 237363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("attaching to a by process name not supported in kdp-remote plug-in"); 238363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 239363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 240363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 241363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 242fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason MolendaProcessKDP::DoConnectRemote (Stream *strm, const char *remote_url) 243363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 244363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 245e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton 246e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // Don't let any JIT happen when doing KDP as we can't allocate 247e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // memory and we don't want to be mucking with threads that might 248e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // already be handling exceptions 249e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton SetCanJIT(false); 250e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton 2518d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (remote_url == NULL || remote_url[0] == '\0') 252e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton { 253e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton error.SetErrorStringWithFormat ("invalid connection URL '%s'", remote_url); 254e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton return error; 255e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton } 2568d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton 257102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<ConnectionFileDescriptor> conn_ap(new ConnectionFileDescriptor()); 2588d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (conn_ap.get()) 2598d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton { 2608d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton // Only try once for now. 2618d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton // TODO: check if we should be retrying? 2628d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton const uint32_t max_retry_count = 1; 2638d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton for (uint32_t retry_count = 0; retry_count < max_retry_count; ++retry_count) 2648d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton { 2658d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (conn_ap->Connect(remote_url, &error) == eConnectionStatusSuccess) 2668d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton break; 2678d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton usleep (100000); 2688d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton } 2698d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton } 2708d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton 2718d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (conn_ap->IsConnected()) 2728d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton { 2738d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton const uint16_t reply_port = conn_ap->GetReadPort (); 2748d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton 2758d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (reply_port != 0) 2768d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton { 2778d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton m_comm.SetConnection(conn_ap.release()); 2788d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton 2798d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (m_comm.SendRequestReattach(reply_port)) 2808d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton { 2818d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (m_comm.SendRequestConnect(reply_port, reply_port, "Greetings from LLDB...")) 2828d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton { 2838d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton m_comm.GetVersion(); 2848d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton uint32_t cpu = m_comm.GetCPUType(); 2858d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton uint32_t sub = m_comm.GetCPUSubtype(); 2868d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton ArchSpec kernel_arch; 2878d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton kernel_arch.SetArchitecture(eArchTypeMachO, cpu, sub); 2888d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton m_target.SetArchitecture(kernel_arch); 289fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda 290d06bb5007b310b5498f7c47006022561ce1ceb4dJason Molenda /* Get the kernel's UUID and load address via KDP_KERNELVERSION packet. */ 291d06bb5007b310b5498f7c47006022561ce1ceb4dJason Molenda /* An EFI kdp session has neither UUID nor load address. */ 292d06bb5007b310b5498f7c47006022561ce1ceb4dJason Molenda 293fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda UUID kernel_uuid = m_comm.GetUUID (); 294fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda addr_t kernel_load_addr = m_comm.GetLoadAddress (); 295fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda 296d06bb5007b310b5498f7c47006022561ce1ceb4dJason Molenda if (m_comm.RemoteIsEFI ()) 297d06bb5007b310b5498f7c47006022561ce1ceb4dJason Molenda { 298d06bb5007b310b5498f7c47006022561ce1ceb4dJason Molenda m_dyld_plugin_name = DynamicLoaderStatic::GetPluginNameStatic(); 299d06bb5007b310b5498f7c47006022561ce1ceb4dJason Molenda } 3006c32437e2255db9089ee00cd70b474676d09ab6eJason Molenda else if (m_comm.RemoteIsDarwinKernel ()) 301fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda { 3026c32437e2255db9089ee00cd70b474676d09ab6eJason Molenda m_dyld_plugin_name = DynamicLoaderDarwinKernel::GetPluginNameStatic(); 30335efff89fca50e6fe9aa1a7844c4a8aca84882bfJason Molenda if (kernel_load_addr != LLDB_INVALID_ADDRESS) 30435efff89fca50e6fe9aa1a7844c4a8aca84882bfJason Molenda { 30535efff89fca50e6fe9aa1a7844c4a8aca84882bfJason Molenda m_kernel_load_addr = kernel_load_addr; 30635efff89fca50e6fe9aa1a7844c4a8aca84882bfJason Molenda } 307fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda } 308fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda 3093acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // Set the thread ID 3103acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton UpdateThreadListIfNeeded (); 3110fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton SetID (1); 31237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton GetThreadList (); 3130fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton SetPrivateState (eStateStopped); 314234981a4559db084f9c90612660e40f19915b89cGreg Clayton StreamSP async_strm_sp(m_target.GetDebugger().GetAsyncOutputStream()); 315234981a4559db084f9c90612660e40f19915b89cGreg Clayton if (async_strm_sp) 316234981a4559db084f9c90612660e40f19915b89cGreg Clayton { 3177b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton const char *cstr; 3187b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton if ((cstr = m_comm.GetKernelVersion ()) != NULL) 319234981a4559db084f9c90612660e40f19915b89cGreg Clayton { 3207b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton async_strm_sp->Printf ("Version: %s\n", cstr); 321234981a4559db084f9c90612660e40f19915b89cGreg Clayton async_strm_sp->Flush(); 322234981a4559db084f9c90612660e40f19915b89cGreg Clayton } 3237b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton// if ((cstr = m_comm.GetImagePath ()) != NULL) 3247b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton// { 3257b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton// async_strm_sp->Printf ("Image Path: %s\n", cstr); 3267b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton// async_strm_sp->Flush(); 3277b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton// } 328234981a4559db084f9c90612660e40f19915b89cGreg Clayton } 3298d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton } 3303acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton else 3313acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton { 3323acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton error.SetErrorString("KDP_REATTACH failed"); 3333acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton } 3348d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton } 3358d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton else 3368d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton { 3373acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton error.SetErrorString("KDP_REATTACH failed"); 3388d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton } 3398d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton } 3408d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton else 3418d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton { 3428d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton error.SetErrorString("invalid reply port from UDP connection"); 3438d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton } 3448d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton } 3458d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton else 3468d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton { 3478d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (error.Success()) 3488d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton error.SetErrorStringWithFormat ("failed to connect to '%s'", remote_url); 3498d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton } 3508d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (error.Fail()) 3518d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton m_comm.Disconnect(); 3528d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton 353363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 354363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 355363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 356363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 357363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// Process Control 358363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 359363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 36036bc5ea5a48c19421d44f559e2165c105657b809Greg ClaytonProcessKDP::DoLaunch (Module *exe_module, 36136bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton const ProcessLaunchInfo &launch_info) 362363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 363363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 364363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("launching not supported in kdp-remote plug-in"); 365363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 366363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 367363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 368363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 369363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 370363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoAttachToProcessWithID (lldb::pid_t attach_pid) 371363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 372363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 373363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("attach to process by ID is not suppported in kdp remote debugging"); 374363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 375363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 376363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 377363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 378d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming OngProcessKDP::DoAttachToProcessWithID (lldb::pid_t attach_pid, const ProcessAttachInfo &attach_info) 379d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong{ 380d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong Error error; 381d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong error.SetErrorString ("attach to process by ID is not suppported in kdp remote debugging"); 382d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong return error; 383d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong} 384d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong 385d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming OngError 386d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming OngProcessKDP::DoAttachToProcessWithName (const char *process_name, bool wait_for_launch, const ProcessAttachInfo &attach_info) 387363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 388363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 389363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("attach to process by name is not suppported in kdp remote debugging"); 390363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 391363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 392363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 393363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 394363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonvoid 395363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DidAttach () 396363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 397952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_PROCESS)); 398363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 39901df0574eab3f655e8c835498c383120688e3e0bJohnny Chen log->Printf ("ProcessKDP::DidAttach()"); 400363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (GetID() != LLDB_INVALID_PROCESS_ID) 401363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 402363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // TODO: figure out the register context that we will use 403363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 404363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 405363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 406b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molendaaddr_t 407b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason MolendaProcessKDP::GetImageInfoAddress() 408b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda{ 409b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda return m_kernel_load_addr; 410b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda} 411b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda 412b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molendalldb_private::DynamicLoader * 413b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason MolendaProcessKDP::GetDynamicLoader () 414b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda{ 415b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda if (m_dyld_ap.get() == NULL) 416f0c0882ff3fd98456c1814b495888092da2f13f6Jason Molenda m_dyld_ap.reset (DynamicLoader::FindPlugin(this, m_dyld_plugin_name.IsEmpty() ? NULL : m_dyld_plugin_name.GetCString())); 417b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda return m_dyld_ap.get(); 418b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda} 419b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda 420363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 421363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::WillResume () 422363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 423363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return Error(); 424363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 425363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 426363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 427363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoResume () 428363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 429363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 430952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_PROCESS)); 431e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // Only start the async thread if we try to do any process control 432e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton if (!IS_VALID_LLDB_HOST_THREAD(m_async_thread)) 433e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton StartAsyncThread (); 434e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton 4353acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton bool resume = false; 436e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton 4373acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // With KDP there is only one thread we can tell what to do 4384e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor ThreadSP kernel_thread_sp (m_thread_list.FindThreadByProtocolID(g_kernel_tid)); 4394e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor 4403acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (kernel_thread_sp) 441e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton { 4423acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton const StateType thread_resume_state = kernel_thread_sp->GetTemporaryResumeState(); 443863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton 444863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton if (log) 445863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton log->Printf ("ProcessKDP::DoResume() thread_resume_state = %s", StateAsCString(thread_resume_state)); 446e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton switch (thread_resume_state) 447e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton { 448e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton case eStateSuspended: 449e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // Nothing to do here when a thread will stay suspended 450e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // we just leave the CPU mask bit set to zero for the thread 451863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton if (log) 452863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton log->Printf ("ProcessKDP::DoResume() = suspended???"); 453e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton break; 454e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton 455e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton case eStateStepping: 4564ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton { 4574ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton lldb::RegisterContextSP reg_ctx_sp (kernel_thread_sp->GetRegisterContext()); 4584ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton 4594ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton if (reg_ctx_sp) 4604ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton { 461863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton if (log) 462863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton log->Printf ("ProcessKDP::DoResume () reg_ctx_sp->HardwareSingleStep (true);"); 4634ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton reg_ctx_sp->HardwareSingleStep (true); 4644ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton resume = true; 4654ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton } 4664ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton else 4674ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton { 4684ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton error.SetErrorStringWithFormat("KDP thread 0x%llx has no register context", kernel_thread_sp->GetID()); 4694ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton } 4704ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton } 471e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton break; 4723acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 4733acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton case eStateRunning: 4744ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton { 4754ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton lldb::RegisterContextSP reg_ctx_sp (kernel_thread_sp->GetRegisterContext()); 4764ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton 477863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton if (reg_ctx_sp) 478863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton { 479863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton if (log) 480863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton log->Printf ("ProcessKDP::DoResume () reg_ctx_sp->HardwareSingleStep (false);"); 481863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton reg_ctx_sp->HardwareSingleStep (false); 482863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton resume = true; 483863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton } 484863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton else 485863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton { 486863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton error.SetErrorStringWithFormat("KDP thread 0x%llx has no register context", kernel_thread_sp->GetID()); 487863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton } 4884ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton } 489e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton break; 4903acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 491e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton default: 4923acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // The only valid thread resume states are listed above 493e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton assert (!"invalid thread resume state"); 494e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton break; 495e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton } 496e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton } 4973acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 4983acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (resume) 499ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton { 5003acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (log) 5013acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton log->Printf ("ProcessKDP::DoResume () sending resume"); 502e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton 5033acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (m_comm.SendRequestResume ()) 504ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton { 505e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncContinue); 506e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton SetPrivateState(eStateRunning); 507ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton } 508e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton else 509e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton error.SetErrorString ("KDP resume failed"); 510ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton } 511ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton else 512e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton { 5133acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton error.SetErrorString ("kernel thread is suspended"); 514e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton } 515e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton 516363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 517363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 518363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 5193acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Claytonlldb::ThreadSP 5204e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew KaylorProcessKDP::GetKernelThread() 5213acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton{ 5223acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // KDP only tells us about one thread/core. Any other threads will usually 5233acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // be the ones that are read from memory by the OS plug-ins. 5244e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor 5254e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor ThreadSP thread_sp (m_kernel_thread_wp.lock()); 5263acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (!thread_sp) 5274e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor { 5284e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor thread_sp.reset(new ThreadKDP (*this, g_kernel_tid)); 5294e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor m_kernel_thread_wp = thread_sp; 5304e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor } 5313acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton return thread_sp; 5323acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton} 5333acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 5343acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 5353acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 5363acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 537ae932359b80098532f3c3766fa9e6527352fbb67Greg Claytonbool 53837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg ClaytonProcessKDP::UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_thread_list) 539363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 540363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // locker will keep a mutex locked until it goes out of scope 541952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_THREAD)); 542363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log && log->GetMask().Test(KDP_LOG_VERBOSE)) 5435f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("ProcessKDP::%s (pid = %" PRIu64 ")", __FUNCTION__, GetID()); 544363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 545a365dc57f99579acc77cf77991380054cf6f4d62Greg Clayton // Even though there is a CPU mask, it doesn't mean we can see each CPU 5463acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // indivudually, there is really only one. Lets call this thread 1. 5474e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor ThreadSP thread_sp (old_thread_list.FindThreadByProtocolID(g_kernel_tid, false)); 5484e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor if (!thread_sp) 5494e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor thread_sp = GetKernelThread (); 5504e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor new_thread_list.AddThread(thread_sp); 5513acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 552ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton return new_thread_list.GetSize(false) > 0; 553363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 554363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 555363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonvoid 556363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::RefreshStateAfterStop () 557363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 558363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // Let all threads recover from stopping and do any clean up based 559363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // on the previous thread state (if any). 560363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_thread_list.RefreshStateAfterStop(); 561363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 562363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 563363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 564363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoHalt (bool &caused_stop) 565363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 566363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 567363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 5683acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (m_comm.IsRunning()) 569363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 5703acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (m_destroy_in_process) 571363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 5723acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // If we are attemping to destroy, we need to not return an error to 5733acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // Halt or DoDestroy won't get called. 5743acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // We are also currently running, so send a process stopped event 5753acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton SetPrivateState (eStateStopped); 576363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 5773acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton else 578363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 5793acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton error.SetErrorString ("KDP cannot interrupt a running kernel"); 580363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 581363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 582363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 583363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 584363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 585363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 586761afb822b18c46b2ad84be03f372e90ac1e6143Jim InghamProcessKDP::DoDetach(bool keep_stopped) 587363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 588363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 589952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet(KDP_LOG_PROCESS)); 590363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 591761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham log->Printf ("ProcessKDP::DoDetach(keep_stopped = %i)", keep_stopped); 592363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 5933acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (m_comm.IsRunning()) 5943acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton { 5953acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // We are running and we can't interrupt a running kernel, so we need 5963acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // to just close the connection to the kernel and hope for the best 5973acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton } 5983acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton else 599363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 6003acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton DisableAllBreakpointSites (); 6013acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 6023acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton m_thread_list.DiscardThreadPlans(); 6033acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 604761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham // If we are going to keep the target stopped, then don't send the disconnect message. 605761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham if (!keep_stopped && m_comm.IsConnected()) 6063acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton { 607863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton const bool success = m_comm.SendRequestDisconnect(); 6083acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (log) 6093acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton { 610863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton if (success) 611863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton log->PutCString ("ProcessKDP::DoDetach() detach packet sent successfully"); 6123acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton else 6130c90b2c24f6256f9dd6621bc43f7fbc25c5bc65bJim Ingham log->PutCString ("ProcessKDP::DoDetach() connection channel shutdown failed"); 6143acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton } 615863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton m_comm.Disconnect (); 6168d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton } 617363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 6183acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton StopAsyncThread (); 619db9d6f47ab38e25c3efcbfa05780bf9a127fd259Greg Clayton m_comm.Clear(); 620363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 621363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton SetPrivateState (eStateDetached); 622363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton ResumePrivateStateThread(); 623363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 624363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton //KillDebugserverProcess (); 625363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 626363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 627363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 628363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 629363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoDestroy () 630363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 631e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // For KDP there really is no difference between destroy and detach 632761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham bool keep_stopped = false; 633761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham return DoDetach(keep_stopped); 634363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 635363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 636363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//------------------------------------------------------------------ 637363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// Process Queries 638363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//------------------------------------------------------------------ 639363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 640363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonbool 641363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::IsAlive () 642363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 643363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return m_comm.IsConnected() && m_private_state.GetValue() != eStateExited; 644363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 645363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 646363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//------------------------------------------------------------------ 647363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// Process Memory 648363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//------------------------------------------------------------------ 649363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonsize_t 650363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoReadMemory (addr_t addr, void *buf, size_t size, Error &error) 651363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 6520fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton if (m_comm.IsConnected()) 6530fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton return m_comm.SendRequestReadMemory (addr, buf, size, error); 6540fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton error.SetErrorString ("not connected"); 655363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return 0; 656363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 657363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 658363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonsize_t 659363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoWriteMemory (addr_t addr, const void *buf, size_t size, Error &error) 660363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 661e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton if (m_comm.IsConnected()) 662e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton return m_comm.SendRequestWriteMemory (addr, buf, size, error); 663e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton error.SetErrorString ("not connected"); 664363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return 0; 665363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 666363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 667363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonlldb::addr_t 668363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoAllocateMemory (size_t size, uint32_t permissions, Error &error) 669363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 670363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("memory allocation not suppported in kdp remote debugging"); 671363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return LLDB_INVALID_ADDRESS; 672363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 673363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 674363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 675363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoDeallocateMemory (lldb::addr_t addr) 676363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 677363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 678363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("memory deallocation not suppported in kdp remote debugging"); 679363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 680363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 681363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 682363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 683efb4aeba2bd8411ac0aee9934f08959094d50711Jim InghamProcessKDP::EnableBreakpointSite (BreakpointSite *bp_site) 684363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 685234981a4559db084f9c90612660e40f19915b89cGreg Clayton if (m_comm.LocalBreakpointsAreSupported ()) 686234981a4559db084f9c90612660e40f19915b89cGreg Clayton { 687234981a4559db084f9c90612660e40f19915b89cGreg Clayton Error error; 6887b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton if (!bp_site->IsEnabled()) 6897b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton { 6907b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton if (m_comm.SendRequestBreakpoint(true, bp_site->GetLoadAddress())) 6917b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton { 6927b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton bp_site->SetEnabled(true); 6937b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton bp_site->SetType (BreakpointSite::eExternal); 6947b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton } 6957b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton else 6967b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton { 6977b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton error.SetErrorString ("KDP set breakpoint failed"); 6987b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton } 6997b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton } 700234981a4559db084f9c90612660e40f19915b89cGreg Clayton return error; 701234981a4559db084f9c90612660e40f19915b89cGreg Clayton } 702363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return EnableSoftwareBreakpoint (bp_site); 703363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 704363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 705363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 706efb4aeba2bd8411ac0aee9934f08959094d50711Jim InghamProcessKDP::DisableBreakpointSite (BreakpointSite *bp_site) 707363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 708234981a4559db084f9c90612660e40f19915b89cGreg Clayton if (m_comm.LocalBreakpointsAreSupported ()) 709234981a4559db084f9c90612660e40f19915b89cGreg Clayton { 710234981a4559db084f9c90612660e40f19915b89cGreg Clayton Error error; 7117b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton if (bp_site->IsEnabled()) 7127b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton { 7137b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton BreakpointSite::Type bp_type = bp_site->GetType(); 7147b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton if (bp_type == BreakpointSite::eExternal) 7157b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton { 7163acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (m_destroy_in_process && m_comm.IsRunning()) 7173acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton { 7183acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // We are trying to destroy our connection and we are running 7197b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton bp_site->SetEnabled(false); 7203acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton } 7217b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton else 7223acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton { 7233acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (m_comm.SendRequestBreakpoint(false, bp_site->GetLoadAddress())) 7243acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton bp_site->SetEnabled(false); 7253acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton else 7263acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton error.SetErrorString ("KDP remove breakpoint failed"); 7273acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton } 7287b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton } 7297b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton else 7307b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton { 7317b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton error = DisableSoftwareBreakpoint (bp_site); 7327b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton } 7337b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton } 734234981a4559db084f9c90612660e40f19915b89cGreg Clayton return error; 735234981a4559db084f9c90612660e40f19915b89cGreg Clayton } 736363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return DisableSoftwareBreakpoint (bp_site); 737363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 738363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 739363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 7409c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamProcessKDP::EnableWatchpoint (Watchpoint *wp, bool notify) 741363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 742363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 743363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("watchpoints are not suppported in kdp remote debugging"); 744363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 745363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 746363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 747363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 7489c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamProcessKDP::DisableWatchpoint (Watchpoint *wp, bool notify) 749363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 750363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 751363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("watchpoints are not suppported in kdp remote debugging"); 752363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 753363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 754363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 755363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonvoid 756363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::Clear() 757363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 758363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_thread_list.Clear(); 759363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 760363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 761363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 762363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoSignal (int signo) 763363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 764363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 765363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("sending signals is not suppported in kdp remote debugging"); 766363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 767363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 768363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 769363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonvoid 770363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::Initialize() 771363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 772363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton static bool g_initialized = false; 773363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 774363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (g_initialized == false) 775363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 776363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton g_initialized = true; 777363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton PluginManager::RegisterPlugin (GetPluginNameStatic(), 778363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton GetPluginDescriptionStatic(), 77997abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton CreateInstance, 78097abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton DebuggerInitialize); 781363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 782363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Log::Callbacks log_callbacks = { 783363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton ProcessKDPLog::DisableLog, 784363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton ProcessKDPLog::EnableLog, 785363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton ProcessKDPLog::ListLogCategories 786363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton }; 787363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 788363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Log::RegisterLogChannel (ProcessKDP::GetPluginNameStatic(), log_callbacks); 789363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 790363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 791363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 79297abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Claytonvoid 79397abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg ClaytonProcessKDP::DebuggerInitialize (lldb_private::Debugger &debugger) 79497abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton{ 79597abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton if (!PluginManager::GetSettingForProcessPlugin(debugger, PluginProperties::GetSettingName())) 79697abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton { 79797abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton const bool is_global_setting = true; 79897abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton PluginManager::CreateSettingForProcessPlugin (debugger, 79997abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton GetGlobalPluginProperties()->GetValueProperties(), 80097abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton ConstString ("Properties for the kdp-remote process plug-in."), 80197abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton is_global_setting); 80297abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton } 80397abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton} 80497abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton 805363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonbool 806363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::StartAsyncThread () 807363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 808952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet(KDP_LOG_PROCESS)); 809363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 810363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 811e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton log->Printf ("ProcessKDP::StartAsyncThread ()"); 812363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 813e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton if (IS_VALID_LLDB_HOST_THREAD(m_async_thread)) 814e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton return true; 815e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton 816363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_async_thread = Host::ThreadCreate ("<lldb.process.kdp-remote.async>", ProcessKDP::AsyncThread, this, NULL); 817363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return IS_VALID_LLDB_HOST_THREAD(m_async_thread); 818363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 819363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 820363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonvoid 821363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::StopAsyncThread () 822363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 823952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet(KDP_LOG_PROCESS)); 824363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 825363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 826e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton log->Printf ("ProcessKDP::StopAsyncThread ()"); 827363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 828363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncThreadShouldExit); 829363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 830363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // Stop the stdio thread 831363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (IS_VALID_LLDB_HOST_THREAD(m_async_thread)) 832363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 833363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Host::ThreadJoin (m_async_thread, NULL, NULL); 834e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton m_async_thread = LLDB_INVALID_HOST_THREAD; 835363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 836363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 837363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 838363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 839363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonvoid * 840363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::AsyncThread (void *arg) 841363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 842363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton ProcessKDP *process = (ProcessKDP*) arg; 843363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 844e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton const lldb::pid_t pid = process->GetID(); 845e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton 846952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_PROCESS)); 847363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 8485f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("ProcessKDP::AsyncThread (arg = %p, pid = %" PRIu64 ") thread starting...", arg, pid); 849363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 850363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Listener listener ("ProcessKDP::AsyncThread"); 851363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton EventSP event_sp; 852363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton const uint32_t desired_event_mask = eBroadcastBitAsyncContinue | 853363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton eBroadcastBitAsyncThreadShouldExit; 854363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 855e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton 856363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (listener.StartListeningForEvents (&process->m_async_broadcaster, desired_event_mask) == desired_event_mask) 857363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 858363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton bool done = false; 859363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton while (!done) 860363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 861363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 8625f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("ProcessKDP::AsyncThread (pid = %" PRIu64 ") listener.WaitForEvent (NULL, event_sp)...", 863e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton pid); 864363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (listener.WaitForEvent (NULL, event_sp)) 865363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 866e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton uint32_t event_type = event_sp->GetType(); 867e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton if (log) 8685f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("ProcessKDP::AsyncThread (pid = %" PRIu64 ") Got an event of type: %d...", 869e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton pid, 870e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton event_type); 871e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton 872e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // When we are running, poll for 1 second to try and get an exception 873e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // to indicate the process has stopped. If we don't get one, check to 874e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // make sure no one asked us to exit 875e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton bool is_running = false; 876e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton DataExtractor exc_reply_packet; 877e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton do 878363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 879363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton switch (event_type) 880363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 881e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton case eBroadcastBitAsyncContinue: 882363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 883e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton is_running = true; 884e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton if (process->m_comm.WaitForPacketWithTimeoutMicroSeconds (exc_reply_packet, 1 * USEC_PER_SEC)) 885363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 8864e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor ThreadSP thread_sp (process->GetKernelThread()); 8874ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton if (thread_sp) 8884ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton { 8894ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton lldb::RegisterContextSP reg_ctx_sp (thread_sp->GetRegisterContext()); 8904ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton if (reg_ctx_sp) 8914ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton reg_ctx_sp->InvalidateAllRegisters(); 8924ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton static_cast<ThreadKDP *>(thread_sp.get())->SetStopInfoFrom_KDP_EXCEPTION (exc_reply_packet); 8934ee040ceb708aa2ed8e94523e1de2c62a2287f81Greg Clayton } 8943acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 895e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // TODO: parse the stop reply packet 8963acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton is_running = false; 897e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton process->SetPrivateState(eStateStopped); 898e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton } 899e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton else 900e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton { 901e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // Check to see if we are supposed to exit. There is no way to 902e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // interrupt a running kernel, so all we can do is wait for an 903e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // exception or detach... 904e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton if (listener.GetNextEvent(event_sp)) 905e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton { 906e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // We got an event, go through the loop again 907e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton event_type = event_sp->GetType(); 908e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton } 909363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 910363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 911e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton break; 912363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 913e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton case eBroadcastBitAsyncThreadShouldExit: 914e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton if (log) 9155f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("ProcessKDP::AsyncThread (pid = %" PRIu64 ") got eBroadcastBitAsyncThreadShouldExit...", 916e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton pid); 917e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton done = true; 918e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton is_running = false; 919e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton break; 920363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 921e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton default: 922e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton if (log) 9235f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("ProcessKDP::AsyncThread (pid = %" PRIu64 ") got unknown event 0x%8.8x", 924e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton pid, 925e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton event_type); 926363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton done = true; 927e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton is_running = false; 928e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton break; 929363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 930e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton } while (is_running); 931363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 932363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton else 933363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 934363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 9355f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("ProcessKDP::AsyncThread (pid = %" PRIu64 ") listener.WaitForEvent (NULL, event_sp) => false", 936e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton pid); 937363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton done = true; 938363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 939363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 940363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 941363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 942363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 9435f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("ProcessKDP::AsyncThread (arg = %p, pid = %" PRIu64 ") thread exiting...", 944e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton arg, 945e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton pid); 946363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 947363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton process->m_async_thread = LLDB_INVALID_HOST_THREAD; 948363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return NULL; 949363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 950363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 951363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 952307c7fdc58d19f734991a176db972cc61d9ada16Greg Claytonclass CommandObjectProcessKDPPacketSend : public CommandObjectParsed 953307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton{ 954307c7fdc58d19f734991a176db972cc61d9ada16Greg Claytonprivate: 955307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 956307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton OptionGroupOptions m_option_group; 957307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton OptionGroupUInt64 m_command_byte; 958307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton OptionGroupString m_packet_data; 959307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 960307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton virtual Options * 961307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton GetOptions () 962307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 963307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton return &m_option_group; 964307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 965307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 966307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 967307c7fdc58d19f734991a176db972cc61d9ada16Greg Claytonpublic: 968307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton CommandObjectProcessKDPPacketSend(CommandInterpreter &interpreter) : 969307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton CommandObjectParsed (interpreter, 970307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton "process plugin packet send", 971307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton "Send a custom packet through the KDP protocol by specifying the command byte and the packet payload data. A packet will be sent with a correct header and payload, and the raw result bytes will be displayed as a string value. ", 972307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton NULL), 973307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton m_option_group (interpreter), 974307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton m_command_byte(LLDB_OPT_SET_1, true , "command", 'c', 0, eArgTypeNone, "Specify the command byte to use when sending the KDP request packet.", 0), 975307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton m_packet_data (LLDB_OPT_SET_1, false, "payload", 'p', 0, eArgTypeNone, "Specify packet payload bytes as a hex ASCII string with no spaces or hex prefixes.", NULL) 976307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 977307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton m_option_group.Append (&m_command_byte, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 978307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton m_option_group.Append (&m_packet_data , LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 979307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton m_option_group.Finalize(); 980307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 981307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 982307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton ~CommandObjectProcessKDPPacketSend () 983307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 984307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 985307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 986307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton bool 987307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton DoExecute (Args& command, CommandReturnObject &result) 988307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 989307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton const size_t argc = command.GetArgumentCount(); 990307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton if (argc == 0) 991307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 992307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton if (!m_command_byte.GetOptionValue().OptionWasSet()) 993307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 994307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.AppendError ("the --command option must be set to a valid command byte"); 995307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.SetStatus (eReturnStatusFailed); 996307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 997307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton else 998307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 999307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton const uint64_t command_byte = m_command_byte.GetOptionValue().GetUInt64Value(0); 1000307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton if (command_byte > 0 && command_byte <= UINT8_MAX) 1001307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 1002307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton ProcessKDP *process = (ProcessKDP *)m_interpreter.GetExecutionContext().GetProcessPtr(); 1003307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton if (process) 1004307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 1005307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton const StateType state = process->GetState(); 1006307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 1007307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton if (StateIsStoppedState (state, true)) 1008307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 1009307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton std::vector<uint8_t> payload_bytes; 1010307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton const char *ascii_hex_bytes_cstr = m_packet_data.GetOptionValue().GetCurrentValue(); 1011307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton if (ascii_hex_bytes_cstr && ascii_hex_bytes_cstr[0]) 1012307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 1013307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton StringExtractor extractor(ascii_hex_bytes_cstr); 1014307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton const size_t ascii_hex_bytes_cstr_len = extractor.GetStringRef().size(); 1015307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton if (ascii_hex_bytes_cstr_len & 1) 1016307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 1017307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.AppendErrorWithFormat ("payload data must contain an even number of ASCII hex characters: '%s'", ascii_hex_bytes_cstr); 1018307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.SetStatus (eReturnStatusFailed); 1019307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton return false; 1020307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 1021307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton payload_bytes.resize(ascii_hex_bytes_cstr_len/2); 1022307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton if (extractor.GetHexBytes(&payload_bytes[0], payload_bytes.size(), '\xdd') != payload_bytes.size()) 1023307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 1024307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.AppendErrorWithFormat ("payload data must only contain ASCII hex characters (no spaces or hex prefixes): '%s'", ascii_hex_bytes_cstr); 1025307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.SetStatus (eReturnStatusFailed); 1026307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton return false; 1027307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 1028307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 1029307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton Error error; 1030307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton DataExtractor reply; 1031307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton process->GetCommunication().SendRawRequest (command_byte, 1032307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton payload_bytes.empty() ? NULL : payload_bytes.data(), 1033307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton payload_bytes.size(), 1034307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton reply, 1035307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton error); 1036307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 1037307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton if (error.Success()) 1038307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 1039307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton // Copy the binary bytes into a hex ASCII string for the result 1040307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton StreamString packet; 1041307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton packet.PutBytesAsRawHex8(reply.GetDataStart(), 1042307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton reply.GetByteSize(), 1043307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton lldb::endian::InlHostByteOrder(), 1044307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton lldb::endian::InlHostByteOrder()); 1045307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.AppendMessage(packet.GetString().c_str()); 1046307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.SetStatus (eReturnStatusSuccessFinishResult); 1047307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton return true; 1048307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 1049307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton else 1050307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 1051307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton const char *error_cstr = error.AsCString(); 1052307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton if (error_cstr && error_cstr[0]) 1053307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.AppendError (error_cstr); 1054307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton else 1055307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.AppendErrorWithFormat ("unknown error 0x%8.8x", error.GetError()); 1056307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.SetStatus (eReturnStatusFailed); 1057307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton return false; 1058307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 1059307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 1060307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton else 1061307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 1062307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.AppendErrorWithFormat ("process must be stopped in order to send KDP packets, state is %s", StateAsCString (state)); 1063307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.SetStatus (eReturnStatusFailed); 1064307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 1065307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 1066307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton else 1067307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 1068307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.AppendError ("invalid process"); 1069307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.SetStatus (eReturnStatusFailed); 1070307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 1071307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 1072307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton else 1073307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 10745f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendErrorWithFormat ("invalid command byte 0x%" PRIx64 ", valid values are 1 - 255", command_byte); 1075307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.SetStatus (eReturnStatusFailed); 1076307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 1077307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 1078307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 1079307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton else 1080307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 1081307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.AppendErrorWithFormat ("'%s' takes no arguments, only options.", m_cmd_name.c_str()); 1082307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.SetStatus (eReturnStatusFailed); 1083307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 1084307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton return false; 1085307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 1086307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton}; 1087307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 1088307c7fdc58d19f734991a176db972cc61d9ada16Greg Claytonclass CommandObjectProcessKDPPacket : public CommandObjectMultiword 1089307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton{ 1090307c7fdc58d19f734991a176db972cc61d9ada16Greg Claytonprivate: 1091307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 1092307c7fdc58d19f734991a176db972cc61d9ada16Greg Claytonpublic: 1093307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton CommandObjectProcessKDPPacket(CommandInterpreter &interpreter) : 1094307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton CommandObjectMultiword (interpreter, 1095307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton "process plugin packet", 1096307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton "Commands that deal with KDP remote packets.", 1097307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton NULL) 1098307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 1099307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton LoadSubCommand ("send", CommandObjectSP (new CommandObjectProcessKDPPacketSend (interpreter))); 1100307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 1101307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 1102307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton ~CommandObjectProcessKDPPacket () 1103307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 1104307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 1105307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton}; 1106307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 1107307c7fdc58d19f734991a176db972cc61d9ada16Greg Claytonclass CommandObjectMultiwordProcessKDP : public CommandObjectMultiword 1108307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton{ 1109307c7fdc58d19f734991a176db972cc61d9ada16Greg Claytonpublic: 1110307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton CommandObjectMultiwordProcessKDP (CommandInterpreter &interpreter) : 1111307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton CommandObjectMultiword (interpreter, 1112307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton "process plugin", 1113307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton "A set of commands for operating on a ProcessKDP process.", 1114307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton "process plugin <subcommand> [<subcommand-options>]") 1115307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 1116307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton LoadSubCommand ("packet", CommandObjectSP (new CommandObjectProcessKDPPacket (interpreter))); 1117307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 1118307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 1119307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton ~CommandObjectMultiwordProcessKDP () 1120307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 1121307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 1122307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton}; 1123307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 1124307c7fdc58d19f734991a176db972cc61d9ada16Greg ClaytonCommandObject * 1125307c7fdc58d19f734991a176db972cc61d9ada16Greg ClaytonProcessKDP::GetPluginCommandObject() 1126307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton{ 1127307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton if (!m_command_sp) 1128307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton m_command_sp.reset (new CommandObjectMultiwordProcessKDP (GetTarget().GetDebugger().GetCommandInterpreter())); 1129307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton return m_command_sp.get(); 1130307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton} 1131307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 1132