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