blob: caf6eb319e63b2abbfb6afd5573612aa76236394 [file] [log] [blame]
Tamas Berghammere13c2732015-02-11 10:29:30 +00001//===-- GDBRemoteCommunicationServerLLGS.h ----------------------*- 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#ifndef liblldb_GDBRemoteCommunicationServerLLGS_h_
11#define liblldb_GDBRemoteCommunicationServerLLGS_h_
12
13// C Includes
14// C++ Includes
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +000015#include <mutex>
Tamas Berghammere13c2732015-02-11 10:29:30 +000016#include <unordered_map>
17
18// Other libraries and framework includes
19#include "lldb/lldb-private-forward.h"
20#include "lldb/Core/Communication.h"
Tamas Berghammere13c2732015-02-11 10:29:30 +000021#include "lldb/Host/common/NativeProcessProtocol.h"
Pavel Labath77dc9562015-07-13 10:44:55 +000022#include "lldb/Host/MainLoop.h"
Tamas Berghammere13c2732015-02-11 10:29:30 +000023
24// Project includes
25#include "GDBRemoteCommunicationServerCommon.h"
26
Tamas Berghammere13c2732015-02-11 10:29:30 +000027class StringExtractorGDBRemote;
28
Tamas Berghammerdb264a62015-03-31 09:52:22 +000029namespace lldb_private {
Pavel Labath77dc9562015-07-13 10:44:55 +000030
Tamas Berghammerdb264a62015-03-31 09:52:22 +000031namespace process_gdb_remote {
32
33class ProcessGDBRemote;
34
Tamas Berghammere13c2732015-02-11 10:29:30 +000035class GDBRemoteCommunicationServerLLGS :
36 public GDBRemoteCommunicationServerCommon,
Tamas Berghammerdb264a62015-03-31 09:52:22 +000037 public NativeProcessProtocol::NativeDelegate
Tamas Berghammere13c2732015-02-11 10:29:30 +000038{
39public:
40 //------------------------------------------------------------------
41 // Constructors and Destructors
42 //------------------------------------------------------------------
Pavel Labathf1763532016-06-29 13:58:27 +000043 GDBRemoteCommunicationServerLLGS(MainLoop &mainloop);
Tamas Berghammere13c2732015-02-11 10:29:30 +000044
Tamas Berghammere13c2732015-02-11 10:29:30 +000045 //------------------------------------------------------------------
46 /// Specify the program to launch and its arguments.
47 ///
48 /// @param[in] args
49 /// The command line to launch.
50 ///
51 /// @param[in] argc
52 /// The number of elements in the args array of cstring pointers.
53 ///
54 /// @return
55 /// An Error object indicating the success or failure of making
56 /// the setting.
57 //------------------------------------------------------------------
Tamas Berghammerdb264a62015-03-31 09:52:22 +000058 Error
Tamas Berghammere13c2732015-02-11 10:29:30 +000059 SetLaunchArguments (const char *const args[], int argc);
60
61 //------------------------------------------------------------------
62 /// Specify the launch flags for the process.
63 ///
64 /// @param[in] launch_flags
65 /// The launch flags to use when launching this process.
66 ///
67 /// @return
68 /// An Error object indicating the success or failure of making
69 /// the setting.
70 //------------------------------------------------------------------
Tamas Berghammerdb264a62015-03-31 09:52:22 +000071 Error
Tamas Berghammere13c2732015-02-11 10:29:30 +000072 SetLaunchFlags (unsigned int launch_flags);
73
74 //------------------------------------------------------------------
75 /// Launch a process with the current launch settings.
76 ///
77 /// This method supports running an lldb-gdbserver or similar
78 /// server in a situation where the startup code has been provided
79 /// with all the information for a child process to be launched.
80 ///
81 /// @return
82 /// An Error object indicating the success or failure of the
83 /// launch.
84 //------------------------------------------------------------------
Tamas Berghammerdb264a62015-03-31 09:52:22 +000085 Error
Tamas Berghammere13c2732015-02-11 10:29:30 +000086 LaunchProcess () override;
87
88 //------------------------------------------------------------------
89 /// Attach to a process.
90 ///
91 /// This method supports attaching llgs to a process accessible via the
92 /// configured Platform.
93 ///
94 /// @return
95 /// An Error object indicating the success or failure of the
96 /// attach operation.
97 //------------------------------------------------------------------
Tamas Berghammerdb264a62015-03-31 09:52:22 +000098 Error
Tamas Berghammere13c2732015-02-11 10:29:30 +000099 AttachToProcess (lldb::pid_t pid);
100
101 //------------------------------------------------------------------
102 // NativeProcessProtocol::NativeDelegate overrides
103 //------------------------------------------------------------------
104 void
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000105 InitializeDelegate (NativeProcessProtocol *process) override;
Tamas Berghammere13c2732015-02-11 10:29:30 +0000106
107 void
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000108 ProcessStateChanged (NativeProcessProtocol *process, lldb::StateType state) override;
Tamas Berghammere13c2732015-02-11 10:29:30 +0000109
110 void
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000111 DidExec (NativeProcessProtocol *process) override;
Tamas Berghammere13c2732015-02-11 10:29:30 +0000112
Pavel Labath77dc9562015-07-13 10:44:55 +0000113 Error
114 InitializeConnection (std::unique_ptr<Connection> &&connection);
115
Tamas Berghammere13c2732015-02-11 10:29:30 +0000116protected:
Pavel Labath77dc9562015-07-13 10:44:55 +0000117 MainLoop &m_mainloop;
Pavel Labathc7749c32015-07-21 13:20:25 +0000118 MainLoop::ReadHandleUP m_network_handle_up;
Tamas Berghammere13c2732015-02-11 10:29:30 +0000119 lldb::tid_t m_current_tid;
120 lldb::tid_t m_continue_tid;
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +0000121 std::recursive_mutex m_debugged_process_mutex;
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000122 NativeProcessProtocolSP m_debugged_process_sp;
Pavel Labathc7749c32015-07-21 13:20:25 +0000123
Tamas Berghammere13c2732015-02-11 10:29:30 +0000124 Communication m_stdio_communication;
Pavel Labathc7749c32015-07-21 13:20:25 +0000125 MainLoop::ReadHandleUP m_stdio_handle_up;
126
Tamas Berghammere13c2732015-02-11 10:29:30 +0000127 lldb::StateType m_inferior_prev_state;
128 lldb::DataBufferSP m_active_auxv_buffer_sp;
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +0000129 std::mutex m_saved_registers_mutex;
Tamas Berghammere13c2732015-02-11 10:29:30 +0000130 std::unordered_map<uint32_t, lldb::DataBufferSP> m_saved_registers_map;
131 uint32_t m_next_saved_registers_id;
Pavel Labath77dc9562015-07-13 10:44:55 +0000132 bool m_handshake_completed : 1;
Tamas Berghammere13c2732015-02-11 10:29:30 +0000133
134 PacketResult
135 SendONotification (const char *buffer, uint32_t len);
136
137 PacketResult
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000138 SendWResponse (NativeProcessProtocol *process);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000139
140 PacketResult
141 SendStopReplyPacketForThread (lldb::tid_t tid);
142
143 PacketResult
Pavel Labathc7749c32015-07-21 13:20:25 +0000144 SendStopReasonForState (lldb::StateType process_state);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000145
146 PacketResult
147 Handle_k (StringExtractorGDBRemote &packet);
148
149 PacketResult
150 Handle_qProcessInfo (StringExtractorGDBRemote &packet);
151
152 PacketResult
153 Handle_qC (StringExtractorGDBRemote &packet);
154
155 PacketResult
156 Handle_QSetDisableASLR (StringExtractorGDBRemote &packet);
157
158 PacketResult
159 Handle_QSetWorkingDir (StringExtractorGDBRemote &packet);
160
161 PacketResult
162 Handle_qGetWorkingDir (StringExtractorGDBRemote &packet);
163
164 PacketResult
165 Handle_C (StringExtractorGDBRemote &packet);
166
167 PacketResult
168 Handle_c (StringExtractorGDBRemote &packet);
169
170 PacketResult
171 Handle_vCont (StringExtractorGDBRemote &packet);
172
173 PacketResult
174 Handle_vCont_actions (StringExtractorGDBRemote &packet);
175
176 PacketResult
177 Handle_stop_reason (StringExtractorGDBRemote &packet);
178
179 PacketResult
180 Handle_qRegisterInfo (StringExtractorGDBRemote &packet);
181
182 PacketResult
183 Handle_qfThreadInfo (StringExtractorGDBRemote &packet);
184
185 PacketResult
186 Handle_qsThreadInfo (StringExtractorGDBRemote &packet);
187
188 PacketResult
189 Handle_p (StringExtractorGDBRemote &packet);
190
191 PacketResult
192 Handle_P (StringExtractorGDBRemote &packet);
193
194 PacketResult
195 Handle_H (StringExtractorGDBRemote &packet);
196
197 PacketResult
198 Handle_I (StringExtractorGDBRemote &packet);
199
200 PacketResult
201 Handle_interrupt (StringExtractorGDBRemote &packet);
202
Pavel Labath3bf11252015-10-14 12:59:37 +0000203 // Handles $m and $x packets.
Tamas Berghammere13c2732015-02-11 10:29:30 +0000204 PacketResult
Pavel Labath3bf11252015-10-14 12:59:37 +0000205 Handle_memory_read (StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000206
207 PacketResult
208 Handle_M (StringExtractorGDBRemote &packet);
209
210 PacketResult
211 Handle_qMemoryRegionInfoSupported (StringExtractorGDBRemote &packet);
212
213 PacketResult
214 Handle_qMemoryRegionInfo (StringExtractorGDBRemote &packet);
215
216 PacketResult
217 Handle_Z (StringExtractorGDBRemote &packet);
218
219 PacketResult
220 Handle_z (StringExtractorGDBRemote &packet);
221
222 PacketResult
223 Handle_s (StringExtractorGDBRemote &packet);
224
225 PacketResult
226 Handle_qXfer_auxv_read (StringExtractorGDBRemote &packet);
227
228 PacketResult
229 Handle_QSaveRegisterState (StringExtractorGDBRemote &packet);
230
231 PacketResult
232 Handle_QRestoreRegisterState (StringExtractorGDBRemote &packet);
233
234 PacketResult
235 Handle_vAttach (StringExtractorGDBRemote &packet);
236
237 PacketResult
238 Handle_D (StringExtractorGDBRemote &packet);
239
240 PacketResult
241 Handle_qThreadStopInfo (StringExtractorGDBRemote &packet);
242
243 PacketResult
Pavel Labath4a4bb122015-07-16 14:14:35 +0000244 Handle_jThreadsInfo (StringExtractorGDBRemote &packet);
245
246 PacketResult
Tamas Berghammere13c2732015-02-11 10:29:30 +0000247 Handle_qWatchpointSupportInfo (StringExtractorGDBRemote &packet);
248
Tamas Berghammer783bfc82015-06-18 20:43:56 +0000249 PacketResult
250 Handle_qFileLoadAddress (StringExtractorGDBRemote &packet);
251
Tamas Berghammere13c2732015-02-11 10:29:30 +0000252 void
253 SetCurrentThreadID (lldb::tid_t tid);
254
255 lldb::tid_t
256 GetCurrentThreadID () const;
257
258 void
259 SetContinueThreadID (lldb::tid_t tid);
260
261 lldb::tid_t
262 GetContinueThreadID () const { return m_continue_tid; }
263
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000264 Error
Tamas Berghammere13c2732015-02-11 10:29:30 +0000265 SetSTDIOFileDescriptor (int fd);
266
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000267 FileSpec
268 FindModuleFile (const std::string& module_path, const ArchSpec& arch) override;
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +0000269
Tamas Berghammere13c2732015-02-11 10:29:30 +0000270private:
Tamas Berghammere13c2732015-02-11 10:29:30 +0000271 void
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000272 HandleInferiorState_Exited (NativeProcessProtocol *process);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000273
274 void
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000275 HandleInferiorState_Stopped (NativeProcessProtocol *process);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000276
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000277 NativeThreadProtocolSP
Tamas Berghammere13c2732015-02-11 10:29:30 +0000278 GetThreadFromSuffix (StringExtractorGDBRemote &packet);
279
280 uint32_t
281 GetNextSavedRegistersID ();
282
283 void
284 MaybeCloseInferiorTerminalConnection ();
285
286 void
287 ClearProcessSpecificData ();
288
Tamas Berghammere13c2732015-02-11 10:29:30 +0000289 void
290 RegisterPacketHandlers ();
291
Pavel Labath77dc9562015-07-13 10:44:55 +0000292 void
293 DataAvailableCallback ();
294
Pavel Labathc7749c32015-07-21 13:20:25 +0000295 void
296 SendProcessOutput ();
297
298 void
Pavel Labathabadc222015-11-27 13:33:29 +0000299 StartSTDIOForwarding();
300
301 void
Pavel Labathc7749c32015-07-21 13:20:25 +0000302 StopSTDIOForwarding();
303
Tamas Berghammere13c2732015-02-11 10:29:30 +0000304 //------------------------------------------------------------------
305 // For GDBRemoteCommunicationServerLLGS only
306 //------------------------------------------------------------------
307 DISALLOW_COPY_AND_ASSIGN (GDBRemoteCommunicationServerLLGS);
308};
309
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000310} // namespace process_gdb_remote
311} // namespace lldb_private
312
Tamas Berghammere13c2732015-02-11 10:29:30 +0000313#endif // liblldb_GDBRemoteCommunicationServerLLGS_h_