blob: 088ba92ad11acbab22f2cc31dad47e5124afca89 [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 // Constructors and Destructors
Pavel Labath96e600f2017-07-07 11:02:19 +000035 GDBRemoteCommunicationServerLLGS(
36 MainLoop &mainloop,
37 const NativeProcessProtocol::Factory &process_factory);
Tamas Berghammere13c2732015-02-11 10:29:30 +000038
Pavel Labath11e59172017-12-18 14:31:39 +000039 void SetLaunchInfo(const ProcessLaunchInfo &info);
Tamas Berghammere13c2732015-02-11 10:29:30 +000040
Kate Stoneb9c1b512016-09-06 20:57:50 +000041 /// Launch a process with the current launch settings.
42 ///
43 /// This method supports running an lldb-gdbserver or similar
44 /// server in a situation where the startup code has been provided
45 /// with all the information for a child process to be launched.
46 ///
Adrian Prantlf05b42e2019-03-11 17:09:29 +000047 /// \return
Zachary Turner97206d52017-05-12 04:51:55 +000048 /// An Status object indicating the success or failure of the
Kate Stoneb9c1b512016-09-06 20:57:50 +000049 /// launch.
Zachary Turner97206d52017-05-12 04:51:55 +000050 Status LaunchProcess() override;
Tamas Berghammere13c2732015-02-11 10:29:30 +000051
Kate Stoneb9c1b512016-09-06 20:57:50 +000052 /// Attach to a process.
53 ///
54 /// This method supports attaching llgs to a process accessible via the
55 /// configured Platform.
56 ///
Adrian Prantlf05b42e2019-03-11 17:09:29 +000057 /// \return
Zachary Turner97206d52017-05-12 04:51:55 +000058 /// An Status object indicating the success or failure of the
Kate Stoneb9c1b512016-09-06 20:57:50 +000059 /// attach operation.
Zachary Turner97206d52017-05-12 04:51:55 +000060 Status AttachToProcess(lldb::pid_t pid);
Tamas Berghammere13c2732015-02-11 10:29:30 +000061
Kate Stoneb9c1b512016-09-06 20:57:50 +000062 // NativeProcessProtocol::NativeDelegate overrides
Kate Stoneb9c1b512016-09-06 20:57:50 +000063 void InitializeDelegate(NativeProcessProtocol *process) override;
Tamas Berghammere13c2732015-02-11 10:29:30 +000064
Kate Stoneb9c1b512016-09-06 20:57:50 +000065 void ProcessStateChanged(NativeProcessProtocol *process,
66 lldb::StateType state) override;
Tamas Berghammere13c2732015-02-11 10:29:30 +000067
Kate Stoneb9c1b512016-09-06 20:57:50 +000068 void DidExec(NativeProcessProtocol *process) override;
Tamas Berghammere13c2732015-02-11 10:29:30 +000069
Zachary Turner97206d52017-05-12 04:51:55 +000070 Status InitializeConnection(std::unique_ptr<Connection> &&connection);
Pavel Labath77dc9562015-07-13 10:44:55 +000071
Tamas Berghammere13c2732015-02-11 10:29:30 +000072protected:
Kate Stoneb9c1b512016-09-06 20:57:50 +000073 MainLoop &m_mainloop;
74 MainLoop::ReadHandleUP m_network_handle_up;
Pavel Labath96e600f2017-07-07 11:02:19 +000075 const NativeProcessProtocol::Factory &m_process_factory;
76 lldb::tid_t m_current_tid = LLDB_INVALID_THREAD_ID;
77 lldb::tid_t m_continue_tid = LLDB_INVALID_THREAD_ID;
Kate Stoneb9c1b512016-09-06 20:57:50 +000078 std::recursive_mutex m_debugged_process_mutex;
Pavel Labath82abefa2017-07-18 09:24:48 +000079 std::unique_ptr<NativeProcessProtocol> m_debugged_process_up;
Pavel Labathc7749c32015-07-21 13:20:25 +000080
Kate Stoneb9c1b512016-09-06 20:57:50 +000081 Communication m_stdio_communication;
82 MainLoop::ReadHandleUP m_stdio_handle_up;
Pavel Labathc7749c32015-07-21 13:20:25 +000083
Pavel Labath96e600f2017-07-07 11:02:19 +000084 lldb::StateType m_inferior_prev_state = lldb::StateType::eStateInvalid;
Antonio Afonso57e2da42019-06-10 20:59:58 +000085 llvm::StringMap<std::unique_ptr<llvm::MemoryBuffer>> m_xfer_buffer_map;
Kate Stoneb9c1b512016-09-06 20:57:50 +000086 std::mutex m_saved_registers_mutex;
87 std::unordered_map<uint32_t, lldb::DataBufferSP> m_saved_registers_map;
Pavel Labath96e600f2017-07-07 11:02:19 +000088 uint32_t m_next_saved_registers_id = 1;
89 bool m_handshake_completed = false;
Tamas Berghammere13c2732015-02-11 10:29:30 +000090
Kate Stoneb9c1b512016-09-06 20:57:50 +000091 PacketResult SendONotification(const char *buffer, uint32_t len);
Tamas Berghammere13c2732015-02-11 10:29:30 +000092
Kate Stoneb9c1b512016-09-06 20:57:50 +000093 PacketResult SendWResponse(NativeProcessProtocol *process);
Tamas Berghammere13c2732015-02-11 10:29:30 +000094
Kate Stoneb9c1b512016-09-06 20:57:50 +000095 PacketResult SendStopReplyPacketForThread(lldb::tid_t tid);
Tamas Berghammere13c2732015-02-11 10:29:30 +000096
Kate Stoneb9c1b512016-09-06 20:57:50 +000097 PacketResult SendStopReasonForState(lldb::StateType process_state);
Tamas Berghammere13c2732015-02-11 10:29:30 +000098
Kate Stoneb9c1b512016-09-06 20:57:50 +000099 PacketResult Handle_k(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000100
Kate Stoneb9c1b512016-09-06 20:57:50 +0000101 PacketResult Handle_qProcessInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000102
Kate Stoneb9c1b512016-09-06 20:57:50 +0000103 PacketResult Handle_qC(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000104
Kate Stoneb9c1b512016-09-06 20:57:50 +0000105 PacketResult Handle_QSetDisableASLR(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000106
Kate Stoneb9c1b512016-09-06 20:57:50 +0000107 PacketResult Handle_QSetWorkingDir(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000108
Kate Stoneb9c1b512016-09-06 20:57:50 +0000109 PacketResult Handle_qGetWorkingDir(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000110
Kate Stoneb9c1b512016-09-06 20:57:50 +0000111 PacketResult Handle_C(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000112
Kate Stoneb9c1b512016-09-06 20:57:50 +0000113 PacketResult Handle_c(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000114
Kate Stoneb9c1b512016-09-06 20:57:50 +0000115 PacketResult Handle_vCont(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000116
Kate Stoneb9c1b512016-09-06 20:57:50 +0000117 PacketResult Handle_vCont_actions(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000118
Kate Stoneb9c1b512016-09-06 20:57:50 +0000119 PacketResult Handle_stop_reason(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000120
Kate Stoneb9c1b512016-09-06 20:57:50 +0000121 PacketResult Handle_qRegisterInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000122
Kate Stoneb9c1b512016-09-06 20:57:50 +0000123 PacketResult Handle_qfThreadInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000124
Kate Stoneb9c1b512016-09-06 20:57:50 +0000125 PacketResult Handle_qsThreadInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000126
Kate Stoneb9c1b512016-09-06 20:57:50 +0000127 PacketResult Handle_p(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000128
Kate Stoneb9c1b512016-09-06 20:57:50 +0000129 PacketResult Handle_P(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000130
Kate Stoneb9c1b512016-09-06 20:57:50 +0000131 PacketResult Handle_H(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000132
Kate Stoneb9c1b512016-09-06 20:57:50 +0000133 PacketResult Handle_I(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000134
Kate Stoneb9c1b512016-09-06 20:57:50 +0000135 PacketResult Handle_interrupt(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000136
Kate Stoneb9c1b512016-09-06 20:57:50 +0000137 // Handles $m and $x packets.
138 PacketResult Handle_memory_read(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000139
Kate Stoneb9c1b512016-09-06 20:57:50 +0000140 PacketResult Handle_M(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000141
Kate Stoneb9c1b512016-09-06 20:57:50 +0000142 PacketResult
143 Handle_qMemoryRegionInfoSupported(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000144
Kate Stoneb9c1b512016-09-06 20:57:50 +0000145 PacketResult Handle_qMemoryRegionInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000146
Kate Stoneb9c1b512016-09-06 20:57:50 +0000147 PacketResult Handle_Z(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000148
Kate Stoneb9c1b512016-09-06 20:57:50 +0000149 PacketResult Handle_z(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000150
Kate Stoneb9c1b512016-09-06 20:57:50 +0000151 PacketResult Handle_s(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000152
Antonio Afonso57e2da42019-06-10 20:59:58 +0000153 PacketResult Handle_qXfer(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000154
Kate Stoneb9c1b512016-09-06 20:57:50 +0000155 PacketResult Handle_QSaveRegisterState(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000156
Ravitheja Addepallye714c4f2017-05-26 11:46:27 +0000157 PacketResult Handle_jTraceStart(StringExtractorGDBRemote &packet);
158
159 PacketResult Handle_jTraceRead(StringExtractorGDBRemote &packet);
160
161 PacketResult Handle_jTraceStop(StringExtractorGDBRemote &packet);
162
163 PacketResult Handle_jTraceConfigRead(StringExtractorGDBRemote &packet);
164
Kate Stoneb9c1b512016-09-06 20:57:50 +0000165 PacketResult Handle_QRestoreRegisterState(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000166
Kate Stoneb9c1b512016-09-06 20:57:50 +0000167 PacketResult Handle_vAttach(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000168
Kate Stoneb9c1b512016-09-06 20:57:50 +0000169 PacketResult Handle_D(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000170
Kate Stoneb9c1b512016-09-06 20:57:50 +0000171 PacketResult Handle_qThreadStopInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000172
Kate Stoneb9c1b512016-09-06 20:57:50 +0000173 PacketResult Handle_jThreadsInfo(StringExtractorGDBRemote &packet);
Pavel Labath4a4bb122015-07-16 14:14:35 +0000174
Kate Stoneb9c1b512016-09-06 20:57:50 +0000175 PacketResult Handle_qWatchpointSupportInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000176
Kate Stoneb9c1b512016-09-06 20:57:50 +0000177 PacketResult Handle_qFileLoadAddress(StringExtractorGDBRemote &packet);
Tamas Berghammer783bfc82015-06-18 20:43:56 +0000178
Pavel Labath4a705e72017-02-24 09:29:14 +0000179 PacketResult Handle_QPassSignals(StringExtractorGDBRemote &packet);
180
Pavel Labathf04b3632019-05-30 07:25:22 +0000181 PacketResult Handle_g(StringExtractorGDBRemote &packet);
182
Kate Stoneb9c1b512016-09-06 20:57:50 +0000183 void SetCurrentThreadID(lldb::tid_t tid);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000184
Kate Stoneb9c1b512016-09-06 20:57:50 +0000185 lldb::tid_t GetCurrentThreadID() const;
Tamas Berghammere13c2732015-02-11 10:29:30 +0000186
Kate Stoneb9c1b512016-09-06 20:57:50 +0000187 void SetContinueThreadID(lldb::tid_t tid);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000188
Kate Stoneb9c1b512016-09-06 20:57:50 +0000189 lldb::tid_t GetContinueThreadID() const { return m_continue_tid; }
Tamas Berghammere13c2732015-02-11 10:29:30 +0000190
Zachary Turner97206d52017-05-12 04:51:55 +0000191 Status SetSTDIOFileDescriptor(int fd);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000192
Kate Stoneb9c1b512016-09-06 20:57:50 +0000193 FileSpec FindModuleFile(const std::string &module_path,
194 const ArchSpec &arch) override;
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +0000195
Antonio Afonso57e2da42019-06-10 20:59:58 +0000196 llvm::Expected<std::unique_ptr<llvm::MemoryBuffer>>
197 ReadXferObject(llvm::StringRef object, llvm::StringRef annex);
198
Antonio Afonso05e32ba2019-07-23 20:40:30 +0000199 static std::string XMLEncodeAttributeValue(llvm::StringRef value);
200
Tamas Berghammere13c2732015-02-11 10:29:30 +0000201private:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000202 void HandleInferiorState_Exited(NativeProcessProtocol *process);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000203
Kate Stoneb9c1b512016-09-06 20:57:50 +0000204 void HandleInferiorState_Stopped(NativeProcessProtocol *process);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000205
Pavel Labatha5be48b2017-10-17 15:52:16 +0000206 NativeThreadProtocol *GetThreadFromSuffix(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000207
Kate Stoneb9c1b512016-09-06 20:57:50 +0000208 uint32_t GetNextSavedRegistersID();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000209
Kate Stoneb9c1b512016-09-06 20:57:50 +0000210 void MaybeCloseInferiorTerminalConnection();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000211
Kate Stoneb9c1b512016-09-06 20:57:50 +0000212 void ClearProcessSpecificData();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000213
Kate Stoneb9c1b512016-09-06 20:57:50 +0000214 void RegisterPacketHandlers();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000215
Kate Stoneb9c1b512016-09-06 20:57:50 +0000216 void DataAvailableCallback();
Pavel Labath77dc9562015-07-13 10:44:55 +0000217
Kate Stoneb9c1b512016-09-06 20:57:50 +0000218 void SendProcessOutput();
Pavel Labathc7749c32015-07-21 13:20:25 +0000219
Kate Stoneb9c1b512016-09-06 20:57:50 +0000220 void StartSTDIOForwarding();
Pavel Labathabadc222015-11-27 13:33:29 +0000221
Kate Stoneb9c1b512016-09-06 20:57:50 +0000222 void StopSTDIOForwarding();
Pavel Labathc7749c32015-07-21 13:20:25 +0000223
Kate Stoneb9c1b512016-09-06 20:57:50 +0000224 // For GDBRemoteCommunicationServerLLGS only
Kate Stoneb9c1b512016-09-06 20:57:50 +0000225 DISALLOW_COPY_AND_ASSIGN(GDBRemoteCommunicationServerLLGS);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000226};
227
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000228} // namespace process_gdb_remote
229} // namespace lldb_private
230
Kate Stoneb9c1b512016-09-06 20:57:50 +0000231#endif // liblldb_GDBRemoteCommunicationServerLLGS_h_