xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.h (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
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