1 //===-- ProcessKDP.cpp ------------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // C Includes
11 #include <errno.h>
12 #include <stdlib.h>
13 
14 // C++ Includes
15 // Other libraries and framework includes
16 #include "lldb/Core/ConnectionFileDescriptor.h"
17 #include "lldb/Core/Debugger.h"
18 #include "lldb/Core/PluginManager.h"
19 #include "lldb/Core/Module.h"
20 #include "lldb/Core/ModuleSpec.h"
21 #include "lldb/Core/State.h"
22 #include "lldb/Core/UUID.h"
23 #include "lldb/Host/Host.h"
24 #include "lldb/Host/Symbols.h"
25 #include "lldb/Interpreter/CommandInterpreter.h"
26 #include "lldb/Interpreter/CommandObject.h"
27 #include "lldb/Interpreter/CommandObjectMultiword.h"
28 #include "lldb/Interpreter/CommandReturnObject.h"
29 #include "lldb/Interpreter/OptionGroupString.h"
30 #include "lldb/Interpreter/OptionGroupUInt64.h"
31 #include "lldb/Symbol/ObjectFile.h"
32 #include "lldb/Target/RegisterContext.h"
33 #include "lldb/Target/Target.h"
34 #include "lldb/Target/Thread.h"
35 
36 // Project includes
37 #include "ProcessKDP.h"
38 #include "ProcessKDPLog.h"
39 #include "ThreadKDP.h"
40 #include "Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.h"
41 #include "Plugins/DynamicLoader/Static/DynamicLoaderStatic.h"
42 #include "Utility/StringExtractor.h"
43 
44 using namespace lldb;
45 using namespace lldb_private;
46 
47 const char *
48 ProcessKDP::GetPluginNameStatic()
49 {
50     return "kdp-remote";
51 }
52 
53 const char *
54 ProcessKDP::GetPluginDescriptionStatic()
55 {
56     return "KDP Remote protocol based debugging plug-in for darwin kernel debugging.";
57 }
58 
59 void
60 ProcessKDP::Terminate()
61 {
62     PluginManager::UnregisterPlugin (ProcessKDP::CreateInstance);
63 }
64 
65 
66 lldb::ProcessSP
67 ProcessKDP::CreateInstance (Target &target,
68                             Listener &listener,
69                             const FileSpec *crash_file_path)
70 {
71     lldb::ProcessSP process_sp;
72     if (crash_file_path == NULL)
73         process_sp.reset(new ProcessKDP (target, listener));
74     return process_sp;
75 }
76 
77 bool
78 ProcessKDP::CanDebug(Target &target, bool plugin_specified_by_name)
79 {
80     if (plugin_specified_by_name)
81         return true;
82 
83     // For now we are just making sure the file exists for a given module
84     Module *exe_module = target.GetExecutableModulePointer();
85     if (exe_module)
86     {
87         const llvm::Triple &triple_ref = target.GetArchitecture().GetTriple();
88         switch (triple_ref.getOS())
89         {
90             case llvm::Triple::Darwin:  // Should use "macosx" for desktop and "ios" for iOS, but accept darwin just in case
91             case llvm::Triple::MacOSX:  // For desktop targets
92             case llvm::Triple::IOS:     // For arm targets
93                 if (triple_ref.getVendor() == llvm::Triple::Apple)
94                 {
95                     ObjectFile *exe_objfile = exe_module->GetObjectFile();
96                     if (exe_objfile->GetType() == ObjectFile::eTypeExecutable &&
97                         exe_objfile->GetStrata() == ObjectFile::eStrataKernel)
98                         return true;
99                 }
100                 break;
101 
102             default:
103                 break;
104         }
105     }
106     return false;
107 }
108 
109 //----------------------------------------------------------------------
110 // ProcessKDP constructor
111 //----------------------------------------------------------------------
112 ProcessKDP::ProcessKDP(Target& target, Listener &listener) :
113     Process (target, listener),
114     m_comm("lldb.process.kdp-remote.communication"),
115     m_async_broadcaster (NULL, "lldb.process.kdp-remote.async-broadcaster"),
116     m_async_thread (LLDB_INVALID_HOST_THREAD),
117     m_dyld_plugin_name (),
118     m_kernel_load_addr (LLDB_INVALID_ADDRESS),
119     m_command_sp()
120 {
121     m_async_broadcaster.SetEventName (eBroadcastBitAsyncThreadShouldExit,   "async thread should exit");
122     m_async_broadcaster.SetEventName (eBroadcastBitAsyncContinue,           "async thread continue");
123 }
124 
125 //----------------------------------------------------------------------
126 // Destructor
127 //----------------------------------------------------------------------
128 ProcessKDP::~ProcessKDP()
129 {
130     Clear();
131     // We need to call finalize on the process before destroying ourselves
132     // to make sure all of the broadcaster cleanup goes as planned. If we
133     // destruct this class, then Process::~Process() might have problems
134     // trying to fully destroy the broadcaster.
135     Finalize();
136 }
137 
138 //----------------------------------------------------------------------
139 // PluginInterface
140 //----------------------------------------------------------------------
141 const char *
142 ProcessKDP::GetPluginName()
143 {
144     return "Process debugging plug-in that uses the Darwin KDP remote protocol";
145 }
146 
147 const char *
148 ProcessKDP::GetShortPluginName()
149 {
150     return GetPluginNameStatic();
151 }
152 
153 uint32_t
154 ProcessKDP::GetPluginVersion()
155 {
156     return 1;
157 }
158 
159 Error
160 ProcessKDP::WillLaunch (Module* module)
161 {
162     Error error;
163     error.SetErrorString ("launching not supported in kdp-remote plug-in");
164     return error;
165 }
166 
167 Error
168 ProcessKDP::WillAttachToProcessWithID (lldb::pid_t pid)
169 {
170     Error error;
171     error.SetErrorString ("attaching to a by process ID not supported in kdp-remote plug-in");
172     return error;
173 }
174 
175 Error
176 ProcessKDP::WillAttachToProcessWithName (const char *process_name, bool wait_for_launch)
177 {
178     Error error;
179     error.SetErrorString ("attaching to a by process name not supported in kdp-remote plug-in");
180     return error;
181 }
182 
183 Error
184 ProcessKDP::DoConnectRemote (Stream *strm, const char *remote_url)
185 {
186     Error error;
187 
188     // Don't let any JIT happen when doing KDP as we can't allocate
189     // memory and we don't want to be mucking with threads that might
190     // already be handling exceptions
191     SetCanJIT(false);
192 
193     if (remote_url == NULL || remote_url[0] == '\0')
194     {
195         error.SetErrorStringWithFormat ("invalid connection URL '%s'", remote_url);
196         return error;
197     }
198 
199     std::auto_ptr<ConnectionFileDescriptor> conn_ap(new ConnectionFileDescriptor());
200     if (conn_ap.get())
201     {
202         // Only try once for now.
203         // TODO: check if we should be retrying?
204         const uint32_t max_retry_count = 1;
205         for (uint32_t retry_count = 0; retry_count < max_retry_count; ++retry_count)
206         {
207             if (conn_ap->Connect(remote_url, &error) == eConnectionStatusSuccess)
208                 break;
209             usleep (100000);
210         }
211     }
212 
213     if (conn_ap->IsConnected())
214     {
215         const uint16_t reply_port = conn_ap->GetReadPort ();
216 
217         if (reply_port != 0)
218         {
219             m_comm.SetConnection(conn_ap.release());
220 
221             if (m_comm.SendRequestReattach(reply_port))
222             {
223                 if (m_comm.SendRequestConnect(reply_port, reply_port, "Greetings from LLDB..."))
224                 {
225                     m_comm.GetVersion();
226                     uint32_t cpu = m_comm.GetCPUType();
227                     uint32_t sub = m_comm.GetCPUSubtype();
228                     ArchSpec kernel_arch;
229                     kernel_arch.SetArchitecture(eArchTypeMachO, cpu, sub);
230                     m_target.SetArchitecture(kernel_arch);
231 
232                     /* Get the kernel's UUID and load address via KDP_KERNELVERSION packet.  */
233                     /* An EFI kdp session has neither UUID nor load address. */
234 
235                     UUID kernel_uuid = m_comm.GetUUID ();
236                     addr_t kernel_load_addr = m_comm.GetLoadAddress ();
237 
238                     if (m_comm.RemoteIsEFI ())
239                     {
240                         m_dyld_plugin_name = DynamicLoaderStatic::GetPluginNameStatic();
241                     }
242                     else if (kernel_load_addr != LLDB_INVALID_ADDRESS)
243                     {
244                         m_kernel_load_addr = kernel_load_addr;
245                         m_dyld_plugin_name = DynamicLoaderDarwinKernel::GetPluginNameStatic();
246                     }
247 
248                     // Set the thread ID
249                     UpdateThreadListIfNeeded ();
250                     SetID (1);
251                     GetThreadList ();
252                     SetPrivateState (eStateStopped);
253                     StreamSP async_strm_sp(m_target.GetDebugger().GetAsyncOutputStream());
254                     if (async_strm_sp)
255                     {
256                         const char *cstr;
257                         if ((cstr = m_comm.GetKernelVersion ()) != NULL)
258                         {
259                             async_strm_sp->Printf ("Version: %s\n", cstr);
260                             async_strm_sp->Flush();
261                         }
262 //                      if ((cstr = m_comm.GetImagePath ()) != NULL)
263 //                      {
264 //                          async_strm_sp->Printf ("Image Path: %s\n", cstr);
265 //                          async_strm_sp->Flush();
266 //                      }
267                     }
268                 }
269                 else
270                 {
271                     error.SetErrorString("KDP_REATTACH failed");
272                 }
273             }
274             else
275             {
276                 error.SetErrorString("KDP_REATTACH failed");
277             }
278         }
279         else
280         {
281             error.SetErrorString("invalid reply port from UDP connection");
282         }
283     }
284     else
285     {
286         if (error.Success())
287             error.SetErrorStringWithFormat ("failed to connect to '%s'", remote_url);
288     }
289     if (error.Fail())
290         m_comm.Disconnect();
291 
292     return error;
293 }
294 
295 //----------------------------------------------------------------------
296 // Process Control
297 //----------------------------------------------------------------------
298 Error
299 ProcessKDP::DoLaunch (Module *exe_module,
300                       const ProcessLaunchInfo &launch_info)
301 {
302     Error error;
303     error.SetErrorString ("launching not supported in kdp-remote plug-in");
304     return error;
305 }
306 
307 
308 Error
309 ProcessKDP::DoAttachToProcessWithID (lldb::pid_t attach_pid)
310 {
311     Error error;
312     error.SetErrorString ("attach to process by ID is not suppported in kdp remote debugging");
313     return error;
314 }
315 
316 Error
317 ProcessKDP::DoAttachToProcessWithID (lldb::pid_t attach_pid, const ProcessAttachInfo &attach_info)
318 {
319     Error error;
320     error.SetErrorString ("attach to process by ID is not suppported in kdp remote debugging");
321     return error;
322 }
323 
324 Error
325 ProcessKDP::DoAttachToProcessWithName (const char *process_name, bool wait_for_launch, const ProcessAttachInfo &attach_info)
326 {
327     Error error;
328     error.SetErrorString ("attach to process by name is not suppported in kdp remote debugging");
329     return error;
330 }
331 
332 
333 void
334 ProcessKDP::DidAttach ()
335 {
336     Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_PROCESS));
337     if (log)
338         log->Printf ("ProcessKDP::DidAttach()");
339     if (GetID() != LLDB_INVALID_PROCESS_ID)
340     {
341         // TODO: figure out the register context that we will use
342     }
343 }
344 
345 addr_t
346 ProcessKDP::GetImageInfoAddress()
347 {
348     return m_kernel_load_addr;
349 }
350 
351 lldb_private::DynamicLoader *
352 ProcessKDP::GetDynamicLoader ()
353 {
354     if (m_dyld_ap.get() == NULL)
355         m_dyld_ap.reset (DynamicLoader::FindPlugin(this, m_dyld_plugin_name.empty() ? NULL : m_dyld_plugin_name.c_str()));
356     return m_dyld_ap.get();
357 }
358 
359 Error
360 ProcessKDP::WillResume ()
361 {
362     return Error();
363 }
364 
365 Error
366 ProcessKDP::DoResume ()
367 {
368     Error error;
369     Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_PROCESS));
370     // Only start the async thread if we try to do any process control
371     if (!IS_VALID_LLDB_HOST_THREAD(m_async_thread))
372         StartAsyncThread ();
373 
374     bool resume = false;
375 
376     // With KDP there is only one thread we can tell what to do
377     ThreadSP kernel_thread_sp (GetKernelThread(m_thread_list, m_thread_list));
378     if (kernel_thread_sp)
379     {
380         const StateType thread_resume_state = kernel_thread_sp->GetTemporaryResumeState();
381         switch (thread_resume_state)
382         {
383             case eStateSuspended:
384                 // Nothing to do here when a thread will stay suspended
385                 // we just leave the CPU mask bit set to zero for the thread
386                 break;
387 
388             case eStateStepping:
389                 kernel_thread_sp->GetRegisterContext()->HardwareSingleStep (true);
390                 resume = true;
391                 break;
392 
393             case eStateRunning:
394                 kernel_thread_sp->GetRegisterContext()->HardwareSingleStep (false);
395                 resume = true;
396                 break;
397 
398             default:
399                 // The only valid thread resume states are listed above
400                 assert (!"invalid thread resume state");
401                 break;
402         }
403     }
404 
405     if (resume)
406     {
407         if (log)
408             log->Printf ("ProcessKDP::DoResume () sending resume");
409 
410         if (m_comm.SendRequestResume ())
411         {
412             m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncContinue);
413             SetPrivateState(eStateRunning);
414         }
415         else
416             error.SetErrorString ("KDP resume failed");
417     }
418     else
419     {
420         error.SetErrorString ("kernel thread is suspended");
421     }
422 
423     return error;
424 }
425 
426 lldb::ThreadSP
427 ProcessKDP::GetKernelThread(ThreadList &old_thread_list, ThreadList &new_thread_list)
428 {
429     // KDP only tells us about one thread/core. Any other threads will usually
430     // be the ones that are read from memory by the OS plug-ins.
431     const lldb::tid_t kernel_tid = 1;
432     ThreadSP thread_sp (old_thread_list.FindThreadByID (kernel_tid, false));
433     if (!thread_sp)
434     {
435         thread_sp.reset(new ThreadKDP (*this, kernel_tid));
436         new_thread_list.AddThread(thread_sp);
437     }
438     return thread_sp;
439 }
440 
441 
442 
443 
444 bool
445 ProcessKDP::UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_thread_list)
446 {
447     // locker will keep a mutex locked until it goes out of scope
448     Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_THREAD));
449     if (log && log->GetMask().Test(KDP_LOG_VERBOSE))
450         log->Printf ("ProcessKDP::%s (pid = %" PRIu64 ")", __FUNCTION__, GetID());
451 
452     // Even though there is a CPU mask, it doesn't mean to can see each CPU
453     // indivudually, there is really only one. Lets call this thread 1.
454     GetKernelThread (old_thread_list, new_thread_list);
455 
456     return new_thread_list.GetSize(false) > 0;
457 }
458 
459 void
460 ProcessKDP::RefreshStateAfterStop ()
461 {
462     // Let all threads recover from stopping and do any clean up based
463     // on the previous thread state (if any).
464     m_thread_list.RefreshStateAfterStop();
465 }
466 
467 Error
468 ProcessKDP::DoHalt (bool &caused_stop)
469 {
470     Error error;
471 
472     if (m_comm.IsRunning())
473     {
474         if (m_destroy_in_process)
475         {
476             // If we are attemping to destroy, we need to not return an error to
477             // Halt or DoDestroy won't get called.
478             // We are also currently running, so send a process stopped event
479             SetPrivateState (eStateStopped);
480         }
481         else
482         {
483             error.SetErrorString ("KDP cannot interrupt a running kernel");
484         }
485     }
486     return error;
487 }
488 
489 Error
490 ProcessKDP::DoDetach()
491 {
492     Error error;
493     Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet(KDP_LOG_PROCESS));
494     if (log)
495         log->Printf ("ProcessKDP::DoDetach()");
496 
497     if (m_comm.IsRunning())
498     {
499         // We are running and we can't interrupt a running kernel, so we need
500         // to just close the connection to the kernel and hope for the best
501     }
502     else
503     {
504         DisableAllBreakpointSites ();
505 
506         m_thread_list.DiscardThreadPlans();
507 
508         if (m_comm.IsConnected())
509         {
510 
511             m_comm.SendRequestDisconnect();
512 
513             size_t response_size = m_comm.Disconnect ();
514             if (log)
515             {
516                 if (response_size)
517                     log->PutCString ("ProcessKDP::DoDetach() detach packet sent successfully");
518                 else
519                     log->PutCString ("ProcessKDP::DoDetach() detach packet send failed");
520             }
521         }
522     }
523     StopAsyncThread ();
524     m_comm.Clear();
525 
526     SetPrivateState (eStateDetached);
527     ResumePrivateStateThread();
528 
529     //KillDebugserverProcess ();
530     return error;
531 }
532 
533 Error
534 ProcessKDP::DoDestroy ()
535 {
536     // For KDP there really is no difference between destroy and detach
537     return DoDetach();
538 }
539 
540 //------------------------------------------------------------------
541 // Process Queries
542 //------------------------------------------------------------------
543 
544 bool
545 ProcessKDP::IsAlive ()
546 {
547     return m_comm.IsConnected() && m_private_state.GetValue() != eStateExited;
548 }
549 
550 //------------------------------------------------------------------
551 // Process Memory
552 //------------------------------------------------------------------
553 size_t
554 ProcessKDP::DoReadMemory (addr_t addr, void *buf, size_t size, Error &error)
555 {
556     if (m_comm.IsConnected())
557         return m_comm.SendRequestReadMemory (addr, buf, size, error);
558     error.SetErrorString ("not connected");
559     return 0;
560 }
561 
562 size_t
563 ProcessKDP::DoWriteMemory (addr_t addr, const void *buf, size_t size, Error &error)
564 {
565     if (m_comm.IsConnected())
566         return m_comm.SendRequestWriteMemory (addr, buf, size, error);
567     error.SetErrorString ("not connected");
568     return 0;
569 }
570 
571 lldb::addr_t
572 ProcessKDP::DoAllocateMemory (size_t size, uint32_t permissions, Error &error)
573 {
574     error.SetErrorString ("memory allocation not suppported in kdp remote debugging");
575     return LLDB_INVALID_ADDRESS;
576 }
577 
578 Error
579 ProcessKDP::DoDeallocateMemory (lldb::addr_t addr)
580 {
581     Error error;
582     error.SetErrorString ("memory deallocation not suppported in kdp remote debugging");
583     return error;
584 }
585 
586 Error
587 ProcessKDP::EnableBreakpointSite (BreakpointSite *bp_site)
588 {
589     if (m_comm.LocalBreakpointsAreSupported ())
590     {
591         Error error;
592         if (!bp_site->IsEnabled())
593         {
594             if (m_comm.SendRequestBreakpoint(true, bp_site->GetLoadAddress()))
595             {
596                 bp_site->SetEnabled(true);
597                 bp_site->SetType (BreakpointSite::eExternal);
598             }
599             else
600             {
601                 error.SetErrorString ("KDP set breakpoint failed");
602             }
603         }
604         return error;
605     }
606     return EnableSoftwareBreakpoint (bp_site);
607 }
608 
609 Error
610 ProcessKDP::DisableBreakpointSite (BreakpointSite *bp_site)
611 {
612     if (m_comm.LocalBreakpointsAreSupported ())
613     {
614         Error error;
615         if (bp_site->IsEnabled())
616         {
617             BreakpointSite::Type bp_type = bp_site->GetType();
618             if (bp_type == BreakpointSite::eExternal)
619             {
620                 if (m_destroy_in_process && m_comm.IsRunning())
621                 {
622                     // We are trying to destroy our connection and we are running
623                     bp_site->SetEnabled(false);
624                 }
625                 else
626                 {
627                     if (m_comm.SendRequestBreakpoint(false, bp_site->GetLoadAddress()))
628                         bp_site->SetEnabled(false);
629                     else
630                         error.SetErrorString ("KDP remove breakpoint failed");
631                 }
632             }
633             else
634             {
635                 error = DisableSoftwareBreakpoint (bp_site);
636             }
637         }
638         return error;
639     }
640     return DisableSoftwareBreakpoint (bp_site);
641 }
642 
643 Error
644 ProcessKDP::EnableWatchpoint (Watchpoint *wp, bool notify)
645 {
646     Error error;
647     error.SetErrorString ("watchpoints are not suppported in kdp remote debugging");
648     return error;
649 }
650 
651 Error
652 ProcessKDP::DisableWatchpoint (Watchpoint *wp, bool notify)
653 {
654     Error error;
655     error.SetErrorString ("watchpoints are not suppported in kdp remote debugging");
656     return error;
657 }
658 
659 void
660 ProcessKDP::Clear()
661 {
662     m_thread_list.Clear();
663 }
664 
665 Error
666 ProcessKDP::DoSignal (int signo)
667 {
668     Error error;
669     error.SetErrorString ("sending signals is not suppported in kdp remote debugging");
670     return error;
671 }
672 
673 void
674 ProcessKDP::Initialize()
675 {
676     static bool g_initialized = false;
677 
678     if (g_initialized == false)
679     {
680         g_initialized = true;
681         PluginManager::RegisterPlugin (GetPluginNameStatic(),
682                                        GetPluginDescriptionStatic(),
683                                        CreateInstance);
684 
685         Log::Callbacks log_callbacks = {
686             ProcessKDPLog::DisableLog,
687             ProcessKDPLog::EnableLog,
688             ProcessKDPLog::ListLogCategories
689         };
690 
691         Log::RegisterLogChannel (ProcessKDP::GetPluginNameStatic(), log_callbacks);
692     }
693 }
694 
695 bool
696 ProcessKDP::StartAsyncThread ()
697 {
698     Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet(KDP_LOG_PROCESS));
699 
700     if (log)
701         log->Printf ("ProcessKDP::StartAsyncThread ()");
702 
703     if (IS_VALID_LLDB_HOST_THREAD(m_async_thread))
704         return true;
705 
706     m_async_thread = Host::ThreadCreate ("<lldb.process.kdp-remote.async>", ProcessKDP::AsyncThread, this, NULL);
707     return IS_VALID_LLDB_HOST_THREAD(m_async_thread);
708 }
709 
710 void
711 ProcessKDP::StopAsyncThread ()
712 {
713     Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet(KDP_LOG_PROCESS));
714 
715     if (log)
716         log->Printf ("ProcessKDP::StopAsyncThread ()");
717 
718     m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncThreadShouldExit);
719 
720     // Stop the stdio thread
721     if (IS_VALID_LLDB_HOST_THREAD(m_async_thread))
722     {
723         Host::ThreadJoin (m_async_thread, NULL, NULL);
724         m_async_thread = LLDB_INVALID_HOST_THREAD;
725     }
726 }
727 
728 
729 void *
730 ProcessKDP::AsyncThread (void *arg)
731 {
732     ProcessKDP *process = (ProcessKDP*) arg;
733 
734     const lldb::pid_t pid = process->GetID();
735 
736     Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_PROCESS));
737     if (log)
738         log->Printf ("ProcessKDP::AsyncThread (arg = %p, pid = %" PRIu64 ") thread starting...", arg, pid);
739 
740     Listener listener ("ProcessKDP::AsyncThread");
741     EventSP event_sp;
742     const uint32_t desired_event_mask = eBroadcastBitAsyncContinue |
743                                         eBroadcastBitAsyncThreadShouldExit;
744 
745 
746     if (listener.StartListeningForEvents (&process->m_async_broadcaster, desired_event_mask) == desired_event_mask)
747     {
748         bool done = false;
749         while (!done)
750         {
751             if (log)
752                 log->Printf ("ProcessKDP::AsyncThread (pid = %" PRIu64 ") listener.WaitForEvent (NULL, event_sp)...",
753                              pid);
754             if (listener.WaitForEvent (NULL, event_sp))
755             {
756                 uint32_t event_type = event_sp->GetType();
757                 if (log)
758                     log->Printf ("ProcessKDP::AsyncThread (pid = %" PRIu64 ") Got an event of type: %d...",
759                                  pid,
760                                  event_type);
761 
762                 // When we are running, poll for 1 second to try and get an exception
763                 // to indicate the process has stopped. If we don't get one, check to
764                 // make sure no one asked us to exit
765                 bool is_running = false;
766                 DataExtractor exc_reply_packet;
767                 do
768                 {
769                     switch (event_type)
770                     {
771                     case eBroadcastBitAsyncContinue:
772                         {
773                             is_running = true;
774                             if (process->m_comm.WaitForPacketWithTimeoutMicroSeconds (exc_reply_packet, 1 * USEC_PER_SEC))
775                             {
776                                 ThreadSP thread_sp (process->GetKernelThread(process->GetThreadList(), process->GetThreadList()));
777                                 thread_sp->GetRegisterContext()->InvalidateAllRegisters();
778                                 static_cast<ThreadKDP *>(thread_sp.get())->SetStopInfoFrom_KDP_EXCEPTION (exc_reply_packet);
779 
780                                 // TODO: parse the stop reply packet
781                                 is_running = false;
782                                 process->SetPrivateState(eStateStopped);
783                             }
784                             else
785                             {
786                                 // Check to see if we are supposed to exit. There is no way to
787                                 // interrupt a running kernel, so all we can do is wait for an
788                                 // exception or detach...
789                                 if (listener.GetNextEvent(event_sp))
790                                 {
791                                     // We got an event, go through the loop again
792                                     event_type = event_sp->GetType();
793                                 }
794                             }
795                         }
796                         break;
797 
798                     case eBroadcastBitAsyncThreadShouldExit:
799                         if (log)
800                             log->Printf ("ProcessKDP::AsyncThread (pid = %" PRIu64 ") got eBroadcastBitAsyncThreadShouldExit...",
801                                          pid);
802                         done = true;
803                         is_running = false;
804                         break;
805 
806                     default:
807                         if (log)
808                             log->Printf ("ProcessKDP::AsyncThread (pid = %" PRIu64 ") got unknown event 0x%8.8x",
809                                          pid,
810                                          event_type);
811                         done = true;
812                         is_running = false;
813                         break;
814                     }
815                 } while (is_running);
816             }
817             else
818             {
819                 if (log)
820                     log->Printf ("ProcessKDP::AsyncThread (pid = %" PRIu64 ") listener.WaitForEvent (NULL, event_sp) => false",
821                                  pid);
822                 done = true;
823             }
824         }
825     }
826 
827     if (log)
828         log->Printf ("ProcessKDP::AsyncThread (arg = %p, pid = %" PRIu64 ") thread exiting...",
829                      arg,
830                      pid);
831 
832     process->m_async_thread = LLDB_INVALID_HOST_THREAD;
833     return NULL;
834 }
835 
836 
837 class CommandObjectProcessKDPPacketSend : public CommandObjectParsed
838 {
839 private:
840 
841     OptionGroupOptions m_option_group;
842     OptionGroupUInt64 m_command_byte;
843     OptionGroupString m_packet_data;
844 
845     virtual Options *
846     GetOptions ()
847     {
848         return &m_option_group;
849     }
850 
851 
852 public:
853     CommandObjectProcessKDPPacketSend(CommandInterpreter &interpreter) :
854         CommandObjectParsed (interpreter,
855                              "process plugin packet send",
856                              "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. ",
857                              NULL),
858         m_option_group (interpreter),
859         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),
860         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)
861     {
862         m_option_group.Append (&m_command_byte, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
863         m_option_group.Append (&m_packet_data , LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
864         m_option_group.Finalize();
865     }
866 
867     ~CommandObjectProcessKDPPacketSend ()
868     {
869     }
870 
871     bool
872     DoExecute (Args& command, CommandReturnObject &result)
873     {
874         const size_t argc = command.GetArgumentCount();
875         if (argc == 0)
876         {
877             if (!m_command_byte.GetOptionValue().OptionWasSet())
878             {
879                 result.AppendError ("the --command option must be set to a valid command byte");
880                 result.SetStatus (eReturnStatusFailed);
881             }
882             else
883             {
884                 const uint64_t command_byte = m_command_byte.GetOptionValue().GetUInt64Value(0);
885                 if (command_byte > 0 && command_byte <= UINT8_MAX)
886                 {
887                     ProcessKDP *process = (ProcessKDP *)m_interpreter.GetExecutionContext().GetProcessPtr();
888                     if (process)
889                     {
890                         const StateType state = process->GetState();
891 
892                         if (StateIsStoppedState (state, true))
893                         {
894                             std::vector<uint8_t> payload_bytes;
895                             const char *ascii_hex_bytes_cstr = m_packet_data.GetOptionValue().GetCurrentValue();
896                             if (ascii_hex_bytes_cstr && ascii_hex_bytes_cstr[0])
897                             {
898                                 StringExtractor extractor(ascii_hex_bytes_cstr);
899                                 const size_t ascii_hex_bytes_cstr_len = extractor.GetStringRef().size();
900                                 if (ascii_hex_bytes_cstr_len & 1)
901                                 {
902                                     result.AppendErrorWithFormat ("payload data must contain an even number of ASCII hex characters: '%s'", ascii_hex_bytes_cstr);
903                                     result.SetStatus (eReturnStatusFailed);
904                                     return false;
905                                 }
906                                 payload_bytes.resize(ascii_hex_bytes_cstr_len/2);
907                                 if (extractor.GetHexBytes(&payload_bytes[0], payload_bytes.size(), '\xdd') != payload_bytes.size())
908                                 {
909                                     result.AppendErrorWithFormat ("payload data must only contain ASCII hex characters (no spaces or hex prefixes): '%s'", ascii_hex_bytes_cstr);
910                                     result.SetStatus (eReturnStatusFailed);
911                                     return false;
912                                 }
913                             }
914                             Error error;
915                             DataExtractor reply;
916                             process->GetCommunication().SendRawRequest (command_byte,
917                                                                         payload_bytes.empty() ? NULL : payload_bytes.data(),
918                                                                         payload_bytes.size(),
919                                                                         reply,
920                                                                         error);
921 
922                             if (error.Success())
923                             {
924                                 // Copy the binary bytes into a hex ASCII string for the result
925                                 StreamString packet;
926                                 packet.PutBytesAsRawHex8(reply.GetDataStart(),
927                                                          reply.GetByteSize(),
928                                                          lldb::endian::InlHostByteOrder(),
929                                                          lldb::endian::InlHostByteOrder());
930                                 result.AppendMessage(packet.GetString().c_str());
931                                 result.SetStatus (eReturnStatusSuccessFinishResult);
932                                 return true;
933                             }
934                             else
935                             {
936                                 const char *error_cstr = error.AsCString();
937                                 if (error_cstr && error_cstr[0])
938                                     result.AppendError (error_cstr);
939                                 else
940                                     result.AppendErrorWithFormat ("unknown error 0x%8.8x", error.GetError());
941                                 result.SetStatus (eReturnStatusFailed);
942                                 return false;
943                             }
944                         }
945                         else
946                         {
947                             result.AppendErrorWithFormat ("process must be stopped in order to send KDP packets, state is %s", StateAsCString (state));
948                             result.SetStatus (eReturnStatusFailed);
949                         }
950                     }
951                     else
952                     {
953                         result.AppendError ("invalid process");
954                         result.SetStatus (eReturnStatusFailed);
955                     }
956                 }
957                 else
958                 {
959                     result.AppendErrorWithFormat ("invalid command byte 0x%" PRIx64 ", valid values are 1 - 255", command_byte);
960                     result.SetStatus (eReturnStatusFailed);
961                 }
962             }
963         }
964         else
965         {
966             result.AppendErrorWithFormat ("'%s' takes no arguments, only options.", m_cmd_name.c_str());
967             result.SetStatus (eReturnStatusFailed);
968         }
969         return false;
970     }
971 };
972 
973 class CommandObjectProcessKDPPacket : public CommandObjectMultiword
974 {
975 private:
976 
977 public:
978     CommandObjectProcessKDPPacket(CommandInterpreter &interpreter) :
979     CommandObjectMultiword (interpreter,
980                             "process plugin packet",
981                             "Commands that deal with KDP remote packets.",
982                             NULL)
983     {
984         LoadSubCommand ("send", CommandObjectSP (new CommandObjectProcessKDPPacketSend (interpreter)));
985     }
986 
987     ~CommandObjectProcessKDPPacket ()
988     {
989     }
990 };
991 
992 class CommandObjectMultiwordProcessKDP : public CommandObjectMultiword
993 {
994 public:
995     CommandObjectMultiwordProcessKDP (CommandInterpreter &interpreter) :
996     CommandObjectMultiword (interpreter,
997                             "process plugin",
998                             "A set of commands for operating on a ProcessKDP process.",
999                             "process plugin <subcommand> [<subcommand-options>]")
1000     {
1001         LoadSubCommand ("packet", CommandObjectSP (new CommandObjectProcessKDPPacket    (interpreter)));
1002     }
1003 
1004     ~CommandObjectMultiwordProcessKDP ()
1005     {
1006     }
1007 };
1008 
1009 CommandObject *
1010 ProcessKDP::GetPluginCommandObject()
1011 {
1012     if (!m_command_sp)
1013         m_command_sp.reset (new CommandObjectMultiwordProcessKDP (GetTarget().GetDebugger().GetCommandInterpreter()));
1014     return m_command_sp.get();
1015 }
1016 
1017