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