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