blob: 7deee4b953cdfa2f43f328491cec200610a98e20 [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
Kate Stoneb9c1b512016-09-06 20:57:50 +000046 //------------------------------------------------------------------
47 /// Specify the program to launch and its arguments.
48 ///
49 /// @param[in] args
50 /// The command line to launch.
51 ///
52 /// @param[in] argc
53 /// The number of elements in the args array of cstring pointers.
54 ///
55 /// @return
Zachary Turner97206d52017-05-12 04:51:55 +000056 /// An Status object indicating the success or failure of making
Kate Stoneb9c1b512016-09-06 20:57:50 +000057 /// the setting.
58 //------------------------------------------------------------------
Zachary Turner97206d52017-05-12 04:51:55 +000059 Status SetLaunchArguments(const char *const args[], int argc);
Tamas Berghammere13c2732015-02-11 10:29:30 +000060
Kate Stoneb9c1b512016-09-06 20:57:50 +000061 //------------------------------------------------------------------
62 /// Specify the launch flags for the process.
63 ///
64 /// @param[in] launch_flags
65 /// The launch flags to use when launching this process.
66 ///
67 /// @return
Zachary Turner97206d52017-05-12 04:51:55 +000068 /// An Status object indicating the success or failure of making
Kate Stoneb9c1b512016-09-06 20:57:50 +000069 /// the setting.
70 //------------------------------------------------------------------
Zachary Turner97206d52017-05-12 04:51:55 +000071 Status SetLaunchFlags(unsigned int launch_flags);
Tamas Berghammere13c2732015-02-11 10:29:30 +000072
Kate Stoneb9c1b512016-09-06 20:57:50 +000073 //------------------------------------------------------------------
74 /// Launch a process with the current launch settings.
75 ///
76 /// This method supports running an lldb-gdbserver or similar
77 /// server in a situation where the startup code has been provided
78 /// with all the information for a child process to be launched.
79 ///
80 /// @return
Zachary Turner97206d52017-05-12 04:51:55 +000081 /// An Status object indicating the success or failure of the
Kate Stoneb9c1b512016-09-06 20:57:50 +000082 /// launch.
83 //------------------------------------------------------------------
Zachary Turner97206d52017-05-12 04:51:55 +000084 Status LaunchProcess() override;
Tamas Berghammere13c2732015-02-11 10:29:30 +000085
Kate Stoneb9c1b512016-09-06 20:57:50 +000086 //------------------------------------------------------------------
87 /// Attach to a process.
88 ///
89 /// This method supports attaching llgs to a process accessible via the
90 /// configured Platform.
91 ///
92 /// @return
Zachary Turner97206d52017-05-12 04:51:55 +000093 /// An Status object indicating the success or failure of the
Kate Stoneb9c1b512016-09-06 20:57:50 +000094 /// attach operation.
95 //------------------------------------------------------------------
Zachary Turner97206d52017-05-12 04:51:55 +000096 Status AttachToProcess(lldb::pid_t pid);
Tamas Berghammere13c2732015-02-11 10:29:30 +000097
Kate Stoneb9c1b512016-09-06 20:57:50 +000098 //------------------------------------------------------------------
99 // NativeProcessProtocol::NativeDelegate overrides
100 //------------------------------------------------------------------
101 void InitializeDelegate(NativeProcessProtocol *process) override;
Tamas Berghammere13c2732015-02-11 10:29:30 +0000102
Kate Stoneb9c1b512016-09-06 20:57:50 +0000103 void ProcessStateChanged(NativeProcessProtocol *process,
104 lldb::StateType state) override;
Tamas Berghammere13c2732015-02-11 10:29:30 +0000105
Kate Stoneb9c1b512016-09-06 20:57:50 +0000106 void DidExec(NativeProcessProtocol *process) override;
Tamas Berghammere13c2732015-02-11 10:29:30 +0000107
Zachary Turner97206d52017-05-12 04:51:55 +0000108 Status InitializeConnection(std::unique_ptr<Connection> &&connection);
Pavel Labath77dc9562015-07-13 10:44:55 +0000109
Tamas Berghammere13c2732015-02-11 10:29:30 +0000110protected:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000111 MainLoop &m_mainloop;
112 MainLoop::ReadHandleUP m_network_handle_up;
Pavel Labath96e600f2017-07-07 11:02:19 +0000113 const NativeProcessProtocol::Factory &m_process_factory;
114 lldb::tid_t m_current_tid = LLDB_INVALID_THREAD_ID;
115 lldb::tid_t m_continue_tid = LLDB_INVALID_THREAD_ID;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000116 std::recursive_mutex m_debugged_process_mutex;
Pavel Labath82abefa2017-07-18 09:24:48 +0000117 std::unique_ptr<NativeProcessProtocol> m_debugged_process_up;
Pavel Labathc7749c32015-07-21 13:20:25 +0000118
Kate Stoneb9c1b512016-09-06 20:57:50 +0000119 Communication m_stdio_communication;
120 MainLoop::ReadHandleUP m_stdio_handle_up;
Pavel Labathc7749c32015-07-21 13:20:25 +0000121
Pavel Labath96e600f2017-07-07 11:02:19 +0000122 lldb::StateType m_inferior_prev_state = lldb::StateType::eStateInvalid;
Pavel Labathb7f0f452017-03-17 11:08:40 +0000123 std::unique_ptr<llvm::MemoryBuffer> m_active_auxv_buffer_up;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000124 std::mutex m_saved_registers_mutex;
125 std::unordered_map<uint32_t, lldb::DataBufferSP> m_saved_registers_map;
Pavel Labath96e600f2017-07-07 11:02:19 +0000126 uint32_t m_next_saved_registers_id = 1;
127 bool m_handshake_completed = false;
Tamas Berghammere13c2732015-02-11 10:29:30 +0000128
Kate Stoneb9c1b512016-09-06 20:57:50 +0000129 PacketResult SendONotification(const char *buffer, uint32_t len);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000130
Kate Stoneb9c1b512016-09-06 20:57:50 +0000131 PacketResult SendWResponse(NativeProcessProtocol *process);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000132
Kate Stoneb9c1b512016-09-06 20:57:50 +0000133 PacketResult SendStopReplyPacketForThread(lldb::tid_t tid);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000134
Kate Stoneb9c1b512016-09-06 20:57:50 +0000135 PacketResult SendStopReasonForState(lldb::StateType process_state);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000136
Kate Stoneb9c1b512016-09-06 20:57:50 +0000137 PacketResult Handle_k(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000138
Kate Stoneb9c1b512016-09-06 20:57:50 +0000139 PacketResult Handle_qProcessInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000140
Kate Stoneb9c1b512016-09-06 20:57:50 +0000141 PacketResult Handle_qC(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000142
Kate Stoneb9c1b512016-09-06 20:57:50 +0000143 PacketResult Handle_QSetDisableASLR(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000144
Kate Stoneb9c1b512016-09-06 20:57:50 +0000145 PacketResult Handle_QSetWorkingDir(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000146
Kate Stoneb9c1b512016-09-06 20:57:50 +0000147 PacketResult Handle_qGetWorkingDir(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000148
Kate Stoneb9c1b512016-09-06 20:57:50 +0000149 PacketResult Handle_C(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000150
Kate Stoneb9c1b512016-09-06 20:57:50 +0000151 PacketResult Handle_c(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000152
Kate Stoneb9c1b512016-09-06 20:57:50 +0000153 PacketResult Handle_vCont(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000154
Kate Stoneb9c1b512016-09-06 20:57:50 +0000155 PacketResult Handle_vCont_actions(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000156
Kate Stoneb9c1b512016-09-06 20:57:50 +0000157 PacketResult Handle_stop_reason(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000158
Kate Stoneb9c1b512016-09-06 20:57:50 +0000159 PacketResult Handle_qRegisterInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000160
Kate Stoneb9c1b512016-09-06 20:57:50 +0000161 PacketResult Handle_qfThreadInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000162
Kate Stoneb9c1b512016-09-06 20:57:50 +0000163 PacketResult Handle_qsThreadInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000164
Kate Stoneb9c1b512016-09-06 20:57:50 +0000165 PacketResult Handle_p(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000166
Kate Stoneb9c1b512016-09-06 20:57:50 +0000167 PacketResult Handle_P(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000168
Kate Stoneb9c1b512016-09-06 20:57:50 +0000169 PacketResult Handle_H(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000170
Kate Stoneb9c1b512016-09-06 20:57:50 +0000171 PacketResult Handle_I(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000172
Kate Stoneb9c1b512016-09-06 20:57:50 +0000173 PacketResult Handle_interrupt(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000174
Kate Stoneb9c1b512016-09-06 20:57:50 +0000175 // Handles $m and $x packets.
176 PacketResult Handle_memory_read(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000177
Kate Stoneb9c1b512016-09-06 20:57:50 +0000178 PacketResult Handle_M(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000179
Kate Stoneb9c1b512016-09-06 20:57:50 +0000180 PacketResult
181 Handle_qMemoryRegionInfoSupported(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000182
Kate Stoneb9c1b512016-09-06 20:57:50 +0000183 PacketResult Handle_qMemoryRegionInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000184
Kate Stoneb9c1b512016-09-06 20:57:50 +0000185 PacketResult Handle_Z(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000186
Kate Stoneb9c1b512016-09-06 20:57:50 +0000187 PacketResult Handle_z(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000188
Kate Stoneb9c1b512016-09-06 20:57:50 +0000189 PacketResult Handle_s(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000190
Kate Stoneb9c1b512016-09-06 20:57:50 +0000191 PacketResult Handle_qXfer_auxv_read(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000192
Kate Stoneb9c1b512016-09-06 20:57:50 +0000193 PacketResult Handle_QSaveRegisterState(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000194
Ravitheja Addepallye714c4f2017-05-26 11:46:27 +0000195 PacketResult Handle_jTraceStart(StringExtractorGDBRemote &packet);
196
197 PacketResult Handle_jTraceRead(StringExtractorGDBRemote &packet);
198
199 PacketResult Handle_jTraceStop(StringExtractorGDBRemote &packet);
200
201 PacketResult Handle_jTraceConfigRead(StringExtractorGDBRemote &packet);
202
Kate Stoneb9c1b512016-09-06 20:57:50 +0000203 PacketResult Handle_QRestoreRegisterState(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000204
Kate Stoneb9c1b512016-09-06 20:57:50 +0000205 PacketResult Handle_vAttach(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000206
Kate Stoneb9c1b512016-09-06 20:57:50 +0000207 PacketResult Handle_D(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000208
Kate Stoneb9c1b512016-09-06 20:57:50 +0000209 PacketResult Handle_qThreadStopInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000210
Kate Stoneb9c1b512016-09-06 20:57:50 +0000211 PacketResult Handle_jThreadsInfo(StringExtractorGDBRemote &packet);
Pavel Labath4a4bb122015-07-16 14:14:35 +0000212
Kate Stoneb9c1b512016-09-06 20:57:50 +0000213 PacketResult Handle_qWatchpointSupportInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000214
Kate Stoneb9c1b512016-09-06 20:57:50 +0000215 PacketResult Handle_qFileLoadAddress(StringExtractorGDBRemote &packet);
Tamas Berghammer783bfc82015-06-18 20:43:56 +0000216
Pavel Labath4a705e72017-02-24 09:29:14 +0000217 PacketResult Handle_QPassSignals(StringExtractorGDBRemote &packet);
218
Kate Stoneb9c1b512016-09-06 20:57:50 +0000219 void SetCurrentThreadID(lldb::tid_t tid);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000220
Kate Stoneb9c1b512016-09-06 20:57:50 +0000221 lldb::tid_t GetCurrentThreadID() const;
Tamas Berghammere13c2732015-02-11 10:29:30 +0000222
Kate Stoneb9c1b512016-09-06 20:57:50 +0000223 void SetContinueThreadID(lldb::tid_t tid);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000224
Kate Stoneb9c1b512016-09-06 20:57:50 +0000225 lldb::tid_t GetContinueThreadID() const { return m_continue_tid; }
Tamas Berghammere13c2732015-02-11 10:29:30 +0000226
Zachary Turner97206d52017-05-12 04:51:55 +0000227 Status SetSTDIOFileDescriptor(int fd);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000228
Kate Stoneb9c1b512016-09-06 20:57:50 +0000229 FileSpec FindModuleFile(const std::string &module_path,
230 const ArchSpec &arch) override;
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +0000231
Tamas Berghammere13c2732015-02-11 10:29:30 +0000232private:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000233 void HandleInferiorState_Exited(NativeProcessProtocol *process);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000234
Kate Stoneb9c1b512016-09-06 20:57:50 +0000235 void HandleInferiorState_Stopped(NativeProcessProtocol *process);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000236
Pavel Labatha5be48b2017-10-17 15:52:16 +0000237 NativeThreadProtocol *GetThreadFromSuffix(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000238
Kate Stoneb9c1b512016-09-06 20:57:50 +0000239 uint32_t GetNextSavedRegistersID();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000240
Kate Stoneb9c1b512016-09-06 20:57:50 +0000241 void MaybeCloseInferiorTerminalConnection();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000242
Kate Stoneb9c1b512016-09-06 20:57:50 +0000243 void ClearProcessSpecificData();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000244
Kate Stoneb9c1b512016-09-06 20:57:50 +0000245 void RegisterPacketHandlers();
Tamas Berghammere13c2732015-02-11 10:29:30 +0000246
Kate Stoneb9c1b512016-09-06 20:57:50 +0000247 void DataAvailableCallback();
Pavel Labath77dc9562015-07-13 10:44:55 +0000248
Kate Stoneb9c1b512016-09-06 20:57:50 +0000249 void SendProcessOutput();
Pavel Labathc7749c32015-07-21 13:20:25 +0000250
Kate Stoneb9c1b512016-09-06 20:57:50 +0000251 void StartSTDIOForwarding();
Pavel Labathabadc222015-11-27 13:33:29 +0000252
Kate Stoneb9c1b512016-09-06 20:57:50 +0000253 void StopSTDIOForwarding();
Pavel Labathc7749c32015-07-21 13:20:25 +0000254
Kate Stoneb9c1b512016-09-06 20:57:50 +0000255 //------------------------------------------------------------------
256 // For GDBRemoteCommunicationServerLLGS only
257 //------------------------------------------------------------------
258 DISALLOW_COPY_AND_ASSIGN(GDBRemoteCommunicationServerLLGS);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000259};
260
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000261} // namespace process_gdb_remote
262} // namespace lldb_private
263
Kate Stoneb9c1b512016-09-06 20:57:50 +0000264#endif // liblldb_GDBRemoteCommunicationServerLLGS_h_