1 //===-- GDBRemoteCommunicationServerLLGS.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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERLLGS_H
10 #define LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERLLGS_H
11 
12 #include <mutex>
13 #include <unordered_map>
14 #include <unordered_set>
15 
16 #include "lldb/Core/Communication.h"
17 #include "lldb/Host/MainLoop.h"
18 #include "lldb/Host/common/NativeProcessProtocol.h"
19 #include "lldb/lldb-private-forward.h"
20 
21 #include "GDBRemoteCommunicationServerCommon.h"
22 
23 class StringExtractorGDBRemote;
24 
25 namespace lldb_private {
26 
27 namespace process_gdb_remote {
28 
29 class ProcessGDBRemote;
30 
31 class GDBRemoteCommunicationServerLLGS
32     : public GDBRemoteCommunicationServerCommon,
33       public NativeProcessProtocol::NativeDelegate {
34 public:
35   // Constructors and Destructors
36   GDBRemoteCommunicationServerLLGS(
37       MainLoop &mainloop,
38       const NativeProcessProtocol::Factory &process_factory);
39 
40   void SetLaunchInfo(const ProcessLaunchInfo &info);
41 
42   /// Launch a process with the current launch settings.
43   ///
44   /// This method supports running an lldb-gdbserver or similar
45   /// server in a situation where the startup code has been provided
46   /// with all the information for a child process to be launched.
47   ///
48   /// \return
49   ///     An Status object indicating the success or failure of the
50   ///     launch.
51   Status LaunchProcess() override;
52 
53   /// Attach to a process.
54   ///
55   /// This method supports attaching llgs to a process accessible via the
56   /// configured Platform.
57   ///
58   /// \return
59   ///     An Status object indicating the success or failure of the
60   ///     attach operation.
61   Status AttachToProcess(lldb::pid_t pid);
62 
63   /// Wait to attach to a process with a given name.
64   ///
65   /// This method supports waiting for the next instance of a process
66   /// with a given name and attaching llgs to that via the configured
67   /// Platform.
68   ///
69   /// \return
70   ///     An Status object indicating the success or failure of the
71   ///     attach operation.
72   Status AttachWaitProcess(llvm::StringRef process_name, bool include_existing);
73 
74   // NativeProcessProtocol::NativeDelegate overrides
75   void InitializeDelegate(NativeProcessProtocol *process) override;
76 
77   void ProcessStateChanged(NativeProcessProtocol *process,
78                            lldb::StateType state) override;
79 
80   void DidExec(NativeProcessProtocol *process) override;
81 
82   void
83   NewSubprocess(NativeProcessProtocol *parent_process,
84                 std::unique_ptr<NativeProcessProtocol> child_process) override;
85 
86   Status InitializeConnection(std::unique_ptr<Connection> connection);
87 
88   struct DebuggedProcess {
89     enum class Flag {
90       vkilled = (1u << 0),
91 
92       LLVM_MARK_AS_BITMASK_ENUM(vkilled)
93     };
94 
95     std::unique_ptr<NativeProcessProtocol> process_up;
96     Flag flags;
97   };
98 
99 protected:
100   MainLoop &m_mainloop;
101   MainLoop::ReadHandleUP m_network_handle_up;
102   const NativeProcessProtocol::Factory &m_process_factory;
103   lldb::tid_t m_current_tid = LLDB_INVALID_THREAD_ID;
104   lldb::tid_t m_continue_tid = LLDB_INVALID_THREAD_ID;
105   NativeProcessProtocol *m_current_process;
106   NativeProcessProtocol *m_continue_process;
107   std::recursive_mutex m_debugged_process_mutex;
108   std::unordered_map<lldb::pid_t, DebuggedProcess> m_debugged_processes;
109 
110   Communication m_stdio_communication;
111   MainLoop::ReadHandleUP m_stdio_handle_up;
112 
113   llvm::StringMap<std::unique_ptr<llvm::MemoryBuffer>> m_xfer_buffer_map;
114   std::mutex m_saved_registers_mutex;
115   std::unordered_map<uint32_t, lldb::DataBufferSP> m_saved_registers_map;
116   uint32_t m_next_saved_registers_id = 1;
117   bool m_thread_suffix_supported = false;
118   bool m_list_threads_in_stop_reply = false;
119   bool m_non_stop = false;
120   bool m_disabling_non_stop = false;
121   std::deque<std::string> m_stdio_notification_queue;
122   std::deque<std::string> m_stop_notification_queue;
123 
124   NativeProcessProtocol::Extension m_extensions_supported = {};
125 
126   PacketResult SendONotification(const char *buffer, uint32_t len);
127 
128   PacketResult SendWResponse(NativeProcessProtocol *process);
129 
130   StreamString PrepareStopReplyPacketForThread(NativeThreadProtocol &thread);
131 
132   PacketResult SendStopReplyPacketForThread(NativeProcessProtocol &process,
133                                             lldb::tid_t tid,
134                                             bool force_synchronous);
135 
136   PacketResult SendStopReasonForState(NativeProcessProtocol &process,
137                                       lldb::StateType process_state,
138                                       bool force_synchronous);
139 
140   void EnqueueStopReplyPackets(lldb::tid_t thread_to_skip);
141 
142   PacketResult Handle_k(StringExtractorGDBRemote &packet);
143 
144   PacketResult Handle_vKill(StringExtractorGDBRemote &packet);
145 
146   PacketResult Handle_qProcessInfo(StringExtractorGDBRemote &packet);
147 
148   PacketResult Handle_qC(StringExtractorGDBRemote &packet);
149 
150   PacketResult Handle_QSetDisableASLR(StringExtractorGDBRemote &packet);
151 
152   PacketResult Handle_QSetWorkingDir(StringExtractorGDBRemote &packet);
153 
154   PacketResult Handle_qGetWorkingDir(StringExtractorGDBRemote &packet);
155 
156   PacketResult Handle_QThreadSuffixSupported(StringExtractorGDBRemote &packet);
157 
158   PacketResult Handle_QListThreadsInStopReply(StringExtractorGDBRemote &packet);
159 
160   PacketResult ResumeProcess(NativeProcessProtocol &process,
161                              const ResumeActionList &actions);
162 
163   PacketResult Handle_C(StringExtractorGDBRemote &packet);
164 
165   PacketResult Handle_c(StringExtractorGDBRemote &packet);
166 
167   PacketResult Handle_vCont(StringExtractorGDBRemote &packet);
168 
169   PacketResult Handle_vCont_actions(StringExtractorGDBRemote &packet);
170 
171   PacketResult Handle_stop_reason(StringExtractorGDBRemote &packet);
172 
173   PacketResult Handle_qRegisterInfo(StringExtractorGDBRemote &packet);
174 
175   void AddProcessThreads(StreamGDBRemote &response,
176                          NativeProcessProtocol &process, bool &had_any);
177 
178   PacketResult Handle_qfThreadInfo(StringExtractorGDBRemote &packet);
179 
180   PacketResult Handle_qsThreadInfo(StringExtractorGDBRemote &packet);
181 
182   PacketResult Handle_p(StringExtractorGDBRemote &packet);
183 
184   PacketResult Handle_P(StringExtractorGDBRemote &packet);
185 
186   PacketResult Handle_H(StringExtractorGDBRemote &packet);
187 
188   PacketResult Handle_I(StringExtractorGDBRemote &packet);
189 
190   PacketResult Handle_interrupt(StringExtractorGDBRemote &packet);
191 
192   // Handles $m and $x packets.
193   PacketResult Handle_memory_read(StringExtractorGDBRemote &packet);
194 
195   PacketResult Handle_M(StringExtractorGDBRemote &packet);
196   PacketResult Handle__M(StringExtractorGDBRemote &packet);
197   PacketResult Handle__m(StringExtractorGDBRemote &packet);
198 
199   PacketResult
200   Handle_qMemoryRegionInfoSupported(StringExtractorGDBRemote &packet);
201 
202   PacketResult Handle_qMemoryRegionInfo(StringExtractorGDBRemote &packet);
203 
204   PacketResult Handle_Z(StringExtractorGDBRemote &packet);
205 
206   PacketResult Handle_z(StringExtractorGDBRemote &packet);
207 
208   PacketResult Handle_s(StringExtractorGDBRemote &packet);
209 
210   PacketResult Handle_qXfer(StringExtractorGDBRemote &packet);
211 
212   PacketResult Handle_QSaveRegisterState(StringExtractorGDBRemote &packet);
213 
214   PacketResult Handle_jLLDBTraceSupported(StringExtractorGDBRemote &packet);
215 
216   PacketResult Handle_jLLDBTraceStart(StringExtractorGDBRemote &packet);
217 
218   PacketResult Handle_jLLDBTraceStop(StringExtractorGDBRemote &packet);
219 
220   PacketResult Handle_jLLDBTraceGetState(StringExtractorGDBRemote &packet);
221 
222   PacketResult Handle_jLLDBTraceGetBinaryData(StringExtractorGDBRemote &packet);
223 
224   PacketResult Handle_QRestoreRegisterState(StringExtractorGDBRemote &packet);
225 
226   PacketResult Handle_vAttach(StringExtractorGDBRemote &packet);
227 
228   PacketResult Handle_vAttachWait(StringExtractorGDBRemote &packet);
229 
230   PacketResult Handle_qVAttachOrWaitSupported(StringExtractorGDBRemote &packet);
231 
232   PacketResult Handle_vAttachOrWait(StringExtractorGDBRemote &packet);
233 
234   PacketResult Handle_vRun(StringExtractorGDBRemote &packet);
235 
236   PacketResult Handle_D(StringExtractorGDBRemote &packet);
237 
238   PacketResult Handle_qThreadStopInfo(StringExtractorGDBRemote &packet);
239 
240   PacketResult Handle_jThreadsInfo(StringExtractorGDBRemote &packet);
241 
242   PacketResult Handle_qWatchpointSupportInfo(StringExtractorGDBRemote &packet);
243 
244   PacketResult Handle_qFileLoadAddress(StringExtractorGDBRemote &packet);
245 
246   PacketResult Handle_QPassSignals(StringExtractorGDBRemote &packet);
247 
248   PacketResult Handle_qSaveCore(StringExtractorGDBRemote &packet);
249 
250   PacketResult Handle_QNonStop(StringExtractorGDBRemote &packet);
251 
252   PacketResult HandleNotificationAck(std::deque<std::string> &queue);
253 
254   PacketResult Handle_vStdio(StringExtractorGDBRemote &packet);
255 
256   PacketResult Handle_vStopped(StringExtractorGDBRemote &packet);
257 
258   PacketResult Handle_vCtrlC(StringExtractorGDBRemote &packet);
259 
260   PacketResult Handle_g(StringExtractorGDBRemote &packet);
261 
262   PacketResult Handle_qMemTags(StringExtractorGDBRemote &packet);
263 
264   PacketResult Handle_QMemTags(StringExtractorGDBRemote &packet);
265 
266   PacketResult Handle_T(StringExtractorGDBRemote &packet);
267 
268   void SetCurrentThreadID(lldb::tid_t tid);
269 
270   lldb::tid_t GetCurrentThreadID() const;
271 
272   void SetContinueThreadID(lldb::tid_t tid);
273 
274   lldb::tid_t GetContinueThreadID() const { return m_continue_tid; }
275 
276   Status SetSTDIOFileDescriptor(int fd);
277 
278   FileSpec FindModuleFile(const std::string &module_path,
279                           const ArchSpec &arch) override;
280 
281   llvm::Expected<std::unique_ptr<llvm::MemoryBuffer>>
282   ReadXferObject(llvm::StringRef object, llvm::StringRef annex);
283 
284   static std::string XMLEncodeAttributeValue(llvm::StringRef value);
285 
286   std::vector<std::string> HandleFeatures(
287       const llvm::ArrayRef<llvm::StringRef> client_features) override;
288 
289   // Provide a response for successful continue action, i.e. send "OK"
290   // in non-stop mode, no response otherwise.
291   PacketResult SendContinueSuccessResponse();
292 
293   void AppendThreadIDToResponse(Stream &response, lldb::pid_t pid,
294                                 lldb::tid_t tid);
295 
296 private:
297   llvm::Expected<std::unique_ptr<llvm::MemoryBuffer>> BuildTargetXml();
298 
299   void HandleInferiorState_Exited(NativeProcessProtocol *process);
300 
301   void HandleInferiorState_Stopped(NativeProcessProtocol *process);
302 
303   NativeThreadProtocol *GetThreadFromSuffix(StringExtractorGDBRemote &packet);
304 
305   uint32_t GetNextSavedRegistersID();
306 
307   void MaybeCloseInferiorTerminalConnection();
308 
309   void ClearProcessSpecificData();
310 
311   void RegisterPacketHandlers();
312 
313   void DataAvailableCallback();
314 
315   void SendProcessOutput();
316 
317   void StartSTDIOForwarding();
318 
319   void StopSTDIOForwarding();
320 
321   // Call SetEnabledExtensions() with appropriate flags on the process.
322   void SetEnabledExtensions(NativeProcessProtocol &process);
323 
324   // For GDBRemoteCommunicationServerLLGS only
325   GDBRemoteCommunicationServerLLGS(const GDBRemoteCommunicationServerLLGS &) =
326       delete;
327   const GDBRemoteCommunicationServerLLGS &
328   operator=(const GDBRemoteCommunicationServerLLGS &) = delete;
329 };
330 
331 std::string LLGSArgToURL(llvm::StringRef url_arg, bool reverse_connect);
332 
333 } // namespace process_gdb_remote
334 } // namespace lldb_private
335 
336 #endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERLLGS_H
337