blob: 786910ed93fb34dec6effbb705bb2ed2a32756f0 [file] [log] [blame]
Tamas Berghammere13c2732015-02-11 10:29:30 +00001//===-- GDBRemoteCommunicationServerLLGS.h ----------------------*- C++ -*-===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Tamas Berghammere13c2732015-02-11 10:29:30 +00006//
7//===----------------------------------------------------------------------===//
8
9#ifndef liblldb_GDBRemoteCommunicationServerLLGS_h_
10#define liblldb_GDBRemoteCommunicationServerLLGS_h_
11
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +000012#include <mutex>
Tamas Berghammere13c2732015-02-11 10:29:30 +000013#include <unordered_map>
14
Tamas Berghammere13c2732015-02-11 10:29:30 +000015#include "lldb/Core/Communication.h"
Pavel Labath77dc9562015-07-13 10:44:55 +000016#include "lldb/Host/MainLoop.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000017#include "lldb/Host/common/NativeProcessProtocol.h"
18#include "lldb/lldb-private-forward.h"
Tamas Berghammere13c2732015-02-11 10:29:30 +000019
Tamas Berghammere13c2732015-02-11 10:29:30 +000020#include "GDBRemoteCommunicationServerCommon.h"
21
Tamas Berghammere13c2732015-02-11 10:29:30 +000022class StringExtractorGDBRemote;
23
Tamas Berghammerdb264a62015-03-31 09:52:22 +000024namespace lldb_private {
Pavel Labath77dc9562015-07-13 10:44:55 +000025
Tamas Berghammerdb264a62015-03-31 09:52:22 +000026namespace process_gdb_remote {
27
28class ProcessGDBRemote;
29
Kate Stoneb9c1b512016-09-06 20:57:50 +000030class GDBRemoteCommunicationServerLLGS
31 : public GDBRemoteCommunicationServerCommon,
32 public NativeProcessProtocol::NativeDelegate {
Tamas Berghammere13c2732015-02-11 10:29:30 +000033public:
Kate Stoneb9c1b512016-09-06 20:57:50 +000034 //------------------------------------------------------------------
35 // Constructors and Destructors
36 //------------------------------------------------------------------
Pavel Labath96e600f2017-07-07 11:02:19 +000037 GDBRemoteCommunicationServerLLGS(
38 MainLoop &mainloop,
39 const NativeProcessProtocol::Factory &process_factory);
Tamas Berghammere13c2732015-02-11 10:29:30 +000040
Pavel Labath11e59172017-12-18 14:31:39 +000041 void SetLaunchInfo(const ProcessLaunchInfo &info);
Tamas Berghammere13c2732015-02-11 10:29:30 +000042
Kate Stoneb9c1b512016-09-06 20:57:50 +000043 //------------------------------------------------------------------
44 /// Launch a process with the current launch settings.
45 ///
46 /// This method supports running an lldb-gdbserver or similar
47 /// server in a situation where the startup code has been provided
48 /// with all the information for a child process to be launched.
49 ///
Adrian Prantlf05b42e2019-03-11 17:09:29 +000050 /// \return
Zachary Turner97206d52017-05-12 04:51:55 +000051 /// An Status object indicating the success or failure of the
Kate Stoneb9c1b512016-09-06 20:57:50 +000052 /// launch.
53 //------------------------------------------------------------------
Zachary Turner97206d52017-05-12 04:51:55 +000054 Status LaunchProcess() override;
Tamas Berghammere13c2732015-02-11 10:29:30 +000055
Kate Stoneb9c1b512016-09-06 20:57:50 +000056 //------------------------------------------------------------------
57 /// Attach to a process.
58 ///
59 /// This method supports attaching llgs to a process accessible via the
60 /// configured Platform.
61 ///
Adrian Prantlf05b42e2019-03-11 17:09:29 +000062 /// \return
Zachary Turner97206d52017-05-12 04:51:55 +000063 /// An Status object indicating the success or failure of the
Kate Stoneb9c1b512016-09-06 20:57:50 +000064 /// attach operation.
65 //------------------------------------------------------------------
Zachary Turner97206d52017-05-12 04:51:55 +000066 Status AttachToProcess(lldb::pid_t pid);
Tamas Berghammere13c2732015-02-11 10:29:30 +000067
Kate Stoneb9c1b512016-09-06 20:57:50 +000068 //------------------------------------------------------------------
69 // NativeProcessProtocol::NativeDelegate overrides
70 //------------------------------------------------------------------
71 void InitializeDelegate(NativeProcessProtocol *process) override;
Tamas Berghammere13c2732015-02-11 10:29:30 +000072
Kate Stoneb9c1b512016-09-06 20:57:50 +000073 void ProcessStateChanged(NativeProcessProtocol *process,
74 lldb::StateType state) override;
Tamas Berghammere13c2732015-02-11 10:29:30 +000075
Kate Stoneb9c1b512016-09-06 20:57:50 +000076 void DidExec(NativeProcessProtocol *process) override;
Tamas Berghammere13c2732015-02-11 10:29:30 +000077
Zachary Turner97206d52017-05-12 04:51:55 +000078 Status InitializeConnection(std::unique_ptr<Connection> &&connection);
Pavel Labath77dc9562015-07-13 10:44:55 +000079
Tamas Berghammere13c2732015-02-11 10:29:30 +000080protected:
Kate Stoneb9c1b512016-09-06 20:57:50 +000081 MainLoop &m_mainloop;
82 MainLoop::ReadHandleUP m_network_handle_up;
Pavel Labath96e600f2017-07-07 11:02:19 +000083 const NativeProcessProtocol::Factory &m_process_factory;
84 lldb::tid_t m_current_tid = LLDB_INVALID_THREAD_ID;
85 lldb::tid_t m_continue_tid = LLDB_INVALID_THREAD_ID;
Kate Stoneb9c1b512016-09-06 20:57:50 +000086 std::recursive_mutex m_debugged_process_mutex;
Pavel Labath82abefa2017-07-18 09:24:48 +000087 std::unique_ptr<NativeProcessProtocol> m_debugged_process_up;
Pavel Labathc7749c32015-07-21 13:20:25 +000088
Kate Stoneb9c1b512016-09-06 20:57:50 +000089 Communication m_stdio_communication;
90 MainLoop::ReadHandleUP m_stdio_handle_up;
Pavel Labathc7749c32015-07-21 13:20:25 +000091
Pavel Labath96e600f2017-07-07 11:02:19 +000092 lldb::StateType m_inferior_prev_state = lldb::StateType::eStateInvalid;
Pavel Labathb7f0f452017-03-17 11:08:40 +000093 std::unique_ptr<llvm::MemoryBuffer> m_active_auxv_buffer_up;
Kate Stoneb9c1b512016-09-06 20:57:50 +000094 std::mutex m_saved_registers_mutex;
95 std::unordered_map<uint32_t, lldb::DataBufferSP> m_saved_registers_map;
Pavel Labath96e600f2017-07-07 11:02:19 +000096 uint32_t m_next_saved_registers_id = 1;
97 bool m_handshake_completed = false;
Tamas Berghammere13c2732015-02-11 10:29:30 +000098
Kate Stoneb9c1b512016-09-06 20:57:50 +000099 PacketResult SendONotification(const char *buffer, uint32_t len);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000100
Kate Stoneb9c1b512016-09-06 20:57:50 +0000101 PacketResult SendWResponse(NativeProcessProtocol *process);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000102
Kate Stoneb9c1b512016-09-06 20:57:50 +0000103 PacketResult SendStopReplyPacketForThread(lldb::tid_t tid);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000104
Kate Stoneb9c1b512016-09-06 20:57:50 +0000105 PacketResult SendStopReasonForState(lldb::StateType process_state);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000106
Kate Stoneb9c1b512016-09-06 20:57:50 +0000107 PacketResult Handle_k(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000108
Kate Stoneb9c1b512016-09-06 20:57:50 +0000109 PacketResult Handle_qProcessInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000110
Kate Stoneb9c1b512016-09-06 20:57:50 +0000111 PacketResult Handle_qC(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000112
Kate Stoneb9c1b512016-09-06 20:57:50 +0000113 PacketResult Handle_QSetDisableASLR(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000114
Kate Stoneb9c1b512016-09-06 20:57:50 +0000115 PacketResult Handle_QSetWorkingDir(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000116
Kate Stoneb9c1b512016-09-06 20:57:50 +0000117 PacketResult Handle_qGetWorkingDir(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000118
Kate Stoneb9c1b512016-09-06 20:57:50 +0000119 PacketResult Handle_C(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000120
Kate Stoneb9c1b512016-09-06 20:57:50 +0000121 PacketResult Handle_c(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000122
Kate Stoneb9c1b512016-09-06 20:57:50 +0000123 PacketResult Handle_vCont(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000124
Kate Stoneb9c1b512016-09-06 20:57:50 +0000125 PacketResult Handle_vCont_actions(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000126
Kate Stoneb9c1b512016-09-06 20:57:50 +0000127 PacketResult Handle_stop_reason(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000128
Kate Stoneb9c1b512016-09-06 20:57:50 +0000129 PacketResult Handle_qRegisterInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000130
Kate Stoneb9c1b512016-09-06 20:57:50 +0000131 PacketResult Handle_qfThreadInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000132
Kate Stoneb9c1b512016-09-06 20:57:50 +0000133 PacketResult Handle_qsThreadInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000134
Kate Stoneb9c1b512016-09-06 20:57:50 +0000135 PacketResult Handle_p(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000136
Kate Stoneb9c1b512016-09-06 20:57:50 +0000137 PacketResult Handle_P(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000138
Kate Stoneb9c1b512016-09-06 20:57:50 +0000139 PacketResult Handle_H(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000140
Kate Stoneb9c1b512016-09-06 20:57:50 +0000141 PacketResult Handle_I(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000142
Kate Stoneb9c1b512016-09-06 20:57:50 +0000143 PacketResult Handle_interrupt(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000144
Kate Stoneb9c1b512016-09-06 20:57:50 +0000145 // Handles $m and $x packets.
146 PacketResult Handle_memory_read(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000147
Kate Stoneb9c1b512016-09-06 20:57:50 +0000148 PacketResult Handle_M(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000149
Kate Stoneb9c1b512016-09-06 20:57:50 +0000150 PacketResult
151 Handle_qMemoryRegionInfoSupported(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000152
Kate Stoneb9c1b512016-09-06 20:57:50 +0000153 PacketResult Handle_qMemoryRegionInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000154
Kate Stoneb9c1b512016-09-06 20:57:50 +0000155 PacketResult Handle_Z(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000156
Kate Stoneb9c1b512016-09-06 20:57:50 +0000157 PacketResult Handle_z(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000158
Kate Stoneb9c1b512016-09-06 20:57:50 +0000159 PacketResult Handle_s(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000160
Kate Stoneb9c1b512016-09-06 20:57:50 +0000161 PacketResult Handle_qXfer_auxv_read(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000162
Kate Stoneb9c1b512016-09-06 20:57:50 +0000163 PacketResult Handle_QSaveRegisterState(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000164
Ravitheja Addepallye714c4f2017-05-26 11:46:27 +0000165 PacketResult Handle_jTraceStart(StringExtractorGDBRemote &packet);
166
167 PacketResult Handle_jTraceRead(StringExtractorGDBRemote &packet);
168
169 PacketResult Handle_jTraceStop(StringExtractorGDBRemote &packet);
170
171 PacketResult Handle_jTraceConfigRead(StringExtractorGDBRemote &packet);
172
Kate Stoneb9c1b512016-09-06 20:57:50 +0000173 PacketResult Handle_QRestoreRegisterState(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000174
Kate Stoneb9c1b512016-09-06 20:57:50 +0000175 PacketResult Handle_vAttach(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000176
Kate Stoneb9c1b512016-09-06 20:57:50 +0000177 PacketResult Handle_D(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000178
Kate Stoneb9c1b512016-09-06 20:57:50 +0000179 PacketResult Handle_qThreadStopInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000180
Kate Stoneb9c1b512016-09-06 20:57:50 +0000181 PacketResult Handle_jThreadsInfo(StringExtractorGDBRemote &packet);
Pavel Labath4a4bb122015-07-16 14:14:35 +0000182
Kate Stoneb9c1b512016-09-06 20:57:50 +0000183 PacketResult Handle_qWatchpointSupportInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000184
Kate Stoneb9c1b512016-09-06 20:57:50 +0000185 PacketResult Handle_qFileLoadAddress(StringExtractorGDBRemote &packet);
Tamas Berghammer783bfc82015-06-18 20:43:56 +0000186
Pavel Labath4a705e72017-02-24 09:29:14 +0000187 PacketResult Handle_QPassSignals(StringExtractorGDBRemote &packet);
188
Kate Stoneb9c1b512016-09-06 20:57:50 +0000189 void SetCurrentThreadID(lldb::tid_t tid);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000190
Kate Stoneb9c1b512016-09-06 20:57:50 +0000191 lldb::tid_t GetCurrentThreadID() const;
Tamas Berghammere13c2732015-02-11 10:29:30 +0000192
Kate Stoneb9c1b512016-09-06 20:57:50 +0000193 void SetContinueThreadID(lldb::tid_t tid);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000194
Kate Stoneb9c1b512016-09-06 20:57:50 +0000195 lldb::tid_t GetContinueThreadID() const { return m_continue_tid; }
Tamas Berghammere13c2732015-02-11 10:29:30 +0000196
Zachary Turner97206d52017-05-12 04:51:55 +0000197 Status SetSTDIOFileDescriptor(int fd);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000198
Kate Stoneb9c1b512016-09-06 20:57:50 +0000199 FileSpec FindModuleFile(const std::string &module_path,
200 const ArchSpec &arch) override;
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +0000201
Tamas Berghammere13c2732015-02-11 10:29:30 +0000202private:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000203 void HandleInferiorState_Exited(NativeProcessProtocol *process);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000204
Kate Stoneb9c1b512016-09-06 20:57:50 +0000205 void HandleInferiorState_Stopped(NativeProcessProtocol *process);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000206
Pavel Labatha5be48b2017-10-17 15:52:16 +0000207 NativeThreadProtocol *GetThreadFromSuffix(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000208
Kate Stoneb9c1b512016-09-06 20:57:50 +0000209 uint32_t GetNextSavedRegistersID();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000210
Kate Stoneb9c1b512016-09-06 20:57:50 +0000211 void MaybeCloseInferiorTerminalConnection();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000212
Kate Stoneb9c1b512016-09-06 20:57:50 +0000213 void ClearProcessSpecificData();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000214
Kate Stoneb9c1b512016-09-06 20:57:50 +0000215 void RegisterPacketHandlers();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000216
Kate Stoneb9c1b512016-09-06 20:57:50 +0000217 void DataAvailableCallback();
Pavel Labath77dc9562015-07-13 10:44:55 +0000218
Kate Stoneb9c1b512016-09-06 20:57:50 +0000219 void SendProcessOutput();
Pavel Labathc7749c32015-07-21 13:20:25 +0000220
Kate Stoneb9c1b512016-09-06 20:57:50 +0000221 void StartSTDIOForwarding();
Pavel Labathabadc222015-11-27 13:33:29 +0000222
Kate Stoneb9c1b512016-09-06 20:57:50 +0000223 void StopSTDIOForwarding();
Pavel Labathc7749c32015-07-21 13:20:25 +0000224
Kate Stoneb9c1b512016-09-06 20:57:50 +0000225 //------------------------------------------------------------------
226 // For GDBRemoteCommunicationServerLLGS only
227 //------------------------------------------------------------------
228 DISALLOW_COPY_AND_ASSIGN(GDBRemoteCommunicationServerLLGS);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000229};
230
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000231} // namespace process_gdb_remote
232} // namespace lldb_private
233
Kate Stoneb9c1b512016-09-06 20:57:50 +0000234#endif // liblldb_GDBRemoteCommunicationServerLLGS_h_