1254721Semaste//===-- ProcessGDBRemote.h --------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#ifndef liblldb_ProcessGDBRemote_h_
11254721Semaste#define liblldb_ProcessGDBRemote_h_
12254721Semaste
13254721Semaste// C Includes
14254721Semaste
15254721Semaste// C++ Includes
16254721Semaste#include <list>
17254721Semaste#include <vector>
18254721Semaste
19254721Semaste// Other libraries and framework includes
20254721Semaste#include "lldb/Core/ArchSpec.h"
21254721Semaste#include "lldb/Core/Broadcaster.h"
22254721Semaste#include "lldb/Core/ConstString.h"
23254721Semaste#include "lldb/Core/Error.h"
24254721Semaste#include "lldb/Core/StreamString.h"
25254721Semaste#include "lldb/Core/StringList.h"
26254721Semaste#include "lldb/Core/ThreadSafeValue.h"
27254721Semaste#include "lldb/Target/Process.h"
28254721Semaste#include "lldb/Target/Thread.h"
29254721Semaste
30254721Semaste#include "GDBRemoteCommunicationClient.h"
31254721Semaste#include "Utility/StringExtractor.h"
32254721Semaste#include "GDBRemoteRegisterContext.h"
33254721Semaste
34254721Semasteclass ThreadGDBRemote;
35254721Semaste
36254721Semasteclass ProcessGDBRemote : public lldb_private::Process
37254721Semaste{
38254721Semastepublic:
39254721Semaste    //------------------------------------------------------------------
40254721Semaste    // Constructors and Destructors
41254721Semaste    //------------------------------------------------------------------
42254721Semaste    static lldb::ProcessSP
43254721Semaste    CreateInstance (lldb_private::Target& target,
44254721Semaste                    lldb_private::Listener &listener,
45254721Semaste                    const lldb_private::FileSpec *crash_file_path);
46254721Semaste
47254721Semaste    static void
48254721Semaste    Initialize();
49254721Semaste
50254721Semaste    static void
51254721Semaste    DebuggerInitialize (lldb_private::Debugger &debugger);
52254721Semaste
53254721Semaste    static void
54254721Semaste    Terminate();
55254721Semaste
56254721Semaste    static lldb_private::ConstString
57254721Semaste    GetPluginNameStatic();
58254721Semaste
59254721Semaste    static const char *
60254721Semaste    GetPluginDescriptionStatic();
61254721Semaste
62254721Semaste    //------------------------------------------------------------------
63254721Semaste    // Constructors and Destructors
64254721Semaste    //------------------------------------------------------------------
65254721Semaste    ProcessGDBRemote(lldb_private::Target& target, lldb_private::Listener &listener);
66254721Semaste
67254721Semaste    virtual
68254721Semaste    ~ProcessGDBRemote();
69254721Semaste
70254721Semaste    //------------------------------------------------------------------
71254721Semaste    // Check if a given Process
72254721Semaste    //------------------------------------------------------------------
73254721Semaste    virtual bool
74254721Semaste    CanDebug (lldb_private::Target &target,
75254721Semaste              bool plugin_specified_by_name);
76254721Semaste
77254721Semaste    virtual lldb_private::CommandObject *
78254721Semaste    GetPluginCommandObject();
79254721Semaste
80254721Semaste    //------------------------------------------------------------------
81254721Semaste    // Creating a new process, or attaching to an existing one
82254721Semaste    //------------------------------------------------------------------
83254721Semaste    virtual lldb_private::Error
84254721Semaste    WillLaunch (lldb_private::Module* module);
85254721Semaste
86254721Semaste    virtual lldb_private::Error
87254721Semaste    DoLaunch (lldb_private::Module *exe_module,
88269024Semaste              lldb_private::ProcessLaunchInfo &launch_info);
89254721Semaste
90254721Semaste    virtual void
91254721Semaste    DidLaunch ();
92254721Semaste
93254721Semaste    virtual lldb_private::Error
94254721Semaste    WillAttachToProcessWithID (lldb::pid_t pid);
95254721Semaste
96254721Semaste    virtual lldb_private::Error
97254721Semaste    WillAttachToProcessWithName (const char *process_name, bool wait_for_launch);
98254721Semaste
99254721Semaste    virtual lldb_private::Error
100254721Semaste    DoConnectRemote (lldb_private::Stream *strm, const char *remote_url);
101254721Semaste
102254721Semaste    lldb_private::Error
103254721Semaste    WillLaunchOrAttach ();
104254721Semaste
105254721Semaste    virtual lldb_private::Error
106254721Semaste    DoAttachToProcessWithID (lldb::pid_t pid);
107254721Semaste
108254721Semaste    virtual lldb_private::Error
109254721Semaste    DoAttachToProcessWithID (lldb::pid_t pid, const lldb_private::ProcessAttachInfo &attach_info);
110254721Semaste
111254721Semaste    virtual lldb_private::Error
112254721Semaste    DoAttachToProcessWithName (const char *process_name,
113254721Semaste                               const lldb_private::ProcessAttachInfo &attach_info);
114254721Semaste
115254721Semaste    virtual void
116254721Semaste    DidAttach ();
117254721Semaste
118254721Semaste    //------------------------------------------------------------------
119254721Semaste    // PluginInterface protocol
120254721Semaste    //------------------------------------------------------------------
121254721Semaste    virtual lldb_private::ConstString
122254721Semaste    GetPluginName();
123254721Semaste
124254721Semaste    virtual uint32_t
125254721Semaste    GetPluginVersion();
126254721Semaste
127254721Semaste    //------------------------------------------------------------------
128254721Semaste    // Process Control
129254721Semaste    //------------------------------------------------------------------
130254721Semaste    virtual lldb_private::Error
131254721Semaste    WillResume ();
132254721Semaste
133254721Semaste    virtual lldb_private::Error
134254721Semaste    DoResume ();
135254721Semaste
136254721Semaste    virtual lldb_private::Error
137254721Semaste    DoHalt (bool &caused_stop);
138254721Semaste
139254721Semaste    virtual lldb_private::Error
140254721Semaste    DoDetach (bool keep_stopped);
141254721Semaste
142254721Semaste    virtual bool
143254721Semaste    DetachRequiresHalt() { return true; }
144254721Semaste
145254721Semaste    virtual lldb_private::Error
146254721Semaste    DoSignal (int signal);
147254721Semaste
148254721Semaste    virtual lldb_private::Error
149254721Semaste    DoDestroy ();
150254721Semaste
151254721Semaste    virtual void
152254721Semaste    RefreshStateAfterStop();
153254721Semaste
154254721Semaste    //------------------------------------------------------------------
155254721Semaste    // Process Queries
156254721Semaste    //------------------------------------------------------------------
157254721Semaste    virtual bool
158254721Semaste    IsAlive ();
159254721Semaste
160254721Semaste    virtual lldb::addr_t
161254721Semaste    GetImageInfoAddress();
162254721Semaste
163254721Semaste    //------------------------------------------------------------------
164254721Semaste    // Process Memory
165254721Semaste    //------------------------------------------------------------------
166254721Semaste    virtual size_t
167254721Semaste    DoReadMemory (lldb::addr_t addr, void *buf, size_t size, lldb_private::Error &error);
168254721Semaste
169254721Semaste    virtual size_t
170254721Semaste    DoWriteMemory (lldb::addr_t addr, const void *buf, size_t size, lldb_private::Error &error);
171254721Semaste
172254721Semaste    virtual lldb::addr_t
173254721Semaste    DoAllocateMemory (size_t size, uint32_t permissions, lldb_private::Error &error);
174254721Semaste
175254721Semaste    virtual lldb_private::Error
176254721Semaste    GetMemoryRegionInfo (lldb::addr_t load_addr,
177254721Semaste                         lldb_private::MemoryRegionInfo &region_info);
178254721Semaste
179254721Semaste    virtual lldb_private::Error
180254721Semaste    DoDeallocateMemory (lldb::addr_t ptr);
181254721Semaste
182254721Semaste    //------------------------------------------------------------------
183254721Semaste    // Process STDIO
184254721Semaste    //------------------------------------------------------------------
185254721Semaste    virtual size_t
186254721Semaste    PutSTDIN (const char *buf, size_t buf_size, lldb_private::Error &error);
187254721Semaste
188254721Semaste    //----------------------------------------------------------------------
189254721Semaste    // Process Breakpoints
190254721Semaste    //----------------------------------------------------------------------
191254721Semaste    virtual lldb_private::Error
192254721Semaste    EnableBreakpointSite (lldb_private::BreakpointSite *bp_site);
193254721Semaste
194254721Semaste    virtual lldb_private::Error
195254721Semaste    DisableBreakpointSite (lldb_private::BreakpointSite *bp_site);
196254721Semaste
197254721Semaste    //----------------------------------------------------------------------
198254721Semaste    // Process Watchpoints
199254721Semaste    //----------------------------------------------------------------------
200254721Semaste    virtual lldb_private::Error
201254721Semaste    EnableWatchpoint (lldb_private::Watchpoint *wp, bool notify = true);
202254721Semaste
203254721Semaste    virtual lldb_private::Error
204254721Semaste    DisableWatchpoint (lldb_private::Watchpoint *wp, bool notify = true);
205254721Semaste
206254721Semaste    virtual lldb_private::Error
207254721Semaste    GetWatchpointSupportInfo (uint32_t &num);
208254721Semaste
209254721Semaste    virtual lldb_private::Error
210254721Semaste    GetWatchpointSupportInfo (uint32_t &num, bool& after);
211254721Semaste
212254721Semaste    virtual bool
213254721Semaste    StartNoticingNewThreads();
214254721Semaste
215254721Semaste    virtual bool
216254721Semaste    StopNoticingNewThreads();
217254721Semaste
218254721Semaste    GDBRemoteCommunicationClient &
219254721Semaste    GetGDBRemote()
220254721Semaste    {
221254721Semaste        return m_gdb_comm;
222254721Semaste    }
223263367Semaste
224263367Semaste    //----------------------------------------------------------------------
225263367Semaste    // Override SetExitStatus so we can disconnect from the remote GDB server
226263367Semaste    //----------------------------------------------------------------------
227263367Semaste    virtual bool
228263367Semaste    SetExitStatus (int exit_status, const char *cstr);
229254721Semaste
230263367Semaste
231254721Semasteprotected:
232254721Semaste    friend class ThreadGDBRemote;
233254721Semaste    friend class GDBRemoteCommunicationClient;
234254721Semaste    friend class GDBRemoteRegisterContext;
235254721Semaste
236254721Semaste    //----------------------------------------------------------------------
237254721Semaste    // Accessors
238254721Semaste    //----------------------------------------------------------------------
239254721Semaste    bool
240254721Semaste    IsRunning ( lldb::StateType state )
241254721Semaste    {
242254721Semaste        return    state == lldb::eStateRunning || IsStepping(state);
243254721Semaste    }
244254721Semaste
245254721Semaste    bool
246254721Semaste    IsStepping ( lldb::StateType state)
247254721Semaste    {
248254721Semaste        return    state == lldb::eStateStepping;
249254721Semaste    }
250254721Semaste    bool
251254721Semaste    CanResume ( lldb::StateType state)
252254721Semaste    {
253254721Semaste        return state == lldb::eStateStopped;
254254721Semaste    }
255254721Semaste
256254721Semaste    bool
257254721Semaste    HasExited (lldb::StateType state)
258254721Semaste    {
259254721Semaste        return state == lldb::eStateExited;
260254721Semaste    }
261254721Semaste
262254721Semaste    bool
263254721Semaste    ProcessIDIsValid ( ) const;
264254721Semaste
265254721Semaste    void
266254721Semaste    Clear ( );
267254721Semaste
268254721Semaste    lldb_private::Flags &
269254721Semaste    GetFlags ()
270254721Semaste    {
271254721Semaste        return m_flags;
272254721Semaste    }
273254721Semaste
274254721Semaste    const lldb_private::Flags &
275254721Semaste    GetFlags () const
276254721Semaste    {
277254721Semaste        return m_flags;
278254721Semaste    }
279254721Semaste
280254721Semaste    virtual bool
281254721Semaste    UpdateThreadList (lldb_private::ThreadList &old_thread_list,
282254721Semaste                      lldb_private::ThreadList &new_thread_list);
283254721Semaste
284254721Semaste    lldb_private::Error
285269024Semaste    LaunchAndConnectToDebugserver (const lldb_private::ProcessInfo &process_info);
286254721Semaste
287254721Semaste    void
288254721Semaste    KillDebugserverProcess ();
289254721Semaste
290254721Semaste    void
291254721Semaste    BuildDynamicRegisterInfo (bool force);
292254721Semaste
293254721Semaste    void
294254721Semaste    SetLastStopPacket (const StringExtractorGDBRemote &response);
295254721Semaste
296263363Semaste    bool
297263363Semaste    ParsePythonTargetDefinition(const lldb_private::FileSpec &target_definition_fspec);
298263363Semaste
299263363Semaste    bool
300263363Semaste    ParseRegisters(lldb_private::ScriptInterpreterObject *registers_array);
301263363Semaste
302254721Semaste    //------------------------------------------------------------------
303254721Semaste    /// Broadcaster event bits definitions.
304254721Semaste    //------------------------------------------------------------------
305254721Semaste    enum
306254721Semaste    {
307254721Semaste        eBroadcastBitAsyncContinue                  = (1 << 0),
308254721Semaste        eBroadcastBitAsyncThreadShouldExit          = (1 << 1),
309254721Semaste        eBroadcastBitAsyncThreadDidExit             = (1 << 2)
310254721Semaste    };
311254721Semaste
312254721Semaste    typedef enum AsyncThreadState
313254721Semaste    {
314254721Semaste        eAsyncThreadNotStarted,
315254721Semaste        eAsyncThreadRunning,
316254721Semaste        eAsyncThreadDone
317254721Semaste    } AsyncThreadState;
318254721Semaste
319254721Semaste    lldb_private::Flags m_flags;            // Process specific flags (see eFlags enums)
320254721Semaste    GDBRemoteCommunicationClient m_gdb_comm;
321254721Semaste    lldb::pid_t m_debugserver_pid;
322254721Semaste    StringExtractorGDBRemote m_last_stop_packet;
323254721Semaste    lldb_private::Mutex m_last_stop_packet_mutex;
324254721Semaste    GDBRemoteDynamicRegisterInfo m_register_info;
325254721Semaste    lldb_private::Broadcaster m_async_broadcaster;
326254721Semaste    lldb::thread_t m_async_thread;
327254721Semaste    AsyncThreadState m_async_thread_state;
328254721Semaste    lldb_private::Mutex m_async_thread_state_mutex;
329254721Semaste    typedef std::vector<lldb::tid_t> tid_collection;
330254721Semaste    typedef std::vector< std::pair<lldb::tid_t,int> > tid_sig_collection;
331254721Semaste    typedef std::map<lldb::addr_t, lldb::addr_t> MMapMap;
332254721Semaste    tid_collection m_thread_ids; // Thread IDs for all threads. This list gets updated after stopping
333254721Semaste    tid_collection m_continue_c_tids;                  // 'c' for continue
334254721Semaste    tid_sig_collection m_continue_C_tids; // 'C' for continue with signal
335254721Semaste    tid_collection m_continue_s_tids;                  // 's' for step
336254721Semaste    tid_sig_collection m_continue_S_tids; // 'S' for step with signal
337254721Semaste    size_t m_max_memory_size;       // The maximum number of bytes to read/write when reading and writing memory
338254721Semaste    MMapMap m_addr_to_mmap_size;
339254721Semaste    lldb::BreakpointSP m_thread_create_bp_sp;
340254721Semaste    bool m_waiting_for_attach;
341254721Semaste    bool m_destroy_tried_resuming;
342254721Semaste    lldb::CommandObjectSP m_command_sp;
343263363Semaste    int64_t m_breakpoint_pc_offset;
344254721Semaste
345254721Semaste    bool
346254721Semaste    StartAsyncThread ();
347254721Semaste
348254721Semaste    void
349254721Semaste    StopAsyncThread ();
350254721Semaste
351263363Semaste    static lldb::thread_result_t
352254721Semaste    AsyncThread (void *arg);
353254721Semaste
354254721Semaste    static bool
355254721Semaste    MonitorDebugserverProcess (void *callback_baton,
356254721Semaste                               lldb::pid_t pid,
357254721Semaste                               bool exited,
358254721Semaste                               int signo,
359254721Semaste                               int exit_status);
360254721Semaste
361254721Semaste    lldb::StateType
362254721Semaste    SetThreadStopInfo (StringExtractor& stop_packet);
363254721Semaste
364254721Semaste    void
365254721Semaste    ClearThreadIDList ();
366254721Semaste
367254721Semaste    bool
368254721Semaste    UpdateThreadIDList ();
369254721Semaste
370254721Semaste    void
371254721Semaste    DidLaunchOrAttach ();
372254721Semaste
373254721Semaste    lldb_private::Error
374254721Semaste    ConnectToDebugserver (const char *host_port);
375254721Semaste
376254721Semaste    const char *
377254721Semaste    GetDispatchQueueNameForThread (lldb::addr_t thread_dispatch_qaddr,
378254721Semaste                                   std::string &dispatch_queue_name);
379254721Semaste
380254721Semaste    lldb_private::DynamicLoader *
381254721Semaste    GetDynamicLoader ();
382254721Semaste
383254721Semasteprivate:
384254721Semaste    //------------------------------------------------------------------
385254721Semaste    // For ProcessGDBRemote only
386254721Semaste    //------------------------------------------------------------------
387254721Semaste    static bool
388254721Semaste    NewThreadNotifyBreakpointHit (void *baton,
389254721Semaste                         lldb_private::StoppointCallbackContext *context,
390254721Semaste                         lldb::user_id_t break_id,
391254721Semaste                         lldb::user_id_t break_loc_id);
392254721Semaste
393254721Semaste    DISALLOW_COPY_AND_ASSIGN (ProcessGDBRemote);
394254721Semaste
395254721Semaste};
396254721Semaste
397254721Semaste#endif  // liblldb_ProcessGDBRemote_h_
398