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