GDBRemoteCommunicationServer.h revision 263363
1//===-- GDBRemoteCommunicationServer.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_GDBRemoteCommunicationServer_h_
11#define liblldb_GDBRemoteCommunicationServer_h_
12
13// C Includes
14// C++ Includes
15#include <vector>
16#include <set>
17// Other libraries and framework includes
18// Project includes
19#include "lldb/Host/Mutex.h"
20#include "lldb/Target/Process.h"
21#include "GDBRemoteCommunication.h"
22
23class ProcessGDBRemote;
24class StringExtractorGDBRemote;
25
26class GDBRemoteCommunicationServer : public GDBRemoteCommunication
27{
28public:
29    enum
30    {
31        eBroadcastBitRunPacketSent = kLoUserBroadcastBit
32    };
33    //------------------------------------------------------------------
34    // Constructors and Destructors
35    //------------------------------------------------------------------
36    GDBRemoteCommunicationServer(bool is_platform);
37
38    virtual
39    ~GDBRemoteCommunicationServer();
40
41    bool
42    GetPacketAndSendResponse (uint32_t timeout_usec,
43                              lldb_private::Error &error,
44                              bool &interrupt,
45                              bool &quit);
46
47    virtual bool
48    GetThreadSuffixSupported ()
49    {
50        return true;
51    }
52
53    // After connecting, do a little handshake with the client to make sure
54    // we are at least communicating
55    bool
56    HandshakeWithClient (lldb_private::Error *error_ptr);
57
58    // Set both ports to zero to let the platform automatically bind to
59    // a port chosen by the OS.
60    void
61    SetPortRange (uint16_t lo_port_num, uint16_t hi_port_num)
62    {
63        m_lo_port_num = lo_port_num;
64        m_hi_port_num = hi_port_num;
65        m_next_port = m_lo_port_num;
66        m_use_port_range = true;
67    }
68
69    // If we are using a port range, get and update the next port to be used variable.
70    // Otherwise, just return 0.
71    uint16_t
72    GetAndUpdateNextPort ()
73    {
74        if (!m_use_port_range)
75            return 0;
76        uint16_t val = m_next_port;
77        if (++m_next_port > m_hi_port_num)
78            m_next_port = m_lo_port_num;
79        return val;
80    }
81
82protected:
83    //typedef std::map<uint16_t, lldb::pid_t> PortToPIDMap;
84
85    lldb::thread_t m_async_thread;
86    lldb_private::ProcessLaunchInfo m_process_launch_info;
87    lldb_private::Error m_process_launch_error;
88    std::set<lldb::pid_t> m_spawned_pids;
89    lldb_private::Mutex m_spawned_pids_mutex;
90    lldb_private::ProcessInstanceInfoList m_proc_infos;
91    uint32_t m_proc_infos_index;
92    uint16_t m_lo_port_num;
93    uint16_t m_hi_port_num;
94    //PortToPIDMap m_port_to_pid_map;
95    uint16_t m_next_port;
96    bool m_use_port_range;
97
98
99    size_t
100    SendUnimplementedResponse (const char *packet);
101
102    size_t
103    SendErrorResponse (uint8_t error);
104
105    size_t
106    SendOKResponse ();
107
108    bool
109    Handle_A (StringExtractorGDBRemote &packet);
110
111    bool
112    Handle_qLaunchSuccess (StringExtractorGDBRemote &packet);
113
114    bool
115    Handle_qHostInfo (StringExtractorGDBRemote &packet);
116
117    bool
118    Handle_qLaunchGDBServer (StringExtractorGDBRemote &packet);
119
120    bool
121    Handle_qKillSpawnedProcess (StringExtractorGDBRemote &packet);
122
123    bool
124    Handle_qPlatform_IO_MkDir (StringExtractorGDBRemote &packet);
125
126    bool
127    Handle_qProcessInfoPID (StringExtractorGDBRemote &packet);
128
129    bool
130    Handle_qfProcessInfo (StringExtractorGDBRemote &packet);
131
132    bool
133    Handle_qsProcessInfo (StringExtractorGDBRemote &packet);
134
135    bool
136    Handle_qC (StringExtractorGDBRemote &packet);
137
138    bool
139    Handle_qUserName (StringExtractorGDBRemote &packet);
140
141    bool
142    Handle_qGroupName (StringExtractorGDBRemote &packet);
143
144    bool
145    Handle_qSpeedTest (StringExtractorGDBRemote &packet);
146
147    bool
148    Handle_QEnvironment  (StringExtractorGDBRemote &packet);
149
150    bool
151    Handle_QLaunchArch (StringExtractorGDBRemote &packet);
152
153    bool
154    Handle_QSetDisableASLR (StringExtractorGDBRemote &packet);
155
156    bool
157    Handle_QSetWorkingDir (StringExtractorGDBRemote &packet);
158
159    bool
160    Handle_QStartNoAckMode (StringExtractorGDBRemote &packet);
161
162    bool
163    Handle_QSetSTDIN (StringExtractorGDBRemote &packet);
164
165    bool
166    Handle_QSetSTDOUT (StringExtractorGDBRemote &packet);
167
168    bool
169    Handle_QSetSTDERR (StringExtractorGDBRemote &packet);
170
171    bool
172    Handle_vFile_Open (StringExtractorGDBRemote &packet);
173
174    bool
175    Handle_vFile_Close (StringExtractorGDBRemote &packet);
176
177    bool
178    Handle_vFile_pRead (StringExtractorGDBRemote &packet);
179
180    bool
181    Handle_vFile_pWrite (StringExtractorGDBRemote &packet);
182
183    bool
184    Handle_vFile_Size (StringExtractorGDBRemote &packet);
185
186    bool
187    Handle_vFile_Mode (StringExtractorGDBRemote &packet);
188
189    bool
190    Handle_vFile_Exists (StringExtractorGDBRemote &packet);
191
192    bool
193    Handle_vFile_Stat (StringExtractorGDBRemote &packet);
194
195    bool
196    Handle_vFile_MD5 (StringExtractorGDBRemote &packet);
197
198    bool
199    Handle_qPlatform_RunCommand (StringExtractorGDBRemote &packet);
200
201private:
202    bool
203    DebugserverProcessReaped (lldb::pid_t pid);
204
205    static bool
206    ReapDebugserverProcess (void *callback_baton,
207                            lldb::pid_t pid,
208                            bool exited,
209                            int signal,
210                            int status);
211
212    //------------------------------------------------------------------
213    // For GDBRemoteCommunicationServer only
214    //------------------------------------------------------------------
215    DISALLOW_COPY_AND_ASSIGN (GDBRemoteCommunicationServer);
216};
217
218#endif  // liblldb_GDBRemoteCommunicationServer_h_
219