blob: a085a3cc17dd117968c5b1a2217c06a236fd3b5e [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
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +000013#include <mutex>
Tamas Berghammere13c2732015-02-11 10:29:30 +000014#include <unordered_map>
15
Tamas Berghammere13c2732015-02-11 10:29:30 +000016#include "lldb/Core/Communication.h"
Pavel Labath77dc9562015-07-13 10:44:55 +000017#include "lldb/Host/MainLoop.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000018#include "lldb/Host/common/NativeProcessProtocol.h"
19#include "lldb/lldb-private-forward.h"
Tamas Berghammere13c2732015-02-11 10:29:30 +000020
Tamas Berghammere13c2732015-02-11 10:29:30 +000021#include "GDBRemoteCommunicationServerCommon.h"
22
Tamas Berghammere13c2732015-02-11 10:29:30 +000023class StringExtractorGDBRemote;
24
Tamas Berghammerdb264a62015-03-31 09:52:22 +000025namespace lldb_private {
Pavel Labath77dc9562015-07-13 10:44:55 +000026
Tamas Berghammerdb264a62015-03-31 09:52:22 +000027namespace process_gdb_remote {
28
29class ProcessGDBRemote;
30
Kate Stoneb9c1b512016-09-06 20:57:50 +000031class GDBRemoteCommunicationServerLLGS
32 : public GDBRemoteCommunicationServerCommon,
33 public NativeProcessProtocol::NativeDelegate {
Tamas Berghammere13c2732015-02-11 10:29:30 +000034public:
Kate Stoneb9c1b512016-09-06 20:57:50 +000035 //------------------------------------------------------------------
36 // Constructors and Destructors
37 //------------------------------------------------------------------
Pavel Labath96e600f2017-07-07 11:02:19 +000038 GDBRemoteCommunicationServerLLGS(
39 MainLoop &mainloop,
40 const NativeProcessProtocol::Factory &process_factory);
Tamas Berghammere13c2732015-02-11 10:29:30 +000041
Pavel Labath11e59172017-12-18 14:31:39 +000042 void SetLaunchInfo(const ProcessLaunchInfo &info);
Tamas Berghammere13c2732015-02-11 10:29:30 +000043
Kate Stoneb9c1b512016-09-06 20:57:50 +000044 //------------------------------------------------------------------
45 /// Launch a process with the current launch settings.
46 ///
47 /// This method supports running an lldb-gdbserver or similar
48 /// server in a situation where the startup code has been provided
49 /// with all the information for a child process to be launched.
50 ///
51 /// @return
Zachary Turner97206d52017-05-12 04:51:55 +000052 /// An Status object indicating the success or failure of the
Kate Stoneb9c1b512016-09-06 20:57:50 +000053 /// launch.
54 //------------------------------------------------------------------
Zachary Turner97206d52017-05-12 04:51:55 +000055 Status LaunchProcess() override;
Tamas Berghammere13c2732015-02-11 10:29:30 +000056
Kate Stoneb9c1b512016-09-06 20:57:50 +000057 //------------------------------------------------------------------
58 /// Attach to a process.
59 ///
60 /// This method supports attaching llgs to a process accessible via the
61 /// configured Platform.
62 ///
63 /// @return
Zachary Turner97206d52017-05-12 04:51:55 +000064 /// An Status object indicating the success or failure of the
Kate Stoneb9c1b512016-09-06 20:57:50 +000065 /// attach operation.
66 //------------------------------------------------------------------
Zachary Turner97206d52017-05-12 04:51:55 +000067 Status AttachToProcess(lldb::pid_t pid);
Tamas Berghammere13c2732015-02-11 10:29:30 +000068
Kate Stoneb9c1b512016-09-06 20:57:50 +000069 //------------------------------------------------------------------
70 // NativeProcessProtocol::NativeDelegate overrides
71 //------------------------------------------------------------------
72 void InitializeDelegate(NativeProcessProtocol *process) override;
Tamas Berghammere13c2732015-02-11 10:29:30 +000073
Kate Stoneb9c1b512016-09-06 20:57:50 +000074 void ProcessStateChanged(NativeProcessProtocol *process,
75 lldb::StateType state) override;
Tamas Berghammere13c2732015-02-11 10:29:30 +000076
Kate Stoneb9c1b512016-09-06 20:57:50 +000077 void DidExec(NativeProcessProtocol *process) override;
Tamas Berghammere13c2732015-02-11 10:29:30 +000078
Zachary Turner97206d52017-05-12 04:51:55 +000079 Status InitializeConnection(std::unique_ptr<Connection> &&connection);
Pavel Labath77dc9562015-07-13 10:44:55 +000080
Tamas Berghammere13c2732015-02-11 10:29:30 +000081protected:
Kate Stoneb9c1b512016-09-06 20:57:50 +000082 MainLoop &m_mainloop;
83 MainLoop::ReadHandleUP m_network_handle_up;
Pavel Labath96e600f2017-07-07 11:02:19 +000084 const NativeProcessProtocol::Factory &m_process_factory;
85 lldb::tid_t m_current_tid = LLDB_INVALID_THREAD_ID;
86 lldb::tid_t m_continue_tid = LLDB_INVALID_THREAD_ID;
Kate Stoneb9c1b512016-09-06 20:57:50 +000087 std::recursive_mutex m_debugged_process_mutex;
Pavel Labath82abefa2017-07-18 09:24:48 +000088 std::unique_ptr<NativeProcessProtocol> m_debugged_process_up;
Pavel Labathc7749c32015-07-21 13:20:25 +000089
Kate Stoneb9c1b512016-09-06 20:57:50 +000090 Communication m_stdio_communication;
91 MainLoop::ReadHandleUP m_stdio_handle_up;
Pavel Labathc7749c32015-07-21 13:20:25 +000092
Pavel Labath96e600f2017-07-07 11:02:19 +000093 lldb::StateType m_inferior_prev_state = lldb::StateType::eStateInvalid;
Pavel Labathb7f0f452017-03-17 11:08:40 +000094 std::unique_ptr<llvm::MemoryBuffer> m_active_auxv_buffer_up;
Kate Stoneb9c1b512016-09-06 20:57:50 +000095 std::mutex m_saved_registers_mutex;
96 std::unordered_map<uint32_t, lldb::DataBufferSP> m_saved_registers_map;
Pavel Labath96e600f2017-07-07 11:02:19 +000097 uint32_t m_next_saved_registers_id = 1;
98 bool m_handshake_completed = false;
Tamas Berghammere13c2732015-02-11 10:29:30 +000099
Kate Stoneb9c1b512016-09-06 20:57:50 +0000100 PacketResult SendONotification(const char *buffer, uint32_t len);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000101
Kate Stoneb9c1b512016-09-06 20:57:50 +0000102 PacketResult SendWResponse(NativeProcessProtocol *process);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000103
Kate Stoneb9c1b512016-09-06 20:57:50 +0000104 PacketResult SendStopReplyPacketForThread(lldb::tid_t tid);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000105
Kate Stoneb9c1b512016-09-06 20:57:50 +0000106 PacketResult SendStopReasonForState(lldb::StateType process_state);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000107
Kate Stoneb9c1b512016-09-06 20:57:50 +0000108 PacketResult Handle_k(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000109
Kate Stoneb9c1b512016-09-06 20:57:50 +0000110 PacketResult Handle_qProcessInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000111
Kate Stoneb9c1b512016-09-06 20:57:50 +0000112 PacketResult Handle_qC(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000113
Kate Stoneb9c1b512016-09-06 20:57:50 +0000114 PacketResult Handle_QSetDisableASLR(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000115
Kate Stoneb9c1b512016-09-06 20:57:50 +0000116 PacketResult Handle_QSetWorkingDir(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000117
Kate Stoneb9c1b512016-09-06 20:57:50 +0000118 PacketResult Handle_qGetWorkingDir(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000119
Kate Stoneb9c1b512016-09-06 20:57:50 +0000120 PacketResult Handle_C(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000121
Kate Stoneb9c1b512016-09-06 20:57:50 +0000122 PacketResult Handle_c(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000123
Kate Stoneb9c1b512016-09-06 20:57:50 +0000124 PacketResult Handle_vCont(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000125
Kate Stoneb9c1b512016-09-06 20:57:50 +0000126 PacketResult Handle_vCont_actions(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000127
Kate Stoneb9c1b512016-09-06 20:57:50 +0000128 PacketResult Handle_stop_reason(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000129
Kate Stoneb9c1b512016-09-06 20:57:50 +0000130 PacketResult Handle_qRegisterInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000131
Kate Stoneb9c1b512016-09-06 20:57:50 +0000132 PacketResult Handle_qfThreadInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000133
Kate Stoneb9c1b512016-09-06 20:57:50 +0000134 PacketResult Handle_qsThreadInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000135
Kate Stoneb9c1b512016-09-06 20:57:50 +0000136 PacketResult Handle_p(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000137
Kate Stoneb9c1b512016-09-06 20:57:50 +0000138 PacketResult Handle_P(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000139
Kate Stoneb9c1b512016-09-06 20:57:50 +0000140 PacketResult Handle_H(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000141
Kate Stoneb9c1b512016-09-06 20:57:50 +0000142 PacketResult Handle_I(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000143
Kate Stoneb9c1b512016-09-06 20:57:50 +0000144 PacketResult Handle_interrupt(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000145
Kate Stoneb9c1b512016-09-06 20:57:50 +0000146 // Handles $m and $x packets.
147 PacketResult Handle_memory_read(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000148
Kate Stoneb9c1b512016-09-06 20:57:50 +0000149 PacketResult Handle_M(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000150
Kate Stoneb9c1b512016-09-06 20:57:50 +0000151 PacketResult
152 Handle_qMemoryRegionInfoSupported(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000153
Kate Stoneb9c1b512016-09-06 20:57:50 +0000154 PacketResult Handle_qMemoryRegionInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000155
Kate Stoneb9c1b512016-09-06 20:57:50 +0000156 PacketResult Handle_Z(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000157
Kate Stoneb9c1b512016-09-06 20:57:50 +0000158 PacketResult Handle_z(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000159
Kate Stoneb9c1b512016-09-06 20:57:50 +0000160 PacketResult Handle_s(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000161
Kate Stoneb9c1b512016-09-06 20:57:50 +0000162 PacketResult Handle_qXfer_auxv_read(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000163
Kate Stoneb9c1b512016-09-06 20:57:50 +0000164 PacketResult Handle_QSaveRegisterState(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000165
Ravitheja Addepallye714c4f2017-05-26 11:46:27 +0000166 PacketResult Handle_jTraceStart(StringExtractorGDBRemote &packet);
167
168 PacketResult Handle_jTraceRead(StringExtractorGDBRemote &packet);
169
170 PacketResult Handle_jTraceStop(StringExtractorGDBRemote &packet);
171
172 PacketResult Handle_jTraceConfigRead(StringExtractorGDBRemote &packet);
173
Kate Stoneb9c1b512016-09-06 20:57:50 +0000174 PacketResult Handle_QRestoreRegisterState(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000175
Kate Stoneb9c1b512016-09-06 20:57:50 +0000176 PacketResult Handle_vAttach(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000177
Kate Stoneb9c1b512016-09-06 20:57:50 +0000178 PacketResult Handle_D(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000179
Kate Stoneb9c1b512016-09-06 20:57:50 +0000180 PacketResult Handle_qThreadStopInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000181
Kate Stoneb9c1b512016-09-06 20:57:50 +0000182 PacketResult Handle_jThreadsInfo(StringExtractorGDBRemote &packet);
Pavel Labath4a4bb122015-07-16 14:14:35 +0000183
Kate Stoneb9c1b512016-09-06 20:57:50 +0000184 PacketResult Handle_qWatchpointSupportInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000185
Kate Stoneb9c1b512016-09-06 20:57:50 +0000186 PacketResult Handle_qFileLoadAddress(StringExtractorGDBRemote &packet);
Tamas Berghammer783bfc82015-06-18 20:43:56 +0000187
Pavel Labath4a705e72017-02-24 09:29:14 +0000188 PacketResult Handle_QPassSignals(StringExtractorGDBRemote &packet);
189
Kate Stoneb9c1b512016-09-06 20:57:50 +0000190 void SetCurrentThreadID(lldb::tid_t tid);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000191
Kate Stoneb9c1b512016-09-06 20:57:50 +0000192 lldb::tid_t GetCurrentThreadID() const;
Tamas Berghammere13c2732015-02-11 10:29:30 +0000193
Kate Stoneb9c1b512016-09-06 20:57:50 +0000194 void SetContinueThreadID(lldb::tid_t tid);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000195
Kate Stoneb9c1b512016-09-06 20:57:50 +0000196 lldb::tid_t GetContinueThreadID() const { return m_continue_tid; }
Tamas Berghammere13c2732015-02-11 10:29:30 +0000197
Zachary Turner97206d52017-05-12 04:51:55 +0000198 Status SetSTDIOFileDescriptor(int fd);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000199
Kate Stoneb9c1b512016-09-06 20:57:50 +0000200 FileSpec FindModuleFile(const std::string &module_path,
201 const ArchSpec &arch) override;
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +0000202
Tamas Berghammere13c2732015-02-11 10:29:30 +0000203private:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000204 void HandleInferiorState_Exited(NativeProcessProtocol *process);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000205
Kate Stoneb9c1b512016-09-06 20:57:50 +0000206 void HandleInferiorState_Stopped(NativeProcessProtocol *process);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000207
Pavel Labatha5be48b2017-10-17 15:52:16 +0000208 NativeThreadProtocol *GetThreadFromSuffix(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000209
Kate Stoneb9c1b512016-09-06 20:57:50 +0000210 uint32_t GetNextSavedRegistersID();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000211
Kate Stoneb9c1b512016-09-06 20:57:50 +0000212 void MaybeCloseInferiorTerminalConnection();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000213
Kate Stoneb9c1b512016-09-06 20:57:50 +0000214 void ClearProcessSpecificData();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000215
Kate Stoneb9c1b512016-09-06 20:57:50 +0000216 void RegisterPacketHandlers();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000217
Kate Stoneb9c1b512016-09-06 20:57:50 +0000218 void DataAvailableCallback();
Pavel Labath77dc9562015-07-13 10:44:55 +0000219
Kate Stoneb9c1b512016-09-06 20:57:50 +0000220 void SendProcessOutput();
Pavel Labathc7749c32015-07-21 13:20:25 +0000221
Kate Stoneb9c1b512016-09-06 20:57:50 +0000222 void StartSTDIOForwarding();
Pavel Labathabadc222015-11-27 13:33:29 +0000223
Kate Stoneb9c1b512016-09-06 20:57:50 +0000224 void StopSTDIOForwarding();
Pavel Labathc7749c32015-07-21 13:20:25 +0000225
Kate Stoneb9c1b512016-09-06 20:57:50 +0000226 //------------------------------------------------------------------
227 // For GDBRemoteCommunicationServerLLGS only
228 //------------------------------------------------------------------
229 DISALLOW_COPY_AND_ASSIGN(GDBRemoteCommunicationServerLLGS);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000230};
231
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000232} // namespace process_gdb_remote
233} // namespace lldb_private
234
Kate Stoneb9c1b512016-09-06 20:57:50 +0000235#endif // liblldb_GDBRemoteCommunicationServerLLGS_h_