brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.5 KiB · 1b71d83 Raw
185 lines · c
1//===-- ProcessKDP.h --------------------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLDB_SOURCE_PLUGINS_PROCESS_MACOSX_KERNEL_PROCESSKDP_H10#define LLDB_SOURCE_PLUGINS_PROCESS_MACOSX_KERNEL_PROCESSKDP_H11 12#include <list>13#include <vector>14 15#include "lldb/Core/ThreadSafeValue.h"16#include "lldb/Host/HostThread.h"17#include "lldb/Target/Process.h"18#include "lldb/Target/Thread.h"19#include "lldb/Utility/ArchSpec.h"20#include "lldb/Utility/Broadcaster.h"21#include "lldb/Utility/ConstString.h"22#include "lldb/Utility/Status.h"23#include "lldb/Utility/StreamString.h"24#include "lldb/Utility/StringList.h"25 26#include "CommunicationKDP.h"27 28class ThreadKDP;29 30class ProcessKDP : public lldb_private::Process {31public:32  // Constructors and Destructors33  static lldb::ProcessSP34  CreateInstance(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp,35                 const lldb_private::FileSpec *crash_file_path,36                 bool can_connect);37 38  static void Initialize();39 40  static void DebuggerInitialize(lldb_private::Debugger &debugger);41 42  static void Terminate();43 44  static llvm::StringRef GetPluginNameStatic() { return "kdp-remote"; }45 46  static llvm::StringRef GetPluginDescriptionStatic();47 48  // Constructors and Destructors49  ProcessKDP(lldb::TargetSP target_sp, lldb::ListenerSP listener);50 51  ~ProcessKDP() override;52 53  // Check if a given Process54  bool CanDebug(lldb::TargetSP target_sp,55                bool plugin_specified_by_name) override;56  lldb_private::CommandObject *GetPluginCommandObject() override;57 58  // Creating a new process, or attaching to an existing one59  lldb_private::Status DoWillLaunch(lldb_private::Module *module) override;60 61  lldb_private::Status62  DoLaunch(lldb_private::Module *exe_module,63           lldb_private::ProcessLaunchInfo &launch_info) override;64 65  lldb_private::Status DoWillAttachToProcessWithID(lldb::pid_t pid) override;66 67  lldb_private::Status68  DoWillAttachToProcessWithName(const char *process_name,69                                bool wait_for_launch) override;70 71  lldb_private::Status DoConnectRemote(llvm::StringRef remote_url) override;72 73  lldb_private::Status DoAttachToProcessWithID(74      lldb::pid_t pid,75      const lldb_private::ProcessAttachInfo &attach_info) override;76 77  lldb_private::Status DoAttachToProcessWithName(78      const char *process_name,79      const lldb_private::ProcessAttachInfo &attach_info) override;80 81  void DidAttach(lldb_private::ArchSpec &process_arch) override;82 83  lldb::addr_t GetImageInfoAddress() override;84 85  lldb_private::DynamicLoader *GetDynamicLoader() override;86 87  // PluginInterface protocol88  llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }89 90  // Process Control91  lldb_private::Status WillResume() override;92 93  lldb_private::Status DoResume(lldb::RunDirection direction) override;94 95  lldb_private::Status DoHalt(bool &caused_stop) override;96 97  lldb_private::Status DoDetach(bool keep_stopped) override;98 99  lldb_private::Status DoSignal(int signal) override;100 101  lldb_private::Status DoDestroy() override;102 103  void RefreshStateAfterStop() override;104 105  // Process Queries106  bool IsAlive() override;107 108  // Process Memory109  size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size,110                      lldb_private::Status &error) override;111 112  size_t DoWriteMemory(lldb::addr_t addr, const void *buf, size_t size,113                       lldb_private::Status &error) override;114 115  lldb::addr_t DoAllocateMemory(size_t size, uint32_t permissions,116                                lldb_private::Status &error) override;117 118  lldb_private::Status DoDeallocateMemory(lldb::addr_t ptr) override;119 120  // Process Breakpoints121  lldb_private::Status122  EnableBreakpointSite(lldb_private::BreakpointSite *bp_site) override;123 124  lldb_private::Status125  DisableBreakpointSite(lldb_private::BreakpointSite *bp_site) override;126 127  CommunicationKDP &GetCommunication() { return m_comm; }128 129protected:130  friend class ThreadKDP;131  friend class CommunicationKDP;132 133  // Accessors134  bool IsRunning(lldb::StateType state) {135    return state == lldb::eStateRunning || IsStepping(state);136  }137 138  bool IsStepping(lldb::StateType state) {139    return state == lldb::eStateStepping;140  }141 142  bool CanResume(lldb::StateType state) { return state == lldb::eStateStopped; }143 144  bool HasExited(lldb::StateType state) { return state == lldb::eStateExited; }145 146  bool GetHostArchitecture(lldb_private::ArchSpec &arch);147 148  bool ProcessIDIsValid() const;149 150  void Clear();151 152  bool DoUpdateThreadList(lldb_private::ThreadList &old_thread_list,153                          lldb_private::ThreadList &new_thread_list) override;154 155  enum {156    eBroadcastBitAsyncContinue = (1 << 0),157    eBroadcastBitAsyncThreadShouldExit = (1 << 1)158  };159 160  lldb::ThreadSP GetKernelThread();161 162  /// Broadcaster event bits definitions.163  CommunicationKDP m_comm;164  lldb_private::Broadcaster m_async_broadcaster;165  lldb_private::HostThread m_async_thread;166  llvm::StringRef m_dyld_plugin_name;167  lldb::addr_t m_kernel_load_addr;168  lldb::CommandObjectSP m_command_sp;169  lldb::ThreadWP m_kernel_thread_wp;170 171  bool StartAsyncThread();172 173  void StopAsyncThread();174 175  void *AsyncThread();176 177private:178  // For ProcessKDP only179 180  ProcessKDP(const ProcessKDP &) = delete;181  const ProcessKDP &operator=(const ProcessKDP &) = delete;182};183 184#endif // LLDB_SOURCE_PLUGINS_PROCESS_MACOSX_KERNEL_PROCESSKDP_H185