blob: 5a74d1acaa237161e5b57fb9c901c2a7d1746ea5 [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 //------------------------------------------------------------------
Pavel Labath96e600f2017-07-07 11:02:19 +000042 GDBRemoteCommunicationServerLLGS(
43 MainLoop &mainloop,
44 const NativeProcessProtocol::Factory &process_factory);
Tamas Berghammere13c2732015-02-11 10:29:30 +000045
Pavel Labath11e59172017-12-18 14:31:39 +000046 void SetLaunchInfo(const ProcessLaunchInfo &info);
Tamas Berghammere13c2732015-02-11 10:29:30 +000047
Kate Stoneb9c1b512016-09-06 20:57:50 +000048 //------------------------------------------------------------------
49 /// Launch a process with the current launch settings.
50 ///
51 /// This method supports running an lldb-gdbserver or similar
52 /// server in a situation where the startup code has been provided
53 /// with all the information for a child process to be launched.
54 ///
55 /// @return
Zachary Turner97206d52017-05-12 04:51:55 +000056 /// An Status object indicating the success or failure of the
Kate Stoneb9c1b512016-09-06 20:57:50 +000057 /// launch.
58 //------------------------------------------------------------------
Zachary Turner97206d52017-05-12 04:51:55 +000059 Status LaunchProcess() override;
Tamas Berghammere13c2732015-02-11 10:29:30 +000060
Kate Stoneb9c1b512016-09-06 20:57:50 +000061 //------------------------------------------------------------------
62 /// Attach to a process.
63 ///
64 /// This method supports attaching llgs to a process accessible via the
65 /// configured Platform.
66 ///
67 /// @return
Zachary Turner97206d52017-05-12 04:51:55 +000068 /// An Status object indicating the success or failure of the
Kate Stoneb9c1b512016-09-06 20:57:50 +000069 /// attach operation.
70 //------------------------------------------------------------------
Zachary Turner97206d52017-05-12 04:51:55 +000071 Status AttachToProcess(lldb::pid_t pid);
Tamas Berghammere13c2732015-02-11 10:29:30 +000072
Kate Stoneb9c1b512016-09-06 20:57:50 +000073 //------------------------------------------------------------------
74 // NativeProcessProtocol::NativeDelegate overrides
75 //------------------------------------------------------------------
76 void InitializeDelegate(NativeProcessProtocol *process) override;
Tamas Berghammere13c2732015-02-11 10:29:30 +000077
Kate Stoneb9c1b512016-09-06 20:57:50 +000078 void ProcessStateChanged(NativeProcessProtocol *process,
79 lldb::StateType state) override;
Tamas Berghammere13c2732015-02-11 10:29:30 +000080
Kate Stoneb9c1b512016-09-06 20:57:50 +000081 void DidExec(NativeProcessProtocol *process) override;
Tamas Berghammere13c2732015-02-11 10:29:30 +000082
Zachary Turner97206d52017-05-12 04:51:55 +000083 Status InitializeConnection(std::unique_ptr<Connection> &&connection);
Pavel Labath77dc9562015-07-13 10:44:55 +000084
Tamas Berghammere13c2732015-02-11 10:29:30 +000085protected:
Kate Stoneb9c1b512016-09-06 20:57:50 +000086 MainLoop &m_mainloop;
87 MainLoop::ReadHandleUP m_network_handle_up;
Pavel Labath96e600f2017-07-07 11:02:19 +000088 const NativeProcessProtocol::Factory &m_process_factory;
89 lldb::tid_t m_current_tid = LLDB_INVALID_THREAD_ID;
90 lldb::tid_t m_continue_tid = LLDB_INVALID_THREAD_ID;
Kate Stoneb9c1b512016-09-06 20:57:50 +000091 std::recursive_mutex m_debugged_process_mutex;
Pavel Labath82abefa2017-07-18 09:24:48 +000092 std::unique_ptr<NativeProcessProtocol> m_debugged_process_up;
Pavel Labathc7749c32015-07-21 13:20:25 +000093
Kate Stoneb9c1b512016-09-06 20:57:50 +000094 Communication m_stdio_communication;
95 MainLoop::ReadHandleUP m_stdio_handle_up;
Pavel Labathc7749c32015-07-21 13:20:25 +000096
Pavel Labath96e600f2017-07-07 11:02:19 +000097 lldb::StateType m_inferior_prev_state = lldb::StateType::eStateInvalid;
Pavel Labathb7f0f452017-03-17 11:08:40 +000098 std::unique_ptr<llvm::MemoryBuffer> m_active_auxv_buffer_up;
Kate Stoneb9c1b512016-09-06 20:57:50 +000099 std::mutex m_saved_registers_mutex;
100 std::unordered_map<uint32_t, lldb::DataBufferSP> m_saved_registers_map;
Pavel Labath96e600f2017-07-07 11:02:19 +0000101 uint32_t m_next_saved_registers_id = 1;
102 bool m_handshake_completed = false;
Tamas Berghammere13c2732015-02-11 10:29:30 +0000103
Kate Stoneb9c1b512016-09-06 20:57:50 +0000104 PacketResult SendONotification(const char *buffer, uint32_t len);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000105
Kate Stoneb9c1b512016-09-06 20:57:50 +0000106 PacketResult SendWResponse(NativeProcessProtocol *process);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000107
Kate Stoneb9c1b512016-09-06 20:57:50 +0000108 PacketResult SendStopReplyPacketForThread(lldb::tid_t tid);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000109
Kate Stoneb9c1b512016-09-06 20:57:50 +0000110 PacketResult SendStopReasonForState(lldb::StateType process_state);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000111
Kate Stoneb9c1b512016-09-06 20:57:50 +0000112 PacketResult Handle_k(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000113
Kate Stoneb9c1b512016-09-06 20:57:50 +0000114 PacketResult Handle_qProcessInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000115
Kate Stoneb9c1b512016-09-06 20:57:50 +0000116 PacketResult Handle_qC(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000117
Kate Stoneb9c1b512016-09-06 20:57:50 +0000118 PacketResult Handle_QSetDisableASLR(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000119
Kate Stoneb9c1b512016-09-06 20:57:50 +0000120 PacketResult Handle_QSetWorkingDir(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000121
Kate Stoneb9c1b512016-09-06 20:57:50 +0000122 PacketResult Handle_qGetWorkingDir(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000123
Kate Stoneb9c1b512016-09-06 20:57:50 +0000124 PacketResult Handle_C(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000125
Kate Stoneb9c1b512016-09-06 20:57:50 +0000126 PacketResult Handle_c(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000127
Kate Stoneb9c1b512016-09-06 20:57:50 +0000128 PacketResult Handle_vCont(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000129
Kate Stoneb9c1b512016-09-06 20:57:50 +0000130 PacketResult Handle_vCont_actions(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000131
Kate Stoneb9c1b512016-09-06 20:57:50 +0000132 PacketResult Handle_stop_reason(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000133
Kate Stoneb9c1b512016-09-06 20:57:50 +0000134 PacketResult Handle_qRegisterInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000135
Kate Stoneb9c1b512016-09-06 20:57:50 +0000136 PacketResult Handle_qfThreadInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000137
Kate Stoneb9c1b512016-09-06 20:57:50 +0000138 PacketResult Handle_qsThreadInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000139
Kate Stoneb9c1b512016-09-06 20:57:50 +0000140 PacketResult Handle_p(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000141
Kate Stoneb9c1b512016-09-06 20:57:50 +0000142 PacketResult Handle_P(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000143
Kate Stoneb9c1b512016-09-06 20:57:50 +0000144 PacketResult Handle_H(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000145
Kate Stoneb9c1b512016-09-06 20:57:50 +0000146 PacketResult Handle_I(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000147
Kate Stoneb9c1b512016-09-06 20:57:50 +0000148 PacketResult Handle_interrupt(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000149
Kate Stoneb9c1b512016-09-06 20:57:50 +0000150 // Handles $m and $x packets.
151 PacketResult Handle_memory_read(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000152
Kate Stoneb9c1b512016-09-06 20:57:50 +0000153 PacketResult Handle_M(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000154
Kate Stoneb9c1b512016-09-06 20:57:50 +0000155 PacketResult
156 Handle_qMemoryRegionInfoSupported(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000157
Kate Stoneb9c1b512016-09-06 20:57:50 +0000158 PacketResult Handle_qMemoryRegionInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000159
Kate Stoneb9c1b512016-09-06 20:57:50 +0000160 PacketResult Handle_Z(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000161
Kate Stoneb9c1b512016-09-06 20:57:50 +0000162 PacketResult Handle_z(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000163
Kate Stoneb9c1b512016-09-06 20:57:50 +0000164 PacketResult Handle_s(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000165
Kate Stoneb9c1b512016-09-06 20:57:50 +0000166 PacketResult Handle_qXfer_auxv_read(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000167
Kate Stoneb9c1b512016-09-06 20:57:50 +0000168 PacketResult Handle_QSaveRegisterState(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000169
Ravitheja Addepallye714c4f2017-05-26 11:46:27 +0000170 PacketResult Handle_jTraceStart(StringExtractorGDBRemote &packet);
171
172 PacketResult Handle_jTraceRead(StringExtractorGDBRemote &packet);
173
174 PacketResult Handle_jTraceStop(StringExtractorGDBRemote &packet);
175
176 PacketResult Handle_jTraceConfigRead(StringExtractorGDBRemote &packet);
177
Kate Stoneb9c1b512016-09-06 20:57:50 +0000178 PacketResult Handle_QRestoreRegisterState(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000179
Kate Stoneb9c1b512016-09-06 20:57:50 +0000180 PacketResult Handle_vAttach(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000181
Kate Stoneb9c1b512016-09-06 20:57:50 +0000182 PacketResult Handle_D(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000183
Kate Stoneb9c1b512016-09-06 20:57:50 +0000184 PacketResult Handle_qThreadStopInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000185
Kate Stoneb9c1b512016-09-06 20:57:50 +0000186 PacketResult Handle_jThreadsInfo(StringExtractorGDBRemote &packet);
Pavel Labath4a4bb122015-07-16 14:14:35 +0000187
Kate Stoneb9c1b512016-09-06 20:57:50 +0000188 PacketResult Handle_qWatchpointSupportInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000189
Kate Stoneb9c1b512016-09-06 20:57:50 +0000190 PacketResult Handle_qFileLoadAddress(StringExtractorGDBRemote &packet);
Tamas Berghammer783bfc82015-06-18 20:43:56 +0000191
Pavel Labath4a705e72017-02-24 09:29:14 +0000192 PacketResult Handle_QPassSignals(StringExtractorGDBRemote &packet);
193
Kate Stoneb9c1b512016-09-06 20:57:50 +0000194 void SetCurrentThreadID(lldb::tid_t tid);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000195
Kate Stoneb9c1b512016-09-06 20:57:50 +0000196 lldb::tid_t GetCurrentThreadID() const;
Tamas Berghammere13c2732015-02-11 10:29:30 +0000197
Kate Stoneb9c1b512016-09-06 20:57:50 +0000198 void SetContinueThreadID(lldb::tid_t tid);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000199
Kate Stoneb9c1b512016-09-06 20:57:50 +0000200 lldb::tid_t GetContinueThreadID() const { return m_continue_tid; }
Tamas Berghammere13c2732015-02-11 10:29:30 +0000201
Zachary Turner97206d52017-05-12 04:51:55 +0000202 Status SetSTDIOFileDescriptor(int fd);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000203
Kate Stoneb9c1b512016-09-06 20:57:50 +0000204 FileSpec FindModuleFile(const std::string &module_path,
205 const ArchSpec &arch) override;
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +0000206
Tamas Berghammere13c2732015-02-11 10:29:30 +0000207private:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000208 void HandleInferiorState_Exited(NativeProcessProtocol *process);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000209
Kate Stoneb9c1b512016-09-06 20:57:50 +0000210 void HandleInferiorState_Stopped(NativeProcessProtocol *process);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000211
Pavel Labatha5be48b2017-10-17 15:52:16 +0000212 NativeThreadProtocol *GetThreadFromSuffix(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000213
Kate Stoneb9c1b512016-09-06 20:57:50 +0000214 uint32_t GetNextSavedRegistersID();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000215
Kate Stoneb9c1b512016-09-06 20:57:50 +0000216 void MaybeCloseInferiorTerminalConnection();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000217
Kate Stoneb9c1b512016-09-06 20:57:50 +0000218 void ClearProcessSpecificData();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000219
Kate Stoneb9c1b512016-09-06 20:57:50 +0000220 void RegisterPacketHandlers();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000221
Kate Stoneb9c1b512016-09-06 20:57:50 +0000222 void DataAvailableCallback();
Pavel Labath77dc9562015-07-13 10:44:55 +0000223
Kate Stoneb9c1b512016-09-06 20:57:50 +0000224 void SendProcessOutput();
Pavel Labathc7749c32015-07-21 13:20:25 +0000225
Kate Stoneb9c1b512016-09-06 20:57:50 +0000226 void StartSTDIOForwarding();
Pavel Labathabadc222015-11-27 13:33:29 +0000227
Kate Stoneb9c1b512016-09-06 20:57:50 +0000228 void StopSTDIOForwarding();
Pavel Labathc7749c32015-07-21 13:20:25 +0000229
Kate Stoneb9c1b512016-09-06 20:57:50 +0000230 //------------------------------------------------------------------
231 // For GDBRemoteCommunicationServerLLGS only
232 //------------------------------------------------------------------
233 DISALLOW_COPY_AND_ASSIGN(GDBRemoteCommunicationServerLLGS);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000234};
235
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000236} // namespace process_gdb_remote
237} // namespace lldb_private
238
Kate Stoneb9c1b512016-09-06 20:57:50 +0000239#endif // liblldb_GDBRemoteCommunicationServerLLGS_h_