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