ProcessKDP.cpp revision 5f35a4be95aed0e5b2cb36f7d785bcbfc67284ae
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 47363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonconst char * 48363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::GetPluginNameStatic() 49363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 50363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return "kdp-remote"; 51363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 52363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 53363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonconst char * 54363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::GetPluginDescriptionStatic() 55363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 56363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return "KDP Remote protocol based debugging plug-in for darwin kernel debugging."; 57363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 58363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 59363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonvoid 60363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::Terminate() 61363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 62363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton PluginManager::UnregisterPlugin (ProcessKDP::CreateInstance); 63363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 64363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 65363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 6646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonlldb::ProcessSP 6746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessKDP::CreateInstance (Target &target, 6846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton Listener &listener, 6946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton const FileSpec *crash_file_path) 70363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 7146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton lldb::ProcessSP process_sp; 7246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (crash_file_path == NULL) 7346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton process_sp.reset(new ProcessKDP (target, listener)); 7446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return process_sp; 75363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 76363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 77363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonbool 788d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg ClaytonProcessKDP::CanDebug(Target &target, bool plugin_specified_by_name) 79363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 8061ddf56b2526dab3f9485c87db414978cbd9e285Greg Clayton if (plugin_specified_by_name) 8161ddf56b2526dab3f9485c87db414978cbd9e285Greg Clayton return true; 8261ddf56b2526dab3f9485c87db414978cbd9e285Greg Clayton 83363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // For now we are just making sure the file exists for a given module 845beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton Module *exe_module = target.GetExecutableModulePointer(); 855beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton if (exe_module) 86363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 87363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton const llvm::Triple &triple_ref = target.GetArchitecture().GetTriple(); 88b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton switch (triple_ref.getOS()) 89363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 90b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::Darwin: // Should use "macosx" for desktop and "ios" for iOS, but accept darwin just in case 91b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::MacOSX: // For desktop targets 92b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::IOS: // For arm targets 93b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (triple_ref.getVendor() == llvm::Triple::Apple) 94b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 95b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton ObjectFile *exe_objfile = exe_module->GetObjectFile(); 96b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (exe_objfile->GetType() == ObjectFile::eTypeExecutable && 97b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton exe_objfile->GetStrata() == ObjectFile::eStrataKernel) 98b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return true; 99b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 100b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 101b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 102b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: 103b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 104363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 105363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 10661ddf56b2526dab3f9485c87db414978cbd9e285Greg Clayton return false; 107363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 108363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 109363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 110363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// ProcessKDP constructor 111363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 112363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::ProcessKDP(Target& target, Listener &listener) : 113363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Process (target, listener), 114363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_comm("lldb.process.kdp-remote.communication"), 1155a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham m_async_broadcaster (NULL, "lldb.process.kdp-remote.async-broadcaster"), 1163acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton m_async_thread (LLDB_INVALID_HOST_THREAD), 117b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda m_destroy_in_process (false), 118b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda m_dyld_plugin_name (), 119307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton m_kernel_load_addr (LLDB_INVALID_ADDRESS), 120307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton m_command_sp() 121363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 122e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton m_async_broadcaster.SetEventName (eBroadcastBitAsyncThreadShouldExit, "async thread should exit"); 123e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton m_async_broadcaster.SetEventName (eBroadcastBitAsyncContinue, "async thread continue"); 124363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 125363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 126363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 127363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// Destructor 128363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 129363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::~ProcessKDP() 130363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 131363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Clear(); 132ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // We need to call finalize on the process before destroying ourselves 133ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // to make sure all of the broadcaster cleanup goes as planned. If we 134ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // destruct this class, then Process::~Process() might have problems 135ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // trying to fully destroy the broadcaster. 136ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton Finalize(); 137363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 138363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 139363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 140363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// PluginInterface 141363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 142363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonconst char * 143363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::GetPluginName() 144363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 145363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return "Process debugging plug-in that uses the Darwin KDP remote protocol"; 146363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 147363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 148363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonconst char * 149363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::GetShortPluginName() 150363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 151363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return GetPluginNameStatic(); 152363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 153363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 154363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonuint32_t 155363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::GetPluginVersion() 156363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 157363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return 1; 158363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 159363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 160363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 161363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::WillLaunch (Module* module) 162363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 163363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 164363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("launching not supported in kdp-remote plug-in"); 165363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 166363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 167363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 168363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 169363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::WillAttachToProcessWithID (lldb::pid_t pid) 170363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 171363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 172363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("attaching to a by process ID not supported in kdp-remote plug-in"); 173363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 174363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 175363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 176363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 177363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::WillAttachToProcessWithName (const char *process_name, bool wait_for_launch) 178363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 179363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 180363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("attaching to a by process name not supported in kdp-remote plug-in"); 181363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 182363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 183363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 184363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 185fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason MolendaProcessKDP::DoConnectRemote (Stream *strm, const char *remote_url) 186363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 187363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 188e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton 189e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // Don't let any JIT happen when doing KDP as we can't allocate 190e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // memory and we don't want to be mucking with threads that might 191e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // already be handling exceptions 192e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton SetCanJIT(false); 193e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton 1948d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (remote_url == NULL || remote_url[0] == '\0') 195e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton { 196e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton error.SetErrorStringWithFormat ("invalid connection URL '%s'", remote_url); 197e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton return error; 198e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton } 1998d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton 2008d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton std::auto_ptr<ConnectionFileDescriptor> conn_ap(new ConnectionFileDescriptor()); 2018d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (conn_ap.get()) 2028d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton { 2038d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton // Only try once for now. 2048d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton // TODO: check if we should be retrying? 2058d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton const uint32_t max_retry_count = 1; 2068d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton for (uint32_t retry_count = 0; retry_count < max_retry_count; ++retry_count) 2078d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton { 2088d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (conn_ap->Connect(remote_url, &error) == eConnectionStatusSuccess) 2098d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton break; 2108d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton usleep (100000); 2118d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton } 2128d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton } 2138d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton 2148d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (conn_ap->IsConnected()) 2158d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton { 2168d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton const uint16_t reply_port = conn_ap->GetReadPort (); 2178d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton 2188d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (reply_port != 0) 2198d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton { 2208d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton m_comm.SetConnection(conn_ap.release()); 2218d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton 2228d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (m_comm.SendRequestReattach(reply_port)) 2238d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton { 2248d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (m_comm.SendRequestConnect(reply_port, reply_port, "Greetings from LLDB...")) 2258d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton { 2268d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton m_comm.GetVersion(); 2278d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton uint32_t cpu = m_comm.GetCPUType(); 2288d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton uint32_t sub = m_comm.GetCPUSubtype(); 2298d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton ArchSpec kernel_arch; 2308d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton kernel_arch.SetArchitecture(eArchTypeMachO, cpu, sub); 2318d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton m_target.SetArchitecture(kernel_arch); 232fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda 233d06bb5007b310b5498f7c47006022561ce1ceb4dJason Molenda /* Get the kernel's UUID and load address via KDP_KERNELVERSION packet. */ 234d06bb5007b310b5498f7c47006022561ce1ceb4dJason Molenda /* An EFI kdp session has neither UUID nor load address. */ 235d06bb5007b310b5498f7c47006022561ce1ceb4dJason Molenda 236fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda UUID kernel_uuid = m_comm.GetUUID (); 237fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda addr_t kernel_load_addr = m_comm.GetLoadAddress (); 238fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda 239d06bb5007b310b5498f7c47006022561ce1ceb4dJason Molenda if (m_comm.RemoteIsEFI ()) 240d06bb5007b310b5498f7c47006022561ce1ceb4dJason Molenda { 241d06bb5007b310b5498f7c47006022561ce1ceb4dJason Molenda m_dyld_plugin_name = DynamicLoaderStatic::GetPluginNameStatic(); 242d06bb5007b310b5498f7c47006022561ce1ceb4dJason Molenda } 243d06bb5007b310b5498f7c47006022561ce1ceb4dJason Molenda else if (kernel_load_addr != LLDB_INVALID_ADDRESS) 244fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda { 245b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda m_kernel_load_addr = kernel_load_addr; 246b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda m_dyld_plugin_name = DynamicLoaderDarwinKernel::GetPluginNameStatic(); 247fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda } 248fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda 2493acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // Set the thread ID 2503acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton UpdateThreadListIfNeeded (); 2510fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton SetID (1); 25237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton GetThreadList (); 2530fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton SetPrivateState (eStateStopped); 254234981a4559db084f9c90612660e40f19915b89cGreg Clayton StreamSP async_strm_sp(m_target.GetDebugger().GetAsyncOutputStream()); 255234981a4559db084f9c90612660e40f19915b89cGreg Clayton if (async_strm_sp) 256234981a4559db084f9c90612660e40f19915b89cGreg Clayton { 2577b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton const char *cstr; 2587b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton if ((cstr = m_comm.GetKernelVersion ()) != NULL) 259234981a4559db084f9c90612660e40f19915b89cGreg Clayton { 2607b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton async_strm_sp->Printf ("Version: %s\n", cstr); 261234981a4559db084f9c90612660e40f19915b89cGreg Clayton async_strm_sp->Flush(); 262234981a4559db084f9c90612660e40f19915b89cGreg Clayton } 2637b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton// if ((cstr = m_comm.GetImagePath ()) != NULL) 2647b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton// { 2657b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton// async_strm_sp->Printf ("Image Path: %s\n", cstr); 2667b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton// async_strm_sp->Flush(); 2677b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton// } 268234981a4559db084f9c90612660e40f19915b89cGreg Clayton } 2698d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton } 2703acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton else 2713acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton { 2723acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton error.SetErrorString("KDP_REATTACH failed"); 2733acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton } 2748d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton } 2758d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton else 2768d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton { 2773acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton error.SetErrorString("KDP_REATTACH failed"); 2788d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton } 2798d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton } 2808d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton else 2818d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton { 2828d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton error.SetErrorString("invalid reply port from UDP connection"); 2838d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton } 2848d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton } 2858d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton else 2868d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton { 2878d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (error.Success()) 2888d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton error.SetErrorStringWithFormat ("failed to connect to '%s'", remote_url); 2898d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton } 2908d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (error.Fail()) 2918d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton m_comm.Disconnect(); 2928d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton 293363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 294363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 295363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 296363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 297363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// Process Control 298363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 299363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 30036bc5ea5a48c19421d44f559e2165c105657b809Greg ClaytonProcessKDP::DoLaunch (Module *exe_module, 30136bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton const ProcessLaunchInfo &launch_info) 302363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 303363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 304363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("launching not supported in kdp-remote plug-in"); 305363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 306363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 307363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 308363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 309363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 310363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoAttachToProcessWithID (lldb::pid_t attach_pid) 311363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 312363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 313363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("attach to process by ID is not suppported in kdp remote debugging"); 314363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 315363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 316363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 317363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 318d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming OngProcessKDP::DoAttachToProcessWithID (lldb::pid_t attach_pid, const ProcessAttachInfo &attach_info) 319d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong{ 320d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong Error error; 321d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong error.SetErrorString ("attach to process by ID is not suppported in kdp remote debugging"); 322d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong return error; 323d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong} 324d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong 325d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming OngError 326d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming OngProcessKDP::DoAttachToProcessWithName (const char *process_name, bool wait_for_launch, const ProcessAttachInfo &attach_info) 327363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 328363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 329363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("attach to process by name is not suppported in kdp remote debugging"); 330363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 331363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 332363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 333363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 334363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonvoid 335363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DidAttach () 336363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 337363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton LogSP log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_PROCESS)); 338363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 33901df0574eab3f655e8c835498c383120688e3e0bJohnny Chen log->Printf ("ProcessKDP::DidAttach()"); 340363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (GetID() != LLDB_INVALID_PROCESS_ID) 341363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 342363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // TODO: figure out the register context that we will use 343363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 344363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 345363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 346b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molendaaddr_t 347b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason MolendaProcessKDP::GetImageInfoAddress() 348b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda{ 349b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda return m_kernel_load_addr; 350b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda} 351b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda 352b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molendalldb_private::DynamicLoader * 353b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason MolendaProcessKDP::GetDynamicLoader () 354b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda{ 355b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda if (m_dyld_ap.get() == NULL) 356b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda m_dyld_ap.reset (DynamicLoader::FindPlugin(this, m_dyld_plugin_name.empty() ? NULL : m_dyld_plugin_name.c_str())); 357b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda return m_dyld_ap.get(); 358b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda} 359b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda 360363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 361363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::WillResume () 362363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 363363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return Error(); 364363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 365363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 366363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 367363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoResume () 368363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 369363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 370e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton LogSP log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_PROCESS)); 371e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // Only start the async thread if we try to do any process control 372e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton if (!IS_VALID_LLDB_HOST_THREAD(m_async_thread)) 373e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton StartAsyncThread (); 374e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton 3753acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton bool resume = false; 376e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton 3773acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // With KDP there is only one thread we can tell what to do 3783acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton ThreadSP kernel_thread_sp (GetKernelThread(m_thread_list, m_thread_list)); 3793acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (kernel_thread_sp) 380e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton { 3813acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton const StateType thread_resume_state = kernel_thread_sp->GetTemporaryResumeState(); 382e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton switch (thread_resume_state) 383e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton { 384e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton case eStateSuspended: 385e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // Nothing to do here when a thread will stay suspended 386e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // we just leave the CPU mask bit set to zero for the thread 387e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton break; 388e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton 389e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton case eStateStepping: 3903acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton kernel_thread_sp->GetRegisterContext()->HardwareSingleStep (true); 3913acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton resume = true; 392e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton break; 3933acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 3943acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton case eStateRunning: 3953acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton kernel_thread_sp->GetRegisterContext()->HardwareSingleStep (false); 3963acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton resume = true; 397e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton break; 3983acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 399e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton default: 4003acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // The only valid thread resume states are listed above 401e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton assert (!"invalid thread resume state"); 402e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton break; 403e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton } 404e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton } 4053acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 4063acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (resume) 407ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton { 4083acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (log) 4093acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton log->Printf ("ProcessKDP::DoResume () sending resume"); 410e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton 4113acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (m_comm.SendRequestResume ()) 412ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton { 413e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncContinue); 414e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton SetPrivateState(eStateRunning); 415ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton } 416e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton else 417e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton error.SetErrorString ("KDP resume failed"); 418ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton } 419ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton else 420e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton { 4213acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton error.SetErrorString ("kernel thread is suspended"); 422e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton } 423e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton 424363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 425363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 426363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 4273acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Claytonlldb::ThreadSP 4283acaa926c8f0d32da48db61a5fcb95276e6a4006Greg ClaytonProcessKDP::GetKernelThread(ThreadList &old_thread_list, ThreadList &new_thread_list) 4293acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton{ 4303acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // KDP only tells us about one thread/core. Any other threads will usually 4313acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // be the ones that are read from memory by the OS plug-ins. 4323acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton const lldb::tid_t kernel_tid = 1; 4333acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton ThreadSP thread_sp (old_thread_list.FindThreadByID (kernel_tid, false)); 4343acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (!thread_sp) 4353acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton { 43694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham thread_sp.reset(new ThreadKDP (*this, kernel_tid)); 4373acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton new_thread_list.AddThread(thread_sp); 4383acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton } 4393acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton return thread_sp; 4403acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton} 4413acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 4423acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 4433acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 4443acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 445ae932359b80098532f3c3766fa9e6527352fbb67Greg Claytonbool 44637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg ClaytonProcessKDP::UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_thread_list) 447363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 448363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // locker will keep a mutex locked until it goes out of scope 449363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton LogSP log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_THREAD)); 450363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log && log->GetMask().Test(KDP_LOG_VERBOSE)) 4515f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("ProcessKDP::%s (pid = %" PRIu64 ")", __FUNCTION__, GetID()); 452363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 4533acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // Even though there is a CPU mask, it doesn't mean to can see each CPU 4543acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // indivudually, there is really only one. Lets call this thread 1. 4553acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton GetKernelThread (old_thread_list, new_thread_list); 4563acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 457ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton return new_thread_list.GetSize(false) > 0; 458363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 459363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 460363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonvoid 461363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::RefreshStateAfterStop () 462363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 463363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // Let all threads recover from stopping and do any clean up based 464363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // on the previous thread state (if any). 465363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_thread_list.RefreshStateAfterStop(); 466363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 467363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 468363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 469363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoHalt (bool &caused_stop) 470363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 471363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 472363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 4733acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (m_comm.IsRunning()) 474363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 4753acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (m_destroy_in_process) 476363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 4773acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // If we are attemping to destroy, we need to not return an error to 4783acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // Halt or DoDestroy won't get called. 4793acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // We are also currently running, so send a process stopped event 4803acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton SetPrivateState (eStateStopped); 481363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 4823acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton else 483363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 4843acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton error.SetErrorString ("KDP cannot interrupt a running kernel"); 485363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 486363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 487363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 488363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 489363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 490363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 491363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoDetach() 492363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 493363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 494363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton LogSP log (ProcessKDPLog::GetLogIfAllCategoriesSet(KDP_LOG_PROCESS)); 495363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 496363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton log->Printf ("ProcessKDP::DoDetach()"); 497363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 4983acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (m_comm.IsRunning()) 4993acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton { 5003acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // We are running and we can't interrupt a running kernel, so we need 5013acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // to just close the connection to the kernel and hope for the best 5023acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton } 5033acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton else 504363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 5053acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton DisableAllBreakpointSites (); 5063acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 5073acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton m_thread_list.DiscardThreadPlans(); 5083acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 5093acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (m_comm.IsConnected()) 5103acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton { 5118d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton 5123acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton m_comm.SendRequestDisconnect(); 5138d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton 5143acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton size_t response_size = m_comm.Disconnect (); 5153acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (log) 5163acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton { 5173acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (response_size) 5183acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton log->PutCString ("ProcessKDP::DoDetach() detach packet sent successfully"); 5193acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton else 5203acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton log->PutCString ("ProcessKDP::DoDetach() detach packet send failed"); 5213acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton } 5228d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton } 523363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 5243acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton StopAsyncThread (); 525db9d6f47ab38e25c3efcbfa05780bf9a127fd259Greg Clayton m_comm.Clear(); 526363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 527363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton SetPrivateState (eStateDetached); 528363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton ResumePrivateStateThread(); 529363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 530363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton //KillDebugserverProcess (); 531363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 532363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 533363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 534363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 5353acaa926c8f0d32da48db61a5fcb95276e6a4006Greg ClaytonProcessKDP::WillDestroy () 5363acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton{ 5373acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton Error error; 5383acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton m_destroy_in_process = true; 5393acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton return error; 5403acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton} 5413acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 5423acaa926c8f0d32da48db61a5fcb95276e6a4006Greg ClaytonError 543363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoDestroy () 544363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 545e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // For KDP there really is no difference between destroy and detach 546e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton return DoDetach(); 547363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 548363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 549363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//------------------------------------------------------------------ 550363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// Process Queries 551363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//------------------------------------------------------------------ 552363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 553363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonbool 554363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::IsAlive () 555363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 556363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return m_comm.IsConnected() && m_private_state.GetValue() != eStateExited; 557363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 558363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 559363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//------------------------------------------------------------------ 560363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// Process Memory 561363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//------------------------------------------------------------------ 562363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonsize_t 563363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoReadMemory (addr_t addr, void *buf, size_t size, Error &error) 564363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 5650fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton if (m_comm.IsConnected()) 5660fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton return m_comm.SendRequestReadMemory (addr, buf, size, error); 5670fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton error.SetErrorString ("not connected"); 568363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return 0; 569363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 570363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 571363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonsize_t 572363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoWriteMemory (addr_t addr, const void *buf, size_t size, Error &error) 573363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 574e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton if (m_comm.IsConnected()) 575e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton return m_comm.SendRequestWriteMemory (addr, buf, size, error); 576e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton error.SetErrorString ("not connected"); 577363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return 0; 578363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 579363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 580363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonlldb::addr_t 581363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoAllocateMemory (size_t size, uint32_t permissions, Error &error) 582363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 583363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("memory allocation not suppported in kdp remote debugging"); 584363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return LLDB_INVALID_ADDRESS; 585363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 586363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 587363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 588363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoDeallocateMemory (lldb::addr_t addr) 589363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 590363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 591363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("memory deallocation not suppported in kdp remote debugging"); 592363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 593363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 594363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 595363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 596363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::EnableBreakpoint (BreakpointSite *bp_site) 597363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 598234981a4559db084f9c90612660e40f19915b89cGreg Clayton if (m_comm.LocalBreakpointsAreSupported ()) 599234981a4559db084f9c90612660e40f19915b89cGreg Clayton { 600234981a4559db084f9c90612660e40f19915b89cGreg Clayton Error error; 6017b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton if (!bp_site->IsEnabled()) 6027b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton { 6037b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton if (m_comm.SendRequestBreakpoint(true, bp_site->GetLoadAddress())) 6047b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton { 6057b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton bp_site->SetEnabled(true); 6067b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton bp_site->SetType (BreakpointSite::eExternal); 6077b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton } 6087b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton else 6097b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton { 6107b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton error.SetErrorString ("KDP set breakpoint failed"); 6117b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton } 6127b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton } 613234981a4559db084f9c90612660e40f19915b89cGreg Clayton return error; 614234981a4559db084f9c90612660e40f19915b89cGreg Clayton } 615363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return EnableSoftwareBreakpoint (bp_site); 616363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 617363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 618363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 619363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DisableBreakpoint (BreakpointSite *bp_site) 620363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 621234981a4559db084f9c90612660e40f19915b89cGreg Clayton if (m_comm.LocalBreakpointsAreSupported ()) 622234981a4559db084f9c90612660e40f19915b89cGreg Clayton { 623234981a4559db084f9c90612660e40f19915b89cGreg Clayton Error error; 6247b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton if (bp_site->IsEnabled()) 6257b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton { 6267b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton BreakpointSite::Type bp_type = bp_site->GetType(); 6277b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton if (bp_type == BreakpointSite::eExternal) 6287b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton { 6293acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (m_destroy_in_process && m_comm.IsRunning()) 6303acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton { 6313acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // We are trying to destroy our connection and we are running 6327b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton bp_site->SetEnabled(false); 6333acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton } 6347b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton else 6353acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton { 6363acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton if (m_comm.SendRequestBreakpoint(false, bp_site->GetLoadAddress())) 6373acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton bp_site->SetEnabled(false); 6383acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton else 6393acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton error.SetErrorString ("KDP remove breakpoint failed"); 6403acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton } 6417b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton } 6427b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton else 6437b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton { 6447b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton error = DisableSoftwareBreakpoint (bp_site); 6457b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton } 6467b13922c3c6b55225fa8403762c0399e9692b730Greg Clayton } 647234981a4559db084f9c90612660e40f19915b89cGreg Clayton return error; 648234981a4559db084f9c90612660e40f19915b89cGreg Clayton } 649363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return DisableSoftwareBreakpoint (bp_site); 650363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 651363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 652363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 653ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenProcessKDP::EnableWatchpoint (Watchpoint *wp) 654363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 655363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 656363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("watchpoints are not suppported in kdp remote debugging"); 657363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 658363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 659363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 660363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 661ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenProcessKDP::DisableWatchpoint (Watchpoint *wp) 662363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 663363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 664363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("watchpoints are not suppported in kdp remote debugging"); 665363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 666363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 667363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 668363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonvoid 669363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::Clear() 670363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 671363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_thread_list.Clear(); 672363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 673363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 674363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 675363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoSignal (int signo) 676363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 677363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 678363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("sending signals is not suppported in kdp remote debugging"); 679363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 680363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 681363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 682363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonvoid 683363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::Initialize() 684363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 685363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton static bool g_initialized = false; 686363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 687363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (g_initialized == false) 688363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 689363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton g_initialized = true; 690363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton PluginManager::RegisterPlugin (GetPluginNameStatic(), 691363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton GetPluginDescriptionStatic(), 692363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton CreateInstance); 693363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 694363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Log::Callbacks log_callbacks = { 695363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton ProcessKDPLog::DisableLog, 696363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton ProcessKDPLog::EnableLog, 697363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton ProcessKDPLog::ListLogCategories 698363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton }; 699363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 700363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Log::RegisterLogChannel (ProcessKDP::GetPluginNameStatic(), log_callbacks); 701363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 702363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 703363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 704363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonbool 705363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::StartAsyncThread () 706363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 707363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton LogSP log (ProcessKDPLog::GetLogIfAllCategoriesSet(KDP_LOG_PROCESS)); 708363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 709363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 710e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton log->Printf ("ProcessKDP::StartAsyncThread ()"); 711363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 712e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton if (IS_VALID_LLDB_HOST_THREAD(m_async_thread)) 713e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton return true; 714e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton 715363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_async_thread = Host::ThreadCreate ("<lldb.process.kdp-remote.async>", ProcessKDP::AsyncThread, this, NULL); 716363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return IS_VALID_LLDB_HOST_THREAD(m_async_thread); 717363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 718363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 719363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonvoid 720363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::StopAsyncThread () 721363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 722363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton LogSP log (ProcessKDPLog::GetLogIfAllCategoriesSet(KDP_LOG_PROCESS)); 723363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 724363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 725e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton log->Printf ("ProcessKDP::StopAsyncThread ()"); 726363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 727363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncThreadShouldExit); 728363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 729363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // Stop the stdio thread 730363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (IS_VALID_LLDB_HOST_THREAD(m_async_thread)) 731363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 732363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Host::ThreadJoin (m_async_thread, NULL, NULL); 733e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton m_async_thread = LLDB_INVALID_HOST_THREAD; 734363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 735363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 736363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 737363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 738363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonvoid * 739363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::AsyncThread (void *arg) 740363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 741363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton ProcessKDP *process = (ProcessKDP*) arg; 742363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 743e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton const lldb::pid_t pid = process->GetID(); 744e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton 745363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton LogSP log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_PROCESS)); 746363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 7475f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("ProcessKDP::AsyncThread (arg = %p, pid = %" PRIu64 ") thread starting...", arg, pid); 748363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 749363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Listener listener ("ProcessKDP::AsyncThread"); 750363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton EventSP event_sp; 751363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton const uint32_t desired_event_mask = eBroadcastBitAsyncContinue | 752363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton eBroadcastBitAsyncThreadShouldExit; 753363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 754e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton 755363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (listener.StartListeningForEvents (&process->m_async_broadcaster, desired_event_mask) == desired_event_mask) 756363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 757363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton bool done = false; 758363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton while (!done) 759363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 760363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 7615f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("ProcessKDP::AsyncThread (pid = %" PRIu64 ") listener.WaitForEvent (NULL, event_sp)...", 762e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton pid); 763363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (listener.WaitForEvent (NULL, event_sp)) 764363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 765e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton uint32_t event_type = event_sp->GetType(); 766e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton if (log) 7675f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("ProcessKDP::AsyncThread (pid = %" PRIu64 ") Got an event of type: %d...", 768e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton pid, 769e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton event_type); 770e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton 771e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // When we are running, poll for 1 second to try and get an exception 772e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // to indicate the process has stopped. If we don't get one, check to 773e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // make sure no one asked us to exit 774e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton bool is_running = false; 775e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton DataExtractor exc_reply_packet; 776e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton do 777363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 778363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton switch (event_type) 779363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 780e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton case eBroadcastBitAsyncContinue: 781363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 782e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton is_running = true; 783e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton if (process->m_comm.WaitForPacketWithTimeoutMicroSeconds (exc_reply_packet, 1 * USEC_PER_SEC)) 784363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 7853acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton ThreadSP thread_sp (process->GetKernelThread(process->GetThreadList(), process->GetThreadList())); 7863acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton thread_sp->GetRegisterContext()->InvalidateAllRegisters(); 7873acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton static_cast<ThreadKDP *>(thread_sp.get())->SetStopInfoFrom_KDP_EXCEPTION (exc_reply_packet); 7883acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 789e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // TODO: parse the stop reply packet 7903acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton is_running = false; 791e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton process->SetPrivateState(eStateStopped); 792e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton } 793e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton else 794e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton { 795e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // Check to see if we are supposed to exit. There is no way to 796e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // interrupt a running kernel, so all we can do is wait for an 797e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // exception or detach... 798e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton if (listener.GetNextEvent(event_sp)) 799e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton { 800e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton // We got an event, go through the loop again 801e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton event_type = event_sp->GetType(); 802e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton } 803363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 804363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 805e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton break; 806363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 807e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton case eBroadcastBitAsyncThreadShouldExit: 808e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton if (log) 8095f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("ProcessKDP::AsyncThread (pid = %" PRIu64 ") got eBroadcastBitAsyncThreadShouldExit...", 810e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton pid); 811e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton done = true; 812e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton is_running = false; 813e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton break; 814363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 815e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton default: 816e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton if (log) 8175f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("ProcessKDP::AsyncThread (pid = %" PRIu64 ") got unknown event 0x%8.8x", 818e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton pid, 819e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton event_type); 820363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton done = true; 821e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton is_running = false; 822e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton break; 823363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 824e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton } while (is_running); 825363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 826363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton else 827363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 828363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 8295f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("ProcessKDP::AsyncThread (pid = %" PRIu64 ") listener.WaitForEvent (NULL, event_sp) => false", 830e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton pid); 831363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton done = true; 832363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 833363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 834363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 835363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 836363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 8375f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("ProcessKDP::AsyncThread (arg = %p, pid = %" PRIu64 ") thread exiting...", 838e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton arg, 839e76f8c408632e2479cbaa1abdcd10a7958fa4846Greg Clayton pid); 840363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 841363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton process->m_async_thread = LLDB_INVALID_HOST_THREAD; 842363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return NULL; 843363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 844363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 845363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 846307c7fdc58d19f734991a176db972cc61d9ada16Greg Claytonclass CommandObjectProcessKDPPacketSend : public CommandObjectParsed 847307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton{ 848307c7fdc58d19f734991a176db972cc61d9ada16Greg Claytonprivate: 849307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 850307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton OptionGroupOptions m_option_group; 851307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton OptionGroupUInt64 m_command_byte; 852307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton OptionGroupString m_packet_data; 853307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 854307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton virtual Options * 855307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton GetOptions () 856307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 857307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton return &m_option_group; 858307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 859307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 860307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 861307c7fdc58d19f734991a176db972cc61d9ada16Greg Claytonpublic: 862307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton CommandObjectProcessKDPPacketSend(CommandInterpreter &interpreter) : 863307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton CommandObjectParsed (interpreter, 864307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton "process plugin packet send", 865307c7fdc58d19f734991a176db972cc61d9ada16Greg 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. ", 866307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton NULL), 867307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton m_option_group (interpreter), 868307c7fdc58d19f734991a176db972cc61d9ada16Greg 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), 869307c7fdc58d19f734991a176db972cc61d9ada16Greg 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) 870307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 871307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton m_option_group.Append (&m_command_byte, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 872307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton m_option_group.Append (&m_packet_data , LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 873307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton m_option_group.Finalize(); 874307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 875307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 876307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton ~CommandObjectProcessKDPPacketSend () 877307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 878307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 879307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 880307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton bool 881307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton DoExecute (Args& command, CommandReturnObject &result) 882307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 883307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton const size_t argc = command.GetArgumentCount(); 884307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton if (argc == 0) 885307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 886307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton if (!m_command_byte.GetOptionValue().OptionWasSet()) 887307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 888307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.AppendError ("the --command option must be set to a valid command byte"); 889307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.SetStatus (eReturnStatusFailed); 890307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 891307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton else 892307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 893307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton const uint64_t command_byte = m_command_byte.GetOptionValue().GetUInt64Value(0); 894307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton if (command_byte > 0 && command_byte <= UINT8_MAX) 895307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 896307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton ProcessKDP *process = (ProcessKDP *)m_interpreter.GetExecutionContext().GetProcessPtr(); 897307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton if (process) 898307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 899307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton const StateType state = process->GetState(); 900307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 901307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton if (StateIsStoppedState (state, true)) 902307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 903307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton std::vector<uint8_t> payload_bytes; 904307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton const char *ascii_hex_bytes_cstr = m_packet_data.GetOptionValue().GetCurrentValue(); 905307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton if (ascii_hex_bytes_cstr && ascii_hex_bytes_cstr[0]) 906307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 907307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton StringExtractor extractor(ascii_hex_bytes_cstr); 908307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton const size_t ascii_hex_bytes_cstr_len = extractor.GetStringRef().size(); 909307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton if (ascii_hex_bytes_cstr_len & 1) 910307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 911307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.AppendErrorWithFormat ("payload data must contain an even number of ASCII hex characters: '%s'", ascii_hex_bytes_cstr); 912307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.SetStatus (eReturnStatusFailed); 913307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton return false; 914307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 915307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton payload_bytes.resize(ascii_hex_bytes_cstr_len/2); 916307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton if (extractor.GetHexBytes(&payload_bytes[0], payload_bytes.size(), '\xdd') != payload_bytes.size()) 917307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 918307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.AppendErrorWithFormat ("payload data must only contain ASCII hex characters (no spaces or hex prefixes): '%s'", ascii_hex_bytes_cstr); 919307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.SetStatus (eReturnStatusFailed); 920307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton return false; 921307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 922307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 923307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton Error error; 924307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton DataExtractor reply; 925307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton process->GetCommunication().SendRawRequest (command_byte, 926307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton payload_bytes.empty() ? NULL : payload_bytes.data(), 927307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton payload_bytes.size(), 928307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton reply, 929307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton error); 930307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 931307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton if (error.Success()) 932307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 933307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton // Copy the binary bytes into a hex ASCII string for the result 934307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton StreamString packet; 935307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton packet.PutBytesAsRawHex8(reply.GetDataStart(), 936307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton reply.GetByteSize(), 937307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton lldb::endian::InlHostByteOrder(), 938307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton lldb::endian::InlHostByteOrder()); 939307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.AppendMessage(packet.GetString().c_str()); 940307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.SetStatus (eReturnStatusSuccessFinishResult); 941307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton return true; 942307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 943307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton else 944307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 945307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton const char *error_cstr = error.AsCString(); 946307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton if (error_cstr && error_cstr[0]) 947307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.AppendError (error_cstr); 948307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton else 949307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.AppendErrorWithFormat ("unknown error 0x%8.8x", error.GetError()); 950307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.SetStatus (eReturnStatusFailed); 951307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton return false; 952307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 953307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 954307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton else 955307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 956307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.AppendErrorWithFormat ("process must be stopped in order to send KDP packets, state is %s", StateAsCString (state)); 957307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.SetStatus (eReturnStatusFailed); 958307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 959307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 960307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton else 961307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 962307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.AppendError ("invalid process"); 963307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.SetStatus (eReturnStatusFailed); 964307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 965307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 966307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton else 967307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 9685f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendErrorWithFormat ("invalid command byte 0x%" PRIx64 ", valid values are 1 - 255", command_byte); 969307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.SetStatus (eReturnStatusFailed); 970307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 971307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 972307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 973307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton else 974307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 975307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.AppendErrorWithFormat ("'%s' takes no arguments, only options.", m_cmd_name.c_str()); 976307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton result.SetStatus (eReturnStatusFailed); 977307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 978307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton return false; 979307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 980307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton}; 981307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 982307c7fdc58d19f734991a176db972cc61d9ada16Greg Claytonclass CommandObjectProcessKDPPacket : public CommandObjectMultiword 983307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton{ 984307c7fdc58d19f734991a176db972cc61d9ada16Greg Claytonprivate: 985307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 986307c7fdc58d19f734991a176db972cc61d9ada16Greg Claytonpublic: 987307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton CommandObjectProcessKDPPacket(CommandInterpreter &interpreter) : 988307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton CommandObjectMultiword (interpreter, 989307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton "process plugin packet", 990307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton "Commands that deal with KDP remote packets.", 991307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton NULL) 992307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 993307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton LoadSubCommand ("send", CommandObjectSP (new CommandObjectProcessKDPPacketSend (interpreter))); 994307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 995307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 996307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton ~CommandObjectProcessKDPPacket () 997307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 998307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 999307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton}; 1000307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 1001307c7fdc58d19f734991a176db972cc61d9ada16Greg Claytonclass CommandObjectMultiwordProcessKDP : public CommandObjectMultiword 1002307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton{ 1003307c7fdc58d19f734991a176db972cc61d9ada16Greg Claytonpublic: 1004307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton CommandObjectMultiwordProcessKDP (CommandInterpreter &interpreter) : 1005307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton CommandObjectMultiword (interpreter, 1006307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton "process plugin", 1007307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton "A set of commands for operating on a ProcessKDP process.", 1008307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton "process plugin <subcommand> [<subcommand-options>]") 1009307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 1010307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton LoadSubCommand ("packet", CommandObjectSP (new CommandObjectProcessKDPPacket (interpreter))); 1011307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 1012307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 1013307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton ~CommandObjectMultiwordProcessKDP () 1014307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton { 1015307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton } 1016307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton}; 1017307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 1018307c7fdc58d19f734991a176db972cc61d9ada16Greg ClaytonCommandObject * 1019307c7fdc58d19f734991a176db972cc61d9ada16Greg ClaytonProcessKDP::GetPluginCommandObject() 1020307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton{ 1021307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton if (!m_command_sp) 1022307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton m_command_sp.reset (new CommandObjectMultiwordProcessKDP (GetTarget().GetDebugger().GetCommandInterpreter())); 1023307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton return m_command_sp.get(); 1024307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton} 1025307c7fdc58d19f734991a176db972cc61d9ada16Greg Clayton 1026