1061da546Spatrick //===-- ProcessKDP.h --------------------------------------------*- C++ -*-===// 2061da546Spatrick // 3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information. 5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6061da546Spatrick // 7061da546Spatrick //===----------------------------------------------------------------------===// 8061da546Spatrick 9dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_PROCESS_MACOSX_KERNEL_PROCESSKDP_H 10dda28197Spatrick #define LLDB_SOURCE_PLUGINS_PROCESS_MACOSX_KERNEL_PROCESSKDP_H 11061da546Spatrick 12061da546Spatrick #include <list> 13061da546Spatrick #include <vector> 14061da546Spatrick 15061da546Spatrick #include "lldb/Core/ThreadSafeValue.h" 16061da546Spatrick #include "lldb/Host/HostThread.h" 17061da546Spatrick #include "lldb/Target/Process.h" 18061da546Spatrick #include "lldb/Target/Thread.h" 19061da546Spatrick #include "lldb/Utility/ArchSpec.h" 20061da546Spatrick #include "lldb/Utility/Broadcaster.h" 21061da546Spatrick #include "lldb/Utility/ConstString.h" 22061da546Spatrick #include "lldb/Utility/Status.h" 23061da546Spatrick #include "lldb/Utility/StreamString.h" 24061da546Spatrick #include "lldb/Utility/StringList.h" 25061da546Spatrick 26061da546Spatrick #include "CommunicationKDP.h" 27061da546Spatrick 28061da546Spatrick class ThreadKDP; 29061da546Spatrick 30061da546Spatrick class ProcessKDP : public lldb_private::Process { 31061da546Spatrick public: 32061da546Spatrick // Constructors and Destructors 33061da546Spatrick static lldb::ProcessSP 34061da546Spatrick CreateInstance(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, 35be691f3bSpatrick const lldb_private::FileSpec *crash_file_path, 36be691f3bSpatrick bool can_connect); 37061da546Spatrick 38061da546Spatrick static void Initialize(); 39061da546Spatrick 40061da546Spatrick static void DebuggerInitialize(lldb_private::Debugger &debugger); 41061da546Spatrick 42061da546Spatrick static void Terminate(); 43061da546Spatrick GetPluginNameStatic()44*f6aab3d8Srobert static llvm::StringRef GetPluginNameStatic() { return "kdp-remote"; } 45061da546Spatrick 46*f6aab3d8Srobert static llvm::StringRef GetPluginDescriptionStatic(); 47061da546Spatrick 48061da546Spatrick // Constructors and Destructors 49061da546Spatrick ProcessKDP(lldb::TargetSP target_sp, lldb::ListenerSP listener); 50061da546Spatrick 51061da546Spatrick ~ProcessKDP() override; 52061da546Spatrick 53061da546Spatrick // Check if a given Process 54061da546Spatrick bool CanDebug(lldb::TargetSP target_sp, 55061da546Spatrick bool plugin_specified_by_name) override; 56061da546Spatrick lldb_private::CommandObject *GetPluginCommandObject() override; 57061da546Spatrick 58061da546Spatrick // Creating a new process, or attaching to an existing one 59*f6aab3d8Srobert lldb_private::Status DoWillLaunch(lldb_private::Module *module) override; 60061da546Spatrick 61061da546Spatrick lldb_private::Status 62061da546Spatrick DoLaunch(lldb_private::Module *exe_module, 63061da546Spatrick lldb_private::ProcessLaunchInfo &launch_info) override; 64061da546Spatrick 65*f6aab3d8Srobert lldb_private::Status DoWillAttachToProcessWithID(lldb::pid_t pid) override; 66061da546Spatrick 67061da546Spatrick lldb_private::Status 68*f6aab3d8Srobert DoWillAttachToProcessWithName(const char *process_name, 69061da546Spatrick bool wait_for_launch) override; 70061da546Spatrick 71dda28197Spatrick lldb_private::Status DoConnectRemote(llvm::StringRef remote_url) override; 72061da546Spatrick 73061da546Spatrick lldb_private::Status DoAttachToProcessWithID( 74061da546Spatrick lldb::pid_t pid, 75061da546Spatrick const lldb_private::ProcessAttachInfo &attach_info) override; 76061da546Spatrick 77061da546Spatrick lldb_private::Status DoAttachToProcessWithName( 78061da546Spatrick const char *process_name, 79061da546Spatrick const lldb_private::ProcessAttachInfo &attach_info) override; 80061da546Spatrick 81061da546Spatrick void DidAttach(lldb_private::ArchSpec &process_arch) override; 82061da546Spatrick 83061da546Spatrick lldb::addr_t GetImageInfoAddress() override; 84061da546Spatrick 85061da546Spatrick lldb_private::DynamicLoader *GetDynamicLoader() override; 86061da546Spatrick 87061da546Spatrick // PluginInterface protocol GetPluginName()88*f6aab3d8Srobert llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 89061da546Spatrick 90061da546Spatrick // Process Control 91061da546Spatrick lldb_private::Status WillResume() override; 92061da546Spatrick 93061da546Spatrick lldb_private::Status DoResume() override; 94061da546Spatrick 95061da546Spatrick lldb_private::Status DoHalt(bool &caused_stop) override; 96061da546Spatrick 97061da546Spatrick lldb_private::Status DoDetach(bool keep_stopped) override; 98061da546Spatrick 99061da546Spatrick lldb_private::Status DoSignal(int signal) override; 100061da546Spatrick 101061da546Spatrick lldb_private::Status DoDestroy() override; 102061da546Spatrick 103061da546Spatrick void RefreshStateAfterStop() override; 104061da546Spatrick 105061da546Spatrick // Process Queries 106061da546Spatrick bool IsAlive() override; 107061da546Spatrick 108061da546Spatrick // Process Memory 109061da546Spatrick size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size, 110061da546Spatrick lldb_private::Status &error) override; 111061da546Spatrick 112061da546Spatrick size_t DoWriteMemory(lldb::addr_t addr, const void *buf, size_t size, 113061da546Spatrick lldb_private::Status &error) override; 114061da546Spatrick 115061da546Spatrick lldb::addr_t DoAllocateMemory(size_t size, uint32_t permissions, 116061da546Spatrick lldb_private::Status &error) override; 117061da546Spatrick 118061da546Spatrick lldb_private::Status DoDeallocateMemory(lldb::addr_t ptr) override; 119061da546Spatrick 120061da546Spatrick // Process Breakpoints 121061da546Spatrick lldb_private::Status 122061da546Spatrick EnableBreakpointSite(lldb_private::BreakpointSite *bp_site) override; 123061da546Spatrick 124061da546Spatrick lldb_private::Status 125061da546Spatrick DisableBreakpointSite(lldb_private::BreakpointSite *bp_site) override; 126061da546Spatrick 127061da546Spatrick // Process Watchpoints 128061da546Spatrick lldb_private::Status EnableWatchpoint(lldb_private::Watchpoint *wp, 129061da546Spatrick bool notify = true) override; 130061da546Spatrick 131061da546Spatrick lldb_private::Status DisableWatchpoint(lldb_private::Watchpoint *wp, 132061da546Spatrick bool notify = true) override; 133061da546Spatrick GetCommunication()134061da546Spatrick CommunicationKDP &GetCommunication() { return m_comm; } 135061da546Spatrick 136061da546Spatrick protected: 137061da546Spatrick friend class ThreadKDP; 138061da546Spatrick friend class CommunicationKDP; 139061da546Spatrick 140061da546Spatrick // Accessors IsRunning(lldb::StateType state)141061da546Spatrick bool IsRunning(lldb::StateType state) { 142061da546Spatrick return state == lldb::eStateRunning || IsStepping(state); 143061da546Spatrick } 144061da546Spatrick IsStepping(lldb::StateType state)145061da546Spatrick bool IsStepping(lldb::StateType state) { 146061da546Spatrick return state == lldb::eStateStepping; 147061da546Spatrick } 148061da546Spatrick CanResume(lldb::StateType state)149061da546Spatrick bool CanResume(lldb::StateType state) { return state == lldb::eStateStopped; } 150061da546Spatrick HasExited(lldb::StateType state)151061da546Spatrick bool HasExited(lldb::StateType state) { return state == lldb::eStateExited; } 152061da546Spatrick 153061da546Spatrick bool GetHostArchitecture(lldb_private::ArchSpec &arch); 154061da546Spatrick 155061da546Spatrick bool ProcessIDIsValid() const; 156061da546Spatrick 157061da546Spatrick void Clear(); 158061da546Spatrick 159be691f3bSpatrick bool DoUpdateThreadList(lldb_private::ThreadList &old_thread_list, 160061da546Spatrick lldb_private::ThreadList &new_thread_list) override; 161061da546Spatrick 162061da546Spatrick enum { 163061da546Spatrick eBroadcastBitAsyncContinue = (1 << 0), 164061da546Spatrick eBroadcastBitAsyncThreadShouldExit = (1 << 1) 165061da546Spatrick }; 166061da546Spatrick 167061da546Spatrick lldb::ThreadSP GetKernelThread(); 168061da546Spatrick 169061da546Spatrick /// Broadcaster event bits definitions. 170061da546Spatrick CommunicationKDP m_comm; 171061da546Spatrick lldb_private::Broadcaster m_async_broadcaster; 172061da546Spatrick lldb_private::HostThread m_async_thread; 173*f6aab3d8Srobert llvm::StringRef m_dyld_plugin_name; 174061da546Spatrick lldb::addr_t m_kernel_load_addr; 175061da546Spatrick lldb::CommandObjectSP m_command_sp; 176061da546Spatrick lldb::ThreadWP m_kernel_thread_wp; 177061da546Spatrick 178061da546Spatrick bool StartAsyncThread(); 179061da546Spatrick 180061da546Spatrick void StopAsyncThread(); 181061da546Spatrick 182*f6aab3d8Srobert void *AsyncThread(); 183061da546Spatrick 184061da546Spatrick private: 185061da546Spatrick // For ProcessKDP only 186061da546Spatrick 187dda28197Spatrick ProcessKDP(const ProcessKDP &) = delete; 188dda28197Spatrick const ProcessKDP &operator=(const ProcessKDP &) = delete; 189061da546Spatrick }; 190061da546Spatrick 191dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_PROCESS_MACOSX_KERNEL_PROCESSKDP_H 192