1//===-- ProcessKDP.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_ProcessKDP_h_
11#define liblldb_ProcessKDP_h_
12
13// C Includes
14
15// C++ Includes
16#include <list>
17#include <vector>
18
19// Other libraries and framework includes
20#include "lldb/Core/ArchSpec.h"
21#include "lldb/Core/Broadcaster.h"
22#include "lldb/Core/ConstString.h"
23#include "lldb/Core/Error.h"
24#include "lldb/Core/InputReader.h"
25#include "lldb/Core/StreamString.h"
26#include "lldb/Core/StringList.h"
27#include "lldb/Core/ThreadSafeValue.h"
28#include "lldb/Target/Process.h"
29#include "lldb/Target/Thread.h"
30
31#include "CommunicationKDP.h"
32#include "Utility/StringExtractor.h"
33
34class ThreadKDP;
35
36class ProcessKDP : public lldb_private::Process
37{
38public:
39    //------------------------------------------------------------------
40    // Constructors and Destructors
41    //------------------------------------------------------------------
42    static lldb::ProcessSP
43    CreateInstance (lldb_private::Target& target,
44                    lldb_private::Listener &listener,
45                    const lldb_private::FileSpec *crash_file_path);
46
47    static void
48    Initialize();
49
50    static void
51    DebuggerInitialize (lldb_private::Debugger &debugger);
52
53    static void
54    Terminate();
55
56    static lldb_private::ConstString
57    GetPluginNameStatic();
58
59    static const char *
60    GetPluginDescriptionStatic();
61
62    //------------------------------------------------------------------
63    // Constructors and Destructors
64    //------------------------------------------------------------------
65    ProcessKDP(lldb_private::Target& target, lldb_private::Listener &listener);
66
67    virtual
68    ~ProcessKDP();
69
70    //------------------------------------------------------------------
71    // Check if a given Process
72    //------------------------------------------------------------------
73    virtual bool
74    CanDebug (lldb_private::Target &target,
75              bool plugin_specified_by_name);
76
77    virtual lldb_private::CommandObject *
78    GetPluginCommandObject();
79
80    //------------------------------------------------------------------
81    // Creating a new process, or attaching to an existing one
82    //------------------------------------------------------------------
83    virtual lldb_private::Error
84    WillLaunch (lldb_private::Module* module);
85
86    virtual lldb_private::Error
87    DoLaunch (lldb_private::Module *exe_module,
88              const lldb_private::ProcessLaunchInfo &launch_info);
89
90    virtual lldb_private::Error
91    WillAttachToProcessWithID (lldb::pid_t pid);
92
93    virtual lldb_private::Error
94    WillAttachToProcessWithName (const char *process_name, bool wait_for_launch);
95
96    virtual lldb_private::Error
97    DoConnectRemote (lldb_private::Stream *strm, const char *remote_url);
98
99    virtual lldb_private::Error
100    DoAttachToProcessWithID (lldb::pid_t pid);
101
102    virtual lldb_private::Error
103    DoAttachToProcessWithID (lldb::pid_t pid, const lldb_private::ProcessAttachInfo &attach_info);
104
105    virtual lldb_private::Error
106    DoAttachToProcessWithName (const char *process_name, bool wait_for_launch, const lldb_private::ProcessAttachInfo &attach_info);
107
108    virtual void
109    DidAttach ();
110
111    lldb::addr_t
112    GetImageInfoAddress();
113
114    lldb_private::DynamicLoader *
115    GetDynamicLoader ();
116
117    //------------------------------------------------------------------
118    // PluginInterface protocol
119    //------------------------------------------------------------------
120    virtual lldb_private::ConstString
121    GetPluginName();
122
123    virtual uint32_t
124    GetPluginVersion();
125
126    //------------------------------------------------------------------
127    // Process Control
128    //------------------------------------------------------------------
129    virtual lldb_private::Error
130    WillResume ();
131
132    virtual lldb_private::Error
133    DoResume ();
134
135    virtual lldb_private::Error
136    DoHalt (bool &caused_stop);
137
138    virtual lldb_private::Error
139    DoDetach (bool keep_stopped);
140
141    virtual lldb_private::Error
142    DoSignal (int signal);
143
144    virtual lldb_private::Error
145    DoDestroy ();
146
147    virtual void
148    RefreshStateAfterStop();
149
150    //------------------------------------------------------------------
151    // Process Queries
152    //------------------------------------------------------------------
153    virtual bool
154    IsAlive ();
155
156    //------------------------------------------------------------------
157    // Process Memory
158    //------------------------------------------------------------------
159    virtual size_t
160    DoReadMemory (lldb::addr_t addr, void *buf, size_t size, lldb_private::Error &error);
161
162    virtual size_t
163    DoWriteMemory (lldb::addr_t addr, const void *buf, size_t size, lldb_private::Error &error);
164
165    virtual lldb::addr_t
166    DoAllocateMemory (size_t size, uint32_t permissions, lldb_private::Error &error);
167
168    virtual lldb_private::Error
169    DoDeallocateMemory (lldb::addr_t ptr);
170
171    //----------------------------------------------------------------------
172    // Process Breakpoints
173    //----------------------------------------------------------------------
174    virtual lldb_private::Error
175    EnableBreakpointSite (lldb_private::BreakpointSite *bp_site);
176
177    virtual lldb_private::Error
178    DisableBreakpointSite (lldb_private::BreakpointSite *bp_site);
179
180    //----------------------------------------------------------------------
181    // Process Watchpoints
182    //----------------------------------------------------------------------
183    virtual lldb_private::Error
184    EnableWatchpoint (lldb_private::Watchpoint *wp, bool notify = true);
185
186    virtual lldb_private::Error
187    DisableWatchpoint (lldb_private::Watchpoint *wp, bool notify = true);
188
189    CommunicationKDP &
190    GetCommunication()
191    {
192        return m_comm;
193    }
194
195protected:
196    friend class ThreadKDP;
197    friend class CommunicationKDP;
198
199    //----------------------------------------------------------------------
200    // Accessors
201    //----------------------------------------------------------------------
202    bool
203    IsRunning ( lldb::StateType state )
204    {
205        return    state == lldb::eStateRunning || IsStepping(state);
206    }
207
208    bool
209    IsStepping ( lldb::StateType state)
210    {
211        return    state == lldb::eStateStepping;
212    }
213
214    bool
215    CanResume ( lldb::StateType state)
216    {
217        return state == lldb::eStateStopped;
218    }
219
220    bool
221    HasExited (lldb::StateType state)
222    {
223        return state == lldb::eStateExited;
224    }
225
226    bool
227    ProcessIDIsValid ( ) const;
228
229    void
230    Clear ( );
231
232    virtual bool
233    UpdateThreadList (lldb_private::ThreadList &old_thread_list,
234                      lldb_private::ThreadList &new_thread_list);
235
236    enum
237    {
238        eBroadcastBitAsyncContinue                  = (1 << 0),
239        eBroadcastBitAsyncThreadShouldExit          = (1 << 1)
240    };
241
242    lldb::ThreadSP
243    GetKernelThread ();
244
245    //------------------------------------------------------------------
246    /// Broadcaster event bits definitions.
247    //------------------------------------------------------------------
248    CommunicationKDP m_comm;
249    lldb_private::Broadcaster m_async_broadcaster;
250    lldb::thread_t m_async_thread;
251    lldb_private::ConstString m_dyld_plugin_name;
252    lldb::addr_t m_kernel_load_addr;
253    lldb::CommandObjectSP m_command_sp;
254    lldb::ThreadWP m_kernel_thread_wp;
255
256
257    bool
258    StartAsyncThread ();
259
260    void
261    StopAsyncThread ();
262
263    static void *
264    AsyncThread (void *arg);
265
266private:
267    //------------------------------------------------------------------
268    // For ProcessKDP only
269    //------------------------------------------------------------------
270
271    DISALLOW_COPY_AND_ASSIGN (ProcessKDP);
272
273};
274
275#endif  // liblldb_ProcessKDP_h_
276