blob: ebda9a911d3c1866310aecc69f1365b585f1c25a [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
Tamas Berghammere13c2732015-02-11 10:29:30 +000019#include "lldb/Core/Communication.h"
Pavel Labath77dc9562015-07-13 10:44:55 +000020#include "lldb/Host/MainLoop.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000021#include "lldb/Host/common/NativeProcessProtocol.h"
22#include "lldb/lldb-private-forward.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
Kate Stoneb9c1b512016-09-06 20:57:50 +000035class GDBRemoteCommunicationServerLLGS
36 : public GDBRemoteCommunicationServerCommon,
37 public NativeProcessProtocol::NativeDelegate {
Tamas Berghammere13c2732015-02-11 10:29:30 +000038public:
Kate Stoneb9c1b512016-09-06 20:57:50 +000039 //------------------------------------------------------------------
40 // Constructors and Destructors
41 //------------------------------------------------------------------
42 GDBRemoteCommunicationServerLLGS(MainLoop &mainloop);
Tamas Berghammere13c2732015-02-11 10:29:30 +000043
Kate Stoneb9c1b512016-09-06 20:57:50 +000044 //------------------------------------------------------------------
45 /// Specify the program to launch and its arguments.
46 ///
47 /// @param[in] args
48 /// The command line to launch.
49 ///
50 /// @param[in] argc
51 /// The number of elements in the args array of cstring pointers.
52 ///
53 /// @return
Zachary Turner97206d52017-05-12 04:51:55 +000054 /// An Status object indicating the success or failure of making
Kate Stoneb9c1b512016-09-06 20:57:50 +000055 /// the setting.
56 //------------------------------------------------------------------
Zachary Turner97206d52017-05-12 04:51:55 +000057 Status SetLaunchArguments(const char *const args[], int argc);
Tamas Berghammere13c2732015-02-11 10:29:30 +000058
Kate Stoneb9c1b512016-09-06 20:57:50 +000059 //------------------------------------------------------------------
60 /// Specify the launch flags for the process.
61 ///
62 /// @param[in] launch_flags
63 /// The launch flags to use when launching this process.
64 ///
65 /// @return
Zachary Turner97206d52017-05-12 04:51:55 +000066 /// An Status object indicating the success or failure of making
Kate Stoneb9c1b512016-09-06 20:57:50 +000067 /// the setting.
68 //------------------------------------------------------------------
Zachary Turner97206d52017-05-12 04:51:55 +000069 Status SetLaunchFlags(unsigned int launch_flags);
Tamas Berghammere13c2732015-02-11 10:29:30 +000070
Kate Stoneb9c1b512016-09-06 20:57:50 +000071 //------------------------------------------------------------------
72 /// Launch a process with the current launch settings.
73 ///
74 /// This method supports running an lldb-gdbserver or similar
75 /// server in a situation where the startup code has been provided
76 /// with all the information for a child process to be launched.
77 ///
78 /// @return
Zachary Turner97206d52017-05-12 04:51:55 +000079 /// An Status object indicating the success or failure of the
Kate Stoneb9c1b512016-09-06 20:57:50 +000080 /// launch.
81 //------------------------------------------------------------------
Zachary Turner97206d52017-05-12 04:51:55 +000082 Status LaunchProcess() override;
Tamas Berghammere13c2732015-02-11 10:29:30 +000083
Kate Stoneb9c1b512016-09-06 20:57:50 +000084 //------------------------------------------------------------------
85 /// Attach to a process.
86 ///
87 /// This method supports attaching llgs to a process accessible via the
88 /// configured Platform.
89 ///
90 /// @return
Zachary Turner97206d52017-05-12 04:51:55 +000091 /// An Status object indicating the success or failure of the
Kate Stoneb9c1b512016-09-06 20:57:50 +000092 /// attach operation.
93 //------------------------------------------------------------------
Zachary Turner97206d52017-05-12 04:51:55 +000094 Status AttachToProcess(lldb::pid_t pid);
Tamas Berghammere13c2732015-02-11 10:29:30 +000095
Kate Stoneb9c1b512016-09-06 20:57:50 +000096 //------------------------------------------------------------------
97 // NativeProcessProtocol::NativeDelegate overrides
98 //------------------------------------------------------------------
99 void InitializeDelegate(NativeProcessProtocol *process) override;
Tamas Berghammere13c2732015-02-11 10:29:30 +0000100
Kate Stoneb9c1b512016-09-06 20:57:50 +0000101 void ProcessStateChanged(NativeProcessProtocol *process,
102 lldb::StateType state) override;
Tamas Berghammere13c2732015-02-11 10:29:30 +0000103
Kate Stoneb9c1b512016-09-06 20:57:50 +0000104 void DidExec(NativeProcessProtocol *process) override;
Tamas Berghammere13c2732015-02-11 10:29:30 +0000105
Zachary Turner97206d52017-05-12 04:51:55 +0000106 Status InitializeConnection(std::unique_ptr<Connection> &&connection);
Pavel Labath77dc9562015-07-13 10:44:55 +0000107
Tamas Berghammere13c2732015-02-11 10:29:30 +0000108protected:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000109 MainLoop &m_mainloop;
110 MainLoop::ReadHandleUP m_network_handle_up;
111 lldb::tid_t m_current_tid;
112 lldb::tid_t m_continue_tid;
113 std::recursive_mutex m_debugged_process_mutex;
114 NativeProcessProtocolSP m_debugged_process_sp;
Pavel Labathc7749c32015-07-21 13:20:25 +0000115
Kate Stoneb9c1b512016-09-06 20:57:50 +0000116 Communication m_stdio_communication;
117 MainLoop::ReadHandleUP m_stdio_handle_up;
Pavel Labathc7749c32015-07-21 13:20:25 +0000118
Kate Stoneb9c1b512016-09-06 20:57:50 +0000119 lldb::StateType m_inferior_prev_state;
Pavel Labathb7f0f452017-03-17 11:08:40 +0000120 std::unique_ptr<llvm::MemoryBuffer> m_active_auxv_buffer_up;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000121 std::mutex m_saved_registers_mutex;
122 std::unordered_map<uint32_t, lldb::DataBufferSP> m_saved_registers_map;
123 uint32_t m_next_saved_registers_id;
124 bool m_handshake_completed : 1;
Tamas Berghammere13c2732015-02-11 10:29:30 +0000125
Kate Stoneb9c1b512016-09-06 20:57:50 +0000126 PacketResult SendONotification(const char *buffer, uint32_t len);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000127
Kate Stoneb9c1b512016-09-06 20:57:50 +0000128 PacketResult SendWResponse(NativeProcessProtocol *process);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000129
Kate Stoneb9c1b512016-09-06 20:57:50 +0000130 PacketResult SendStopReplyPacketForThread(lldb::tid_t tid);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000131
Kate Stoneb9c1b512016-09-06 20:57:50 +0000132 PacketResult SendStopReasonForState(lldb::StateType process_state);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000133
Kate Stoneb9c1b512016-09-06 20:57:50 +0000134 PacketResult Handle_k(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000135
Kate Stoneb9c1b512016-09-06 20:57:50 +0000136 PacketResult Handle_qProcessInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000137
Kate Stoneb9c1b512016-09-06 20:57:50 +0000138 PacketResult Handle_qC(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000139
Kate Stoneb9c1b512016-09-06 20:57:50 +0000140 PacketResult Handle_QSetDisableASLR(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000141
Kate Stoneb9c1b512016-09-06 20:57:50 +0000142 PacketResult Handle_QSetWorkingDir(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000143
Kate Stoneb9c1b512016-09-06 20:57:50 +0000144 PacketResult Handle_qGetWorkingDir(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000145
Kate Stoneb9c1b512016-09-06 20:57:50 +0000146 PacketResult Handle_C(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000147
Kate Stoneb9c1b512016-09-06 20:57:50 +0000148 PacketResult Handle_c(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000149
Kate Stoneb9c1b512016-09-06 20:57:50 +0000150 PacketResult Handle_vCont(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000151
Kate Stoneb9c1b512016-09-06 20:57:50 +0000152 PacketResult Handle_vCont_actions(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000153
Kate Stoneb9c1b512016-09-06 20:57:50 +0000154 PacketResult Handle_stop_reason(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000155
Kate Stoneb9c1b512016-09-06 20:57:50 +0000156 PacketResult Handle_qRegisterInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000157
Kate Stoneb9c1b512016-09-06 20:57:50 +0000158 PacketResult Handle_qfThreadInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000159
Kate Stoneb9c1b512016-09-06 20:57:50 +0000160 PacketResult Handle_qsThreadInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000161
Kate Stoneb9c1b512016-09-06 20:57:50 +0000162 PacketResult Handle_p(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000163
Kate Stoneb9c1b512016-09-06 20:57:50 +0000164 PacketResult Handle_P(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000165
Kate Stoneb9c1b512016-09-06 20:57:50 +0000166 PacketResult Handle_H(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000167
Kate Stoneb9c1b512016-09-06 20:57:50 +0000168 PacketResult Handle_I(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000169
Kate Stoneb9c1b512016-09-06 20:57:50 +0000170 PacketResult Handle_interrupt(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000171
Kate Stoneb9c1b512016-09-06 20:57:50 +0000172 // Handles $m and $x packets.
173 PacketResult Handle_memory_read(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000174
Kate Stoneb9c1b512016-09-06 20:57:50 +0000175 PacketResult Handle_M(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000176
Kate Stoneb9c1b512016-09-06 20:57:50 +0000177 PacketResult
178 Handle_qMemoryRegionInfoSupported(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000179
Kate Stoneb9c1b512016-09-06 20:57:50 +0000180 PacketResult Handle_qMemoryRegionInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000181
Kate Stoneb9c1b512016-09-06 20:57:50 +0000182 PacketResult Handle_Z(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000183
Kate Stoneb9c1b512016-09-06 20:57:50 +0000184 PacketResult Handle_z(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000185
Kate Stoneb9c1b512016-09-06 20:57:50 +0000186 PacketResult Handle_s(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000187
Kate Stoneb9c1b512016-09-06 20:57:50 +0000188 PacketResult Handle_qXfer_auxv_read(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000189
Kate Stoneb9c1b512016-09-06 20:57:50 +0000190 PacketResult Handle_QSaveRegisterState(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000191
Kate Stoneb9c1b512016-09-06 20:57:50 +0000192 PacketResult Handle_QRestoreRegisterState(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000193
Kate Stoneb9c1b512016-09-06 20:57:50 +0000194 PacketResult Handle_vAttach(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000195
Kate Stoneb9c1b512016-09-06 20:57:50 +0000196 PacketResult Handle_D(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000197
Kate Stoneb9c1b512016-09-06 20:57:50 +0000198 PacketResult Handle_qThreadStopInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000199
Kate Stoneb9c1b512016-09-06 20:57:50 +0000200 PacketResult Handle_jThreadsInfo(StringExtractorGDBRemote &packet);
Pavel Labath4a4bb122015-07-16 14:14:35 +0000201
Kate Stoneb9c1b512016-09-06 20:57:50 +0000202 PacketResult Handle_qWatchpointSupportInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000203
Kate Stoneb9c1b512016-09-06 20:57:50 +0000204 PacketResult Handle_qFileLoadAddress(StringExtractorGDBRemote &packet);
Tamas Berghammer783bfc82015-06-18 20:43:56 +0000205
Pavel Labath4a705e72017-02-24 09:29:14 +0000206 PacketResult Handle_QPassSignals(StringExtractorGDBRemote &packet);
207
Kate Stoneb9c1b512016-09-06 20:57:50 +0000208 void SetCurrentThreadID(lldb::tid_t tid);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000209
Kate Stoneb9c1b512016-09-06 20:57:50 +0000210 lldb::tid_t GetCurrentThreadID() const;
Tamas Berghammere13c2732015-02-11 10:29:30 +0000211
Kate Stoneb9c1b512016-09-06 20:57:50 +0000212 void SetContinueThreadID(lldb::tid_t tid);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000213
Kate Stoneb9c1b512016-09-06 20:57:50 +0000214 lldb::tid_t GetContinueThreadID() const { return m_continue_tid; }
Tamas Berghammere13c2732015-02-11 10:29:30 +0000215
Zachary Turner97206d52017-05-12 04:51:55 +0000216 Status SetSTDIOFileDescriptor(int fd);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000217
Kate Stoneb9c1b512016-09-06 20:57:50 +0000218 FileSpec FindModuleFile(const std::string &module_path,
219 const ArchSpec &arch) override;
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +0000220
Tamas Berghammere13c2732015-02-11 10:29:30 +0000221private:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000222 void HandleInferiorState_Exited(NativeProcessProtocol *process);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000223
Kate Stoneb9c1b512016-09-06 20:57:50 +0000224 void HandleInferiorState_Stopped(NativeProcessProtocol *process);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000225
Kate Stoneb9c1b512016-09-06 20:57:50 +0000226 NativeThreadProtocolSP GetThreadFromSuffix(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000227
Kate Stoneb9c1b512016-09-06 20:57:50 +0000228 uint32_t GetNextSavedRegistersID();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000229
Kate Stoneb9c1b512016-09-06 20:57:50 +0000230 void MaybeCloseInferiorTerminalConnection();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000231
Kate Stoneb9c1b512016-09-06 20:57:50 +0000232 void ClearProcessSpecificData();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000233
Kate Stoneb9c1b512016-09-06 20:57:50 +0000234 void RegisterPacketHandlers();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000235
Kate Stoneb9c1b512016-09-06 20:57:50 +0000236 void DataAvailableCallback();
Pavel Labath77dc9562015-07-13 10:44:55 +0000237
Kate Stoneb9c1b512016-09-06 20:57:50 +0000238 void SendProcessOutput();
Pavel Labathc7749c32015-07-21 13:20:25 +0000239
Kate Stoneb9c1b512016-09-06 20:57:50 +0000240 void StartSTDIOForwarding();
Pavel Labathabadc222015-11-27 13:33:29 +0000241
Kate Stoneb9c1b512016-09-06 20:57:50 +0000242 void StopSTDIOForwarding();
Pavel Labathc7749c32015-07-21 13:20:25 +0000243
Kate Stoneb9c1b512016-09-06 20:57:50 +0000244 //------------------------------------------------------------------
245 // For GDBRemoteCommunicationServerLLGS only
246 //------------------------------------------------------------------
247 DISALLOW_COPY_AND_ASSIGN(GDBRemoteCommunicationServerLLGS);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000248};
249
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000250} // namespace process_gdb_remote
251} // namespace lldb_private
252
Kate Stoneb9c1b512016-09-06 20:57:50 +0000253#endif // liblldb_GDBRemoteCommunicationServerLLGS_h_