ProcessKDP.cpp revision 1e5b02176d6952d0679479926fa557534313472b
1363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg 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 16363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton#include "lldb/Core/PluginManager.h" 17363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton#include "lldb/Core/State.h" 18363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton#include "lldb/Host/Host.h" 191e5b02176d6952d0679479926fa557534313472bGreg Clayton#include "lldb/Target/Target.h" 20363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 21363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// Project includes 22363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton#include "ProcessKDP.h" 23363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton#include "ProcessKDPLog.h" 24363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//#include "ThreadKDP.h" 25363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton#include "StopInfoMachException.h" 26363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 27363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonusing namespace lldb; 28363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonusing namespace lldb_private; 29363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 30363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonconst char * 31363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::GetPluginNameStatic() 32363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 33363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return "kdp-remote"; 34363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 35363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 36363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonconst char * 37363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::GetPluginDescriptionStatic() 38363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 39363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return "KDP Remote protocol based debugging plug-in for darwin kernel debugging."; 40363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 41363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 42363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonvoid 43363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::Terminate() 44363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 45363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton PluginManager::UnregisterPlugin (ProcessKDP::CreateInstance); 46363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 47363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 48363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 49363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcess* 50363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::CreateInstance (Target &target, Listener &listener) 51363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 52363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return new ProcessKDP (target, listener); 53363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 54363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 55363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonbool 56363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::CanDebug(Target &target) 57363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 58363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // For now we are just making sure the file exists for a given module 59363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton ModuleSP exe_module_sp(target.GetExecutableModule()); 60363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (exe_module_sp.get()) 61363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 62363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton const llvm::Triple &triple_ref = target.GetArchitecture().GetTriple(); 63363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (triple_ref.getOS() == llvm::Triple::Darwin && 64363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton triple_ref.getVendor() == llvm::Triple::Apple) 65363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 66363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 67363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton ObjectFile *exe_objfile = exe_module_sp->GetObjectFile(); 68363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (exe_objfile->GetType() == ObjectFile::eTypeExecutable && 69363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton exe_objfile->GetStrata() == ObjectFile::eStrataKernel) 70363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return true; 71363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 72363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 73363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return false; 74363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 75363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 76363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 77363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// ProcessKDP constructor 78363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 79363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::ProcessKDP(Target& target, Listener &listener) : 80363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Process (target, listener), 81363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_comm("lldb.process.kdp-remote.communication"), 82363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_async_broadcaster ("lldb.process.kdp-remote.async-broadcaster"), 83363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_async_thread (LLDB_INVALID_HOST_THREAD) 84363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 85363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// m_async_broadcaster.SetEventName (eBroadcastBitAsyncThreadShouldExit, "async thread should exit"); 86363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// m_async_broadcaster.SetEventName (eBroadcastBitAsyncContinue, "async thread continue"); 87363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 88363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 89363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 90363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// Destructor 91363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 92363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::~ProcessKDP() 93363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 94363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Clear(); 95363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 96363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 97363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 98363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// PluginInterface 99363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 100363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonconst char * 101363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::GetPluginName() 102363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 103363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return "Process debugging plug-in that uses the Darwin KDP remote protocol"; 104363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 105363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 106363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonconst char * 107363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::GetShortPluginName() 108363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 109363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return GetPluginNameStatic(); 110363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 111363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 112363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonuint32_t 113363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::GetPluginVersion() 114363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 115363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return 1; 116363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 117363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 118363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 119363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::WillLaunch (Module* module) 120363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 121363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 122363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("launching not supported in kdp-remote plug-in"); 123363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 124363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 125363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 126363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 127363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::WillAttachToProcessWithID (lldb::pid_t pid) 128363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 129363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 130363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("attaching to a by process ID not supported in kdp-remote plug-in"); 131363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 132363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 133363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 134363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 135363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::WillAttachToProcessWithName (const char *process_name, bool wait_for_launch) 136363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 137363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 138363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("attaching to a by process name not supported in kdp-remote plug-in"); 139363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 140363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 141363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 142363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 143363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoConnectRemote (const char *remote_url) 144363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 145363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // TODO: fill in the remote connection to the remote KDP here! 146363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 147363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("attaching to a by process name not supported in kdp-remote plug-in"); 148363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 149363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 150363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 151363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 152363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// Process Control 153363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//---------------------------------------------------------------------- 154363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 155363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoLaunch (Module* module, 156363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton char const *argv[], 157363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton char const *envp[], 158363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton uint32_t launch_flags, 159363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton const char *stdin_path, 160363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton const char *stdout_path, 161363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton const char *stderr_path, 162363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton const char *working_dir) 163363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 164363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 165363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("launching not supported in kdp-remote plug-in"); 166363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 167363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 168363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 169363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 170363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 171363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoAttachToProcessWithID (lldb::pid_t attach_pid) 172363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 173363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 174363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("attach to process by ID is not suppported in kdp remote debugging"); 175363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 176363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 177363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 178363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonsize_t 179363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::AttachInputReaderCallback (void *baton, 180363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton InputReader *reader, 181363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton lldb::InputReaderAction notification, 182363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton const char *bytes, 183363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton size_t bytes_len) 184363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 185363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (notification == eInputReaderGotToken) 186363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 187363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// ProcessKDP *process = (ProcessKDP *)baton; 188363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// if (process->m_waiting_for_attach) 189363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// process->m_waiting_for_attach = false; 190363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton reader->SetIsDone(true); 191363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return 1; 192363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 193363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return 0; 194363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 195363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 196363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 197363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoAttachToProcessWithName (const char *process_name, bool wait_for_launch) 198363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 199363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 200363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("attach to process by name is not suppported in kdp remote debugging"); 201363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 202363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 203363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 204363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 205363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonvoid 206363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DidAttach () 207363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 208363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton LogSP log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_PROCESS)); 209363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 210363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton log->Printf ("ProcessKDP::DidLaunch()"); 211363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (GetID() != LLDB_INVALID_PROCESS_ID) 212363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 213363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // TODO: figure out the register context that we will use 214363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 215363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 216363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 217363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 218363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::WillResume () 219363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 220363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return Error(); 221363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 222363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 223363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 224363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoResume () 225363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 226363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 227363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("ProcessKDP::DoResume () is not implemented yet"); 228363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 229363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 230363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 231363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonuint32_t 232363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::UpdateThreadListIfNeeded () 233363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 234363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // locker will keep a mutex locked until it goes out of scope 235363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton LogSP log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_THREAD)); 236363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log && log->GetMask().Test(KDP_LOG_VERBOSE)) 237363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton log->Printf ("ProcessKDP::%s (pid = %i)", __FUNCTION__, GetID()); 238363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 239363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Mutex::Locker locker (m_thread_list.GetMutex ()); 240363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // TODO: get the thread list here! 241363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton const uint32_t stop_id = GetStopID(); 242363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (m_thread_list.GetSize(false) == 0 || stop_id != m_thread_list.GetStopID()) 243363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 244363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // Update the thread list's stop id immediately so we don't recurse into this function. 245363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// ThreadList curr_thread_list (this); 246363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// curr_thread_list.SetStopID(stop_id); 247363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// 248363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// std::vector<lldb::tid_t> thread_ids; 249363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// bool sequence_mutex_unavailable = false; 250363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// const size_t num_thread_ids = m_comm.GetCurrentThreadIDs (thread_ids, sequence_mutex_unavailable); 251363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// if (num_thread_ids > 0) 252363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// { 253363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// for (size_t i=0; i<num_thread_ids; ++i) 254363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// { 255363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// tid_t tid = thread_ids[i]; 256363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// ThreadSP thread_sp (GetThreadList().FindThreadByID (tid, false)); 257363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// if (!thread_sp) 258363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// thread_sp.reset (new ThreadGDBRemote (*this, tid)); 259363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// curr_thread_list.AddThread(thread_sp); 260363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// } 261363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// } 262363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// 263363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// if (sequence_mutex_unavailable == false) 264363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// { 265363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// m_thread_list = curr_thread_list; 266363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// SetThreadStopInfo (m_last_stop_packet); 267363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// } 268363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 269363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return GetThreadList().GetSize(false); 270363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 271363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 272363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 273363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonStateType 274363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::SetThreadStopInfo (StringExtractor& stop_packet) 275363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 276363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // TODO: figure out why we stopped given the packet that tells us we stopped... 277363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return eStateStopped; 278363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 279363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 280363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonvoid 281363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::RefreshStateAfterStop () 282363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 283363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // Let all threads recover from stopping and do any clean up based 284363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // on the previous thread state (if any). 285363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_thread_list.RefreshStateAfterStop(); 286363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton //SetThreadStopInfo (m_last_stop_packet); 287363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 288363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 289363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 290363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoHalt (bool &caused_stop) 291363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 292363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 293363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 294363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// bool timed_out = false; 295363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Mutex::Locker locker; 296363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 297363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (m_public_state.GetValue() == eStateAttaching) 298363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 299363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // We are being asked to halt during an attach. We need to just close 300363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // our file handle and debugserver will go away, and we can be done... 301363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_comm.Disconnect(); 302363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 303363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton else 304363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 305363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // TODO: add the ability to halt a running kernel 306363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("halt not supported in kdp-remote plug-in"); 307363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// if (!m_comm.SendInterrupt (locker, 2, caused_stop, timed_out)) 308363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// { 309363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// if (timed_out) 310363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// error.SetErrorString("timed out sending interrupt packet"); 311363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// else 312363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// error.SetErrorString("unknown error sending interrupt packet"); 313363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// } 314363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 315363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 316363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 317363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 318363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 319363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::InterruptIfRunning (bool discard_thread_plans, 320363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton bool catch_stop_event, 321363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton EventSP &stop_event_sp) 322363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 323363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 324363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 325363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton LogSP log (ProcessKDPLog::GetLogIfAllCategoriesSet(KDP_LOG_PROCESS)); 326363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 327363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton bool paused_private_state_thread = false; 328363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton const bool is_running = m_comm.IsRunning(); 329363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 330363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton log->Printf ("ProcessKDP::InterruptIfRunning(discard_thread_plans=%i, catch_stop_event=%i) is_running=%i", 331363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton discard_thread_plans, 332363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton catch_stop_event, 333363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton is_running); 334363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 335363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (discard_thread_plans) 336363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 337363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 338363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton log->Printf ("ProcessKDP::InterruptIfRunning() discarding all thread plans"); 339363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_thread_list.DiscardThreadPlans(); 340363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 341363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (is_running) 342363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 343363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (catch_stop_event) 344363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 345363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 346363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton log->Printf ("ProcessKDP::InterruptIfRunning() pausing private state thread"); 347363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton PausePrivateStateThread(); 348363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton paused_private_state_thread = true; 349363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 350363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 351363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton bool timed_out = false; 352363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// bool sent_interrupt = false; 353363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Mutex::Locker locker; 354363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 355363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // TODO: implement halt in CommunicationKDP 356363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// if (!m_comm.SendInterrupt (locker, 1, sent_interrupt, timed_out)) 357363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// { 358363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// if (timed_out) 359363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// error.SetErrorString("timed out sending interrupt packet"); 360363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// else 361363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// error.SetErrorString("unknown error sending interrupt packet"); 362363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// if (paused_private_state_thread) 363363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// ResumePrivateStateThread(); 364363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// return error; 365363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// } 366363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 367363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (catch_stop_event) 368363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 369363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // LISTEN HERE 370363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton TimeValue timeout_time; 371363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton timeout_time = TimeValue::Now(); 372363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton timeout_time.OffsetWithSeconds(5); 373363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton StateType state = WaitForStateChangedEventsPrivate (&timeout_time, stop_event_sp); 374363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 375363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton timed_out = state == eStateInvalid; 376363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 377363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton log->Printf ("ProcessKDP::InterruptIfRunning() catch stop event: state = %s, timed-out=%i", StateAsCString(state), timed_out); 378363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 379363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (timed_out) 380363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString("unable to verify target stopped"); 381363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 382363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 383363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (paused_private_state_thread) 384363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 385363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 386363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton log->Printf ("ProcessKDP::InterruptIfRunning() resuming private state thread"); 387363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton ResumePrivateStateThread(); 388363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 389363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 390363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 391363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 392363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 393363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 394363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::WillDetach () 395363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 396363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton LogSP log (ProcessKDPLog::GetLogIfAllCategoriesSet(KDP_LOG_PROCESS)); 397363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 398363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton log->Printf ("ProcessKDP::WillDetach()"); 399363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 400363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton bool discard_thread_plans = true; 401363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton bool catch_stop_event = true; 402363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton EventSP event_sp; 403363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return InterruptIfRunning (discard_thread_plans, catch_stop_event, event_sp); 404363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 405363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 406363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 407363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoDetach() 408363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 409363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 410363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton LogSP log (ProcessKDPLog::GetLogIfAllCategoriesSet(KDP_LOG_PROCESS)); 411363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 412363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton log->Printf ("ProcessKDP::DoDetach()"); 413363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 414363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton DisableAllBreakpointSites (); 415363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 416363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_thread_list.DiscardThreadPlans(); 417363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 4181e5b02176d6952d0679479926fa557534313472bGreg Clayton size_t response_size = m_comm.Disconnect (); 419363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 420363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 421363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (response_size) 422363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton log->PutCString ("ProcessKDP::DoDetach() detach packet sent successfully"); 423363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton else 424363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton log->PutCString ("ProcessKDP::DoDetach() detach packet send failed"); 425363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 426363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // Sleep for one second to let the process get all detached... 427363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton StopAsyncThread (); 428363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 429363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_comm.StopReadThread(); 430363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_comm.Disconnect(); // Disconnect from the debug server. 431363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 432363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton SetPrivateState (eStateDetached); 433363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton ResumePrivateStateThread(); 434363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 435363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton //KillDebugserverProcess (); 436363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 437363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 438363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 439363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 440363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoDestroy () 441363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 442363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 443363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton LogSP log (ProcessKDPLog::GetLogIfAllCategoriesSet(KDP_LOG_PROCESS)); 444363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 445363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton log->Printf ("ProcessKDP::DoDestroy()"); 446363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 447363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // Interrupt if our inferior is running... 448363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (m_comm.IsConnected()) 449363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 450363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (m_public_state.GetValue() == eStateAttaching) 451363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 452363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // We are being asked to halt during an attach. We need to just close 453363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // our file handle and debugserver will go away, and we can be done... 454363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_comm.Disconnect(); 455363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 456363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton else 457363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 458363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 459363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton StringExtractor response; 460363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // TODO: Send kill packet? 461363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton SetExitStatus(SIGABRT, NULL); 462363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 463363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 464363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton StopAsyncThread (); 465363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_comm.StopReadThread(); 466363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_comm.Disconnect(); // Disconnect from the debug server. 467363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 468363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 469363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 470363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//------------------------------------------------------------------ 471363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// Process Queries 472363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//------------------------------------------------------------------ 473363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 474363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonbool 475363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::IsAlive () 476363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 477363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return m_comm.IsConnected() && m_private_state.GetValue() != eStateExited; 478363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 479363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 480363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//------------------------------------------------------------------ 481363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// Process Memory 482363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton//------------------------------------------------------------------ 483363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonsize_t 484363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoReadMemory (addr_t addr, void *buf, size_t size, Error &error) 485363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 486363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("ProcessKDP::DoReadMemory not implemented"); 487363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return 0; 488363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 489363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 490363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonsize_t 491363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoWriteMemory (addr_t addr, const void *buf, size_t size, Error &error) 492363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 493363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("ProcessKDP::DoReadMemory not implemented"); 494363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return 0; 495363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 496363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 497363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonlldb::addr_t 498363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoAllocateMemory (size_t size, uint32_t permissions, Error &error) 499363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 500363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("memory allocation not suppported in kdp remote debugging"); 501363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return LLDB_INVALID_ADDRESS; 502363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 503363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 504363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 505363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoDeallocateMemory (lldb::addr_t addr) 506363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 507363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 508363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("memory deallocation not suppported in kdp remote debugging"); 509363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 510363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 511363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 512363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 513363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::EnableBreakpoint (BreakpointSite *bp_site) 514363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 515363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return EnableSoftwareBreakpoint (bp_site); 516363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 517363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 518363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 519363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DisableBreakpoint (BreakpointSite *bp_site) 520363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 521363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return DisableSoftwareBreakpoint (bp_site); 522363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 523363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 524363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 525363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::EnableWatchpoint (WatchpointLocation *wp) 526363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 527363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 528363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("watchpoints are not suppported in kdp remote debugging"); 529363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 530363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 531363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 532363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 533363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DisableWatchpoint (WatchpointLocation *wp) 534363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 535363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 536363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("watchpoints are not suppported in kdp remote debugging"); 537363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 538363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 539363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 540363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonvoid 541363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::Clear() 542363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 543363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Mutex::Locker locker (m_thread_list.GetMutex ()); 544363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_thread_list.Clear(); 545363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 546363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 547363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonError 548363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::DoSignal (int signo) 549363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 550363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Error error; 551363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton error.SetErrorString ("sending signals is not suppported in kdp remote debugging"); 552363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return error; 553363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 554363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 555363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonvoid 556363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::Initialize() 557363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 558363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton static bool g_initialized = false; 559363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 560363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (g_initialized == false) 561363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 562363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton g_initialized = true; 563363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton PluginManager::RegisterPlugin (GetPluginNameStatic(), 564363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton GetPluginDescriptionStatic(), 565363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton CreateInstance); 566363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 567363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Log::Callbacks log_callbacks = { 568363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton ProcessKDPLog::DisableLog, 569363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton ProcessKDPLog::EnableLog, 570363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton ProcessKDPLog::ListLogCategories 571363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton }; 572363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 573363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Log::RegisterLogChannel (ProcessKDP::GetPluginNameStatic(), log_callbacks); 574363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 575363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 576363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 577363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonbool 578363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::StartAsyncThread () 579363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 580363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton LogSP log (ProcessKDPLog::GetLogIfAllCategoriesSet(KDP_LOG_PROCESS)); 581363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 582363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 583363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton log->Printf ("ProcessKDP::%s ()", __FUNCTION__); 584363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 585363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // Create a thread that watches our internal state and controls which 586363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // events make it to clients (into the DCProcess event queue). 587363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_async_thread = Host::ThreadCreate ("<lldb.process.kdp-remote.async>", ProcessKDP::AsyncThread, this, NULL); 588363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return IS_VALID_LLDB_HOST_THREAD(m_async_thread); 589363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 590363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 591363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonvoid 592363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::StopAsyncThread () 593363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 594363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton LogSP log (ProcessKDPLog::GetLogIfAllCategoriesSet(KDP_LOG_PROCESS)); 595363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 596363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 597363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton log->Printf ("ProcessKDP::%s ()", __FUNCTION__); 598363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 599363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncThreadShouldExit); 600363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 601363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // Stop the stdio thread 602363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (IS_VALID_LLDB_HOST_THREAD(m_async_thread)) 603363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 604363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Host::ThreadJoin (m_async_thread, NULL, NULL); 605363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 606363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 607363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 608363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 609363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Claytonvoid * 610363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg ClaytonProcessKDP::AsyncThread (void *arg) 611363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton{ 612363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton ProcessKDP *process = (ProcessKDP*) arg; 613363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 614363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton LogSP log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_PROCESS)); 615363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 616363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton log->Printf ("ProcessKDP::%s (arg = %p, pid = %i) thread starting...", __FUNCTION__, arg, process->GetID()); 617363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 618363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton Listener listener ("ProcessKDP::AsyncThread"); 619363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton EventSP event_sp; 620363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton const uint32_t desired_event_mask = eBroadcastBitAsyncContinue | 621363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton eBroadcastBitAsyncThreadShouldExit; 622363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 623363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (listener.StartListeningForEvents (&process->m_async_broadcaster, desired_event_mask) == desired_event_mask) 624363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 625363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton listener.StartListeningForEvents (&process->m_comm, Communication::eBroadcastBitReadThreadDidExit); 626363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 627363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton bool done = false; 628363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton while (!done) 629363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 630363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 631363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton log->Printf ("ProcessKDP::%s (arg = %p, pid = %i) listener.WaitForEvent (NULL, event_sp)...", __FUNCTION__, arg, process->GetID()); 632363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (listener.WaitForEvent (NULL, event_sp)) 633363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 634363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton const uint32_t event_type = event_sp->GetType(); 635363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (event_sp->BroadcasterIs (&process->m_async_broadcaster)) 636363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 637363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 638363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton log->Printf ("ProcessKDP::%s (arg = %p, pid = %i) Got an event of type: %d...", __FUNCTION__, arg, process->GetID(), event_type); 639363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 640363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton switch (event_type) 641363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 642363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton case eBroadcastBitAsyncContinue: 643363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 644363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton const EventDataBytes *continue_packet = EventDataBytes::GetEventDataFromEvent(event_sp.get()); 645363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 646363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (continue_packet) 647363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 648363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton // TODO: do continue support here 649363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 650363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// const char *continue_cstr = (const char *)continue_packet->GetBytes (); 651363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// const size_t continue_cstr_len = continue_packet->GetByteSize (); 652363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// if (log) 653363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// log->Printf ("ProcessKDP::%s (arg = %p, pid = %i) got eBroadcastBitAsyncContinue: %s", __FUNCTION__, arg, process->GetID(), continue_cstr); 654363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// 655363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// if (::strstr (continue_cstr, "vAttach") == NULL) 656363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// process->SetPrivateState(eStateRunning); 657363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// StringExtractor response; 658363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// StateType stop_state = process->GetCommunication().SendContinuePacketAndWaitForResponse (process, continue_cstr, continue_cstr_len, response); 659363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// 660363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// switch (stop_state) 661363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// { 662363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// case eStateStopped: 663363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// case eStateCrashed: 664363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// case eStateSuspended: 665363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// process->m_last_stop_packet = response; 666363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// process->SetPrivateState (stop_state); 667363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// break; 668363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// 669363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// case eStateExited: 670363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// process->m_last_stop_packet = response; 671363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// response.SetFilePos(1); 672363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// process->SetExitStatus(response.GetHexU8(), NULL); 673363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// done = true; 674363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// break; 675363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// 676363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// case eStateInvalid: 677363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// process->SetExitStatus(-1, "lost connection"); 678363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// break; 679363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// 680363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// default: 681363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// process->SetPrivateState (stop_state); 682363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// break; 683363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton// } 684363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 685363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 686363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton break; 687363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 688363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton case eBroadcastBitAsyncThreadShouldExit: 689363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 690363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton log->Printf ("ProcessKDP::%s (arg = %p, pid = %i) got eBroadcastBitAsyncThreadShouldExit...", __FUNCTION__, arg, process->GetID()); 691363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton done = true; 692363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton break; 693363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 694363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton default: 695363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 696363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton log->Printf ("ProcessKDP::%s (arg = %p, pid = %i) got unknown event 0x%8.8x", __FUNCTION__, arg, process->GetID(), event_type); 697363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton done = true; 698363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton break; 699363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 700363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 701363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton else if (event_sp->BroadcasterIs (&process->m_comm)) 702363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 703363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (event_type & Communication::eBroadcastBitReadThreadDidExit) 704363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 705363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton process->SetExitStatus (-1, "lost connection"); 706363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton done = true; 707363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 708363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 709363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 710363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton else 711363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton { 712363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 713363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton log->Printf ("ProcessKDP::%s (arg = %p, pid = %i) listener.WaitForEvent (NULL, event_sp) => false", __FUNCTION__, arg, process->GetID()); 714363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton done = true; 715363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 716363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 717363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton } 718363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 719363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton if (log) 720363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton log->Printf ("ProcessKDP::%s (arg = %p, pid = %i) thread exiting...", __FUNCTION__, arg, process->GetID()); 721363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 722363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton process->m_async_thread = LLDB_INVALID_HOST_THREAD; 723363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton return NULL; 724363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton} 725363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 726363be3fc515bea8baf2c5031f3c62f6326d9e1b8Greg Clayton 727