ProcessKDP.cpp revision 411ab47806a478d932926ef7a309ea37edf1f7e7
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 44using namespace lldb; 45using namespace lldb_private; 46 47const char * 48ProcessKDP::GetPluginNameStatic() 49{ 50 return "kdp-remote"; 51} 52 53const char * 54ProcessKDP::GetPluginDescriptionStatic() 55{ 56 return "KDP Remote protocol based debugging plug-in for darwin kernel debugging."; 57} 58 59void 60ProcessKDP::Terminate() 61{ 62 PluginManager::UnregisterPlugin (ProcessKDP::CreateInstance); 63} 64 65 66lldb::ProcessSP 67ProcessKDP::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 77bool 78ProcessKDP::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//---------------------------------------------------------------------- 112ProcessKDP::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//---------------------------------------------------------------------- 128ProcessKDP::~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//---------------------------------------------------------------------- 141const char * 142ProcessKDP::GetPluginName() 143{ 144 return "Process debugging plug-in that uses the Darwin KDP remote protocol"; 145} 146 147const char * 148ProcessKDP::GetShortPluginName() 149{ 150 return GetPluginNameStatic(); 151} 152 153uint32_t 154ProcessKDP::GetPluginVersion() 155{ 156 return 1; 157} 158 159Error 160ProcessKDP::WillLaunch (Module* module) 161{ 162 Error error; 163 error.SetErrorString ("launching not supported in kdp-remote plug-in"); 164 return error; 165} 166 167Error 168ProcessKDP::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 175Error 176ProcessKDP::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 183Error 184ProcessKDP::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::unique_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//---------------------------------------------------------------------- 298Error 299ProcessKDP::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 308Error 309ProcessKDP::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 316Error 317ProcessKDP::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 324Error 325ProcessKDP::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 333void 334ProcessKDP::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 345addr_t 346ProcessKDP::GetImageInfoAddress() 347{ 348 return m_kernel_load_addr; 349} 350 351lldb_private::DynamicLoader * 352ProcessKDP::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 359Error 360ProcessKDP::WillResume () 361{ 362 return Error(); 363} 364 365Error 366ProcessKDP::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 { 390 lldb::RegisterContextSP reg_ctx_sp (kernel_thread_sp->GetRegisterContext()); 391 392 if (reg_ctx_sp) 393 { 394 reg_ctx_sp->HardwareSingleStep (true); 395 resume = true; 396 } 397 else 398 { 399 error.SetErrorStringWithFormat("KDP thread 0x%llx has no register context", kernel_thread_sp->GetID()); 400 } 401 } 402 break; 403 404 case eStateRunning: 405 { 406 lldb::RegisterContextSP reg_ctx_sp (kernel_thread_sp->GetRegisterContext()); 407 408 if (reg_ctx_sp) 409 { 410 reg_ctx_sp->HardwareSingleStep (false); 411 resume = true; 412 } 413 else 414 { 415 error.SetErrorStringWithFormat("KDP thread 0x%llx has no register context", kernel_thread_sp->GetID()); 416 } 417 } 418 break; 419 420 default: 421 // The only valid thread resume states are listed above 422 assert (!"invalid thread resume state"); 423 break; 424 } 425 } 426 427 if (resume) 428 { 429 if (log) 430 log->Printf ("ProcessKDP::DoResume () sending resume"); 431 432 if (m_comm.SendRequestResume ()) 433 { 434 m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncContinue); 435 SetPrivateState(eStateRunning); 436 } 437 else 438 error.SetErrorString ("KDP resume failed"); 439 } 440 else 441 { 442 error.SetErrorString ("kernel thread is suspended"); 443 } 444 445 return error; 446} 447 448lldb::ThreadSP 449ProcessKDP::GetKernelThread(ThreadList &old_thread_list, ThreadList &new_thread_list) 450{ 451 // KDP only tells us about one thread/core. Any other threads will usually 452 // be the ones that are read from memory by the OS plug-ins. 453 const lldb::tid_t kernel_tid = 1; 454 ThreadSP thread_sp (old_thread_list.FindThreadByID (kernel_tid, false)); 455 if (!thread_sp) 456 thread_sp.reset(new ThreadKDP (*this, kernel_tid)); 457 new_thread_list.AddThread(thread_sp); 458 return thread_sp; 459} 460 461 462 463 464bool 465ProcessKDP::UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_thread_list) 466{ 467 // locker will keep a mutex locked until it goes out of scope 468 Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_THREAD)); 469 if (log && log->GetMask().Test(KDP_LOG_VERBOSE)) 470 log->Printf ("ProcessKDP::%s (pid = %" PRIu64 ")", __FUNCTION__, GetID()); 471 472 // Even though there is a CPU mask, it doesn't mean we can see each CPU 473 // indivudually, there is really only one. Lets call this thread 1. 474 GetKernelThread (old_thread_list, new_thread_list); 475 476 return new_thread_list.GetSize(false) > 0; 477} 478 479void 480ProcessKDP::RefreshStateAfterStop () 481{ 482 // Let all threads recover from stopping and do any clean up based 483 // on the previous thread state (if any). 484 m_thread_list.RefreshStateAfterStop(); 485} 486 487Error 488ProcessKDP::DoHalt (bool &caused_stop) 489{ 490 Error error; 491 492 if (m_comm.IsRunning()) 493 { 494 if (m_destroy_in_process) 495 { 496 // If we are attemping to destroy, we need to not return an error to 497 // Halt or DoDestroy won't get called. 498 // We are also currently running, so send a process stopped event 499 SetPrivateState (eStateStopped); 500 } 501 else 502 { 503 error.SetErrorString ("KDP cannot interrupt a running kernel"); 504 } 505 } 506 return error; 507} 508 509Error 510ProcessKDP::DoDetach() 511{ 512 Error error; 513 Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet(KDP_LOG_PROCESS)); 514 if (log) 515 log->Printf ("ProcessKDP::DoDetach()"); 516 517 if (m_comm.IsRunning()) 518 { 519 // We are running and we can't interrupt a running kernel, so we need 520 // to just close the connection to the kernel and hope for the best 521 } 522 else 523 { 524 DisableAllBreakpointSites (); 525 526 m_thread_list.DiscardThreadPlans(); 527 528 if (m_comm.IsConnected()) 529 { 530 531 m_comm.SendRequestDisconnect(); 532 533 size_t response_size = m_comm.Disconnect (); 534 if (log) 535 { 536 if (response_size) 537 log->PutCString ("ProcessKDP::DoDetach() detach packet sent successfully"); 538 else 539 log->PutCString ("ProcessKDP::DoDetach() detach packet send failed"); 540 } 541 } 542 } 543 StopAsyncThread (); 544 m_comm.Clear(); 545 546 SetPrivateState (eStateDetached); 547 ResumePrivateStateThread(); 548 549 //KillDebugserverProcess (); 550 return error; 551} 552 553Error 554ProcessKDP::DoDestroy () 555{ 556 // For KDP there really is no difference between destroy and detach 557 return DoDetach(); 558} 559 560//------------------------------------------------------------------ 561// Process Queries 562//------------------------------------------------------------------ 563 564bool 565ProcessKDP::IsAlive () 566{ 567 return m_comm.IsConnected() && m_private_state.GetValue() != eStateExited; 568} 569 570//------------------------------------------------------------------ 571// Process Memory 572//------------------------------------------------------------------ 573size_t 574ProcessKDP::DoReadMemory (addr_t addr, void *buf, size_t size, Error &error) 575{ 576 if (m_comm.IsConnected()) 577 return m_comm.SendRequestReadMemory (addr, buf, size, error); 578 error.SetErrorString ("not connected"); 579 return 0; 580} 581 582size_t 583ProcessKDP::DoWriteMemory (addr_t addr, const void *buf, size_t size, Error &error) 584{ 585 if (m_comm.IsConnected()) 586 return m_comm.SendRequestWriteMemory (addr, buf, size, error); 587 error.SetErrorString ("not connected"); 588 return 0; 589} 590 591lldb::addr_t 592ProcessKDP::DoAllocateMemory (size_t size, uint32_t permissions, Error &error) 593{ 594 error.SetErrorString ("memory allocation not suppported in kdp remote debugging"); 595 return LLDB_INVALID_ADDRESS; 596} 597 598Error 599ProcessKDP::DoDeallocateMemory (lldb::addr_t addr) 600{ 601 Error error; 602 error.SetErrorString ("memory deallocation not suppported in kdp remote debugging"); 603 return error; 604} 605 606Error 607ProcessKDP::EnableBreakpointSite (BreakpointSite *bp_site) 608{ 609 if (m_comm.LocalBreakpointsAreSupported ()) 610 { 611 Error error; 612 if (!bp_site->IsEnabled()) 613 { 614 if (m_comm.SendRequestBreakpoint(true, bp_site->GetLoadAddress())) 615 { 616 bp_site->SetEnabled(true); 617 bp_site->SetType (BreakpointSite::eExternal); 618 } 619 else 620 { 621 error.SetErrorString ("KDP set breakpoint failed"); 622 } 623 } 624 return error; 625 } 626 return EnableSoftwareBreakpoint (bp_site); 627} 628 629Error 630ProcessKDP::DisableBreakpointSite (BreakpointSite *bp_site) 631{ 632 if (m_comm.LocalBreakpointsAreSupported ()) 633 { 634 Error error; 635 if (bp_site->IsEnabled()) 636 { 637 BreakpointSite::Type bp_type = bp_site->GetType(); 638 if (bp_type == BreakpointSite::eExternal) 639 { 640 if (m_destroy_in_process && m_comm.IsRunning()) 641 { 642 // We are trying to destroy our connection and we are running 643 bp_site->SetEnabled(false); 644 } 645 else 646 { 647 if (m_comm.SendRequestBreakpoint(false, bp_site->GetLoadAddress())) 648 bp_site->SetEnabled(false); 649 else 650 error.SetErrorString ("KDP remove breakpoint failed"); 651 } 652 } 653 else 654 { 655 error = DisableSoftwareBreakpoint (bp_site); 656 } 657 } 658 return error; 659 } 660 return DisableSoftwareBreakpoint (bp_site); 661} 662 663Error 664ProcessKDP::EnableWatchpoint (Watchpoint *wp, bool notify) 665{ 666 Error error; 667 error.SetErrorString ("watchpoints are not suppported in kdp remote debugging"); 668 return error; 669} 670 671Error 672ProcessKDP::DisableWatchpoint (Watchpoint *wp, bool notify) 673{ 674 Error error; 675 error.SetErrorString ("watchpoints are not suppported in kdp remote debugging"); 676 return error; 677} 678 679void 680ProcessKDP::Clear() 681{ 682 m_thread_list.Clear(); 683} 684 685Error 686ProcessKDP::DoSignal (int signo) 687{ 688 Error error; 689 error.SetErrorString ("sending signals is not suppported in kdp remote debugging"); 690 return error; 691} 692 693void 694ProcessKDP::Initialize() 695{ 696 static bool g_initialized = false; 697 698 if (g_initialized == false) 699 { 700 g_initialized = true; 701 PluginManager::RegisterPlugin (GetPluginNameStatic(), 702 GetPluginDescriptionStatic(), 703 CreateInstance); 704 705 Log::Callbacks log_callbacks = { 706 ProcessKDPLog::DisableLog, 707 ProcessKDPLog::EnableLog, 708 ProcessKDPLog::ListLogCategories 709 }; 710 711 Log::RegisterLogChannel (ProcessKDP::GetPluginNameStatic(), log_callbacks); 712 } 713} 714 715bool 716ProcessKDP::StartAsyncThread () 717{ 718 Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet(KDP_LOG_PROCESS)); 719 720 if (log) 721 log->Printf ("ProcessKDP::StartAsyncThread ()"); 722 723 if (IS_VALID_LLDB_HOST_THREAD(m_async_thread)) 724 return true; 725 726 m_async_thread = Host::ThreadCreate ("<lldb.process.kdp-remote.async>", ProcessKDP::AsyncThread, this, NULL); 727 return IS_VALID_LLDB_HOST_THREAD(m_async_thread); 728} 729 730void 731ProcessKDP::StopAsyncThread () 732{ 733 Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet(KDP_LOG_PROCESS)); 734 735 if (log) 736 log->Printf ("ProcessKDP::StopAsyncThread ()"); 737 738 m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncThreadShouldExit); 739 740 // Stop the stdio thread 741 if (IS_VALID_LLDB_HOST_THREAD(m_async_thread)) 742 { 743 Host::ThreadJoin (m_async_thread, NULL, NULL); 744 m_async_thread = LLDB_INVALID_HOST_THREAD; 745 } 746} 747 748 749void * 750ProcessKDP::AsyncThread (void *arg) 751{ 752 ProcessKDP *process = (ProcessKDP*) arg; 753 754 const lldb::pid_t pid = process->GetID(); 755 756 Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_PROCESS)); 757 if (log) 758 log->Printf ("ProcessKDP::AsyncThread (arg = %p, pid = %" PRIu64 ") thread starting...", arg, pid); 759 760 Listener listener ("ProcessKDP::AsyncThread"); 761 EventSP event_sp; 762 const uint32_t desired_event_mask = eBroadcastBitAsyncContinue | 763 eBroadcastBitAsyncThreadShouldExit; 764 765 766 if (listener.StartListeningForEvents (&process->m_async_broadcaster, desired_event_mask) == desired_event_mask) 767 { 768 bool done = false; 769 while (!done) 770 { 771 if (log) 772 log->Printf ("ProcessKDP::AsyncThread (pid = %" PRIu64 ") listener.WaitForEvent (NULL, event_sp)...", 773 pid); 774 if (listener.WaitForEvent (NULL, event_sp)) 775 { 776 uint32_t event_type = event_sp->GetType(); 777 if (log) 778 log->Printf ("ProcessKDP::AsyncThread (pid = %" PRIu64 ") Got an event of type: %d...", 779 pid, 780 event_type); 781 782 // When we are running, poll for 1 second to try and get an exception 783 // to indicate the process has stopped. If we don't get one, check to 784 // make sure no one asked us to exit 785 bool is_running = false; 786 DataExtractor exc_reply_packet; 787 do 788 { 789 switch (event_type) 790 { 791 case eBroadcastBitAsyncContinue: 792 { 793 is_running = true; 794 if (process->m_comm.WaitForPacketWithTimeoutMicroSeconds (exc_reply_packet, 1 * USEC_PER_SEC)) 795 { 796 ThreadSP thread_sp (process->GetKernelThread(process->GetThreadList(), process->GetThreadList())); 797 if (thread_sp) 798 { 799 lldb::RegisterContextSP reg_ctx_sp (thread_sp->GetRegisterContext()); 800 if (reg_ctx_sp) 801 reg_ctx_sp->InvalidateAllRegisters(); 802 static_cast<ThreadKDP *>(thread_sp.get())->SetStopInfoFrom_KDP_EXCEPTION (exc_reply_packet); 803 } 804 805 // TODO: parse the stop reply packet 806 is_running = false; 807 process->SetPrivateState(eStateStopped); 808 } 809 else 810 { 811 // Check to see if we are supposed to exit. There is no way to 812 // interrupt a running kernel, so all we can do is wait for an 813 // exception or detach... 814 if (listener.GetNextEvent(event_sp)) 815 { 816 // We got an event, go through the loop again 817 event_type = event_sp->GetType(); 818 } 819 } 820 } 821 break; 822 823 case eBroadcastBitAsyncThreadShouldExit: 824 if (log) 825 log->Printf ("ProcessKDP::AsyncThread (pid = %" PRIu64 ") got eBroadcastBitAsyncThreadShouldExit...", 826 pid); 827 done = true; 828 is_running = false; 829 break; 830 831 default: 832 if (log) 833 log->Printf ("ProcessKDP::AsyncThread (pid = %" PRIu64 ") got unknown event 0x%8.8x", 834 pid, 835 event_type); 836 done = true; 837 is_running = false; 838 break; 839 } 840 } while (is_running); 841 } 842 else 843 { 844 if (log) 845 log->Printf ("ProcessKDP::AsyncThread (pid = %" PRIu64 ") listener.WaitForEvent (NULL, event_sp) => false", 846 pid); 847 done = true; 848 } 849 } 850 } 851 852 if (log) 853 log->Printf ("ProcessKDP::AsyncThread (arg = %p, pid = %" PRIu64 ") thread exiting...", 854 arg, 855 pid); 856 857 process->m_async_thread = LLDB_INVALID_HOST_THREAD; 858 return NULL; 859} 860 861 862class CommandObjectProcessKDPPacketSend : public CommandObjectParsed 863{ 864private: 865 866 OptionGroupOptions m_option_group; 867 OptionGroupUInt64 m_command_byte; 868 OptionGroupString m_packet_data; 869 870 virtual Options * 871 GetOptions () 872 { 873 return &m_option_group; 874 } 875 876 877public: 878 CommandObjectProcessKDPPacketSend(CommandInterpreter &interpreter) : 879 CommandObjectParsed (interpreter, 880 "process plugin packet send", 881 "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. ", 882 NULL), 883 m_option_group (interpreter), 884 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), 885 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) 886 { 887 m_option_group.Append (&m_command_byte, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 888 m_option_group.Append (&m_packet_data , LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 889 m_option_group.Finalize(); 890 } 891 892 ~CommandObjectProcessKDPPacketSend () 893 { 894 } 895 896 bool 897 DoExecute (Args& command, CommandReturnObject &result) 898 { 899 const size_t argc = command.GetArgumentCount(); 900 if (argc == 0) 901 { 902 if (!m_command_byte.GetOptionValue().OptionWasSet()) 903 { 904 result.AppendError ("the --command option must be set to a valid command byte"); 905 result.SetStatus (eReturnStatusFailed); 906 } 907 else 908 { 909 const uint64_t command_byte = m_command_byte.GetOptionValue().GetUInt64Value(0); 910 if (command_byte > 0 && command_byte <= UINT8_MAX) 911 { 912 ProcessKDP *process = (ProcessKDP *)m_interpreter.GetExecutionContext().GetProcessPtr(); 913 if (process) 914 { 915 const StateType state = process->GetState(); 916 917 if (StateIsStoppedState (state, true)) 918 { 919 std::vector<uint8_t> payload_bytes; 920 const char *ascii_hex_bytes_cstr = m_packet_data.GetOptionValue().GetCurrentValue(); 921 if (ascii_hex_bytes_cstr && ascii_hex_bytes_cstr[0]) 922 { 923 StringExtractor extractor(ascii_hex_bytes_cstr); 924 const size_t ascii_hex_bytes_cstr_len = extractor.GetStringRef().size(); 925 if (ascii_hex_bytes_cstr_len & 1) 926 { 927 result.AppendErrorWithFormat ("payload data must contain an even number of ASCII hex characters: '%s'", ascii_hex_bytes_cstr); 928 result.SetStatus (eReturnStatusFailed); 929 return false; 930 } 931 payload_bytes.resize(ascii_hex_bytes_cstr_len/2); 932 if (extractor.GetHexBytes(&payload_bytes[0], payload_bytes.size(), '\xdd') != payload_bytes.size()) 933 { 934 result.AppendErrorWithFormat ("payload data must only contain ASCII hex characters (no spaces or hex prefixes): '%s'", ascii_hex_bytes_cstr); 935 result.SetStatus (eReturnStatusFailed); 936 return false; 937 } 938 } 939 Error error; 940 DataExtractor reply; 941 process->GetCommunication().SendRawRequest (command_byte, 942 payload_bytes.empty() ? NULL : payload_bytes.data(), 943 payload_bytes.size(), 944 reply, 945 error); 946 947 if (error.Success()) 948 { 949 // Copy the binary bytes into a hex ASCII string for the result 950 StreamString packet; 951 packet.PutBytesAsRawHex8(reply.GetDataStart(), 952 reply.GetByteSize(), 953 lldb::endian::InlHostByteOrder(), 954 lldb::endian::InlHostByteOrder()); 955 result.AppendMessage(packet.GetString().c_str()); 956 result.SetStatus (eReturnStatusSuccessFinishResult); 957 return true; 958 } 959 else 960 { 961 const char *error_cstr = error.AsCString(); 962 if (error_cstr && error_cstr[0]) 963 result.AppendError (error_cstr); 964 else 965 result.AppendErrorWithFormat ("unknown error 0x%8.8x", error.GetError()); 966 result.SetStatus (eReturnStatusFailed); 967 return false; 968 } 969 } 970 else 971 { 972 result.AppendErrorWithFormat ("process must be stopped in order to send KDP packets, state is %s", StateAsCString (state)); 973 result.SetStatus (eReturnStatusFailed); 974 } 975 } 976 else 977 { 978 result.AppendError ("invalid process"); 979 result.SetStatus (eReturnStatusFailed); 980 } 981 } 982 else 983 { 984 result.AppendErrorWithFormat ("invalid command byte 0x%" PRIx64 ", valid values are 1 - 255", command_byte); 985 result.SetStatus (eReturnStatusFailed); 986 } 987 } 988 } 989 else 990 { 991 result.AppendErrorWithFormat ("'%s' takes no arguments, only options.", m_cmd_name.c_str()); 992 result.SetStatus (eReturnStatusFailed); 993 } 994 return false; 995 } 996}; 997 998class CommandObjectProcessKDPPacket : public CommandObjectMultiword 999{ 1000private: 1001 1002public: 1003 CommandObjectProcessKDPPacket(CommandInterpreter &interpreter) : 1004 CommandObjectMultiword (interpreter, 1005 "process plugin packet", 1006 "Commands that deal with KDP remote packets.", 1007 NULL) 1008 { 1009 LoadSubCommand ("send", CommandObjectSP (new CommandObjectProcessKDPPacketSend (interpreter))); 1010 } 1011 1012 ~CommandObjectProcessKDPPacket () 1013 { 1014 } 1015}; 1016 1017class CommandObjectMultiwordProcessKDP : public CommandObjectMultiword 1018{ 1019public: 1020 CommandObjectMultiwordProcessKDP (CommandInterpreter &interpreter) : 1021 CommandObjectMultiword (interpreter, 1022 "process plugin", 1023 "A set of commands for operating on a ProcessKDP process.", 1024 "process plugin <subcommand> [<subcommand-options>]") 1025 { 1026 LoadSubCommand ("packet", CommandObjectSP (new CommandObjectProcessKDPPacket (interpreter))); 1027 } 1028 1029 ~CommandObjectMultiwordProcessKDP () 1030 { 1031 } 1032}; 1033 1034CommandObject * 1035ProcessKDP::GetPluginCommandObject() 1036{ 1037 if (!m_command_sp) 1038 m_command_sp.reset (new CommandObjectMultiwordProcessKDP (GetTarget().GetDebugger().GetCommandInterpreter())); 1039 return m_command_sp.get(); 1040} 1041 1042