blob: cd38989f973cf485a9763c767d2d7d184869d1e4 [file] [log] [blame]
Kate Stoneb9c1b512016-09-06 20:57:50 +00001//===-- ProcessFreeBSD.h ------------------------------------------*- C++
2//-*-===//
Johnny Chen9ed5b492012-01-05 21:48:15 +00003//
4// The LLVM Compiler Infrastructure
5//
6// This file is distributed under the University of Illinois Open Source
7// License. See LICENSE.TXT for details.
8//
9//===----------------------------------------------------------------------===//
10
11#ifndef liblldb_ProcessFreeBSD_H_
12#define liblldb_ProcessFreeBSD_H_
13
14// C Includes
15
16// C++ Includes
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +000017#include <mutex>
Johnny Chen9ed5b492012-01-05 21:48:15 +000018#include <queue>
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +000019#include <set>
Johnny Chen9ed5b492012-01-05 21:48:15 +000020
21// Other libraries and framework includes
Kate Stoneb9c1b512016-09-06 20:57:50 +000022#include "ProcessFreeBSD.h"
23#include "ProcessMessage.h"
Johnny Chen9ed5b492012-01-05 21:48:15 +000024#include "lldb/Target/Process.h"
25#include "lldb/Target/ThreadList.h"
Johnny Chen9ed5b492012-01-05 21:48:15 +000026
27class ProcessMonitor;
Ed Mastefe5a6422015-07-28 15:45:57 +000028class FreeBSDThread;
Johnny Chen9ed5b492012-01-05 21:48:15 +000029
Kate Stoneb9c1b512016-09-06 20:57:50 +000030class ProcessFreeBSD : public lldb_private::Process {
Johnny Chen9ed5b492012-01-05 21:48:15 +000031
32public:
Kate Stoneb9c1b512016-09-06 20:57:50 +000033 //------------------------------------------------------------------
34 // Static functions.
35 //------------------------------------------------------------------
36 static lldb::ProcessSP
37 CreateInstance(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp,
38 const lldb_private::FileSpec *crash_file_path);
Johnny Chen9ed5b492012-01-05 21:48:15 +000039
Kate Stoneb9c1b512016-09-06 20:57:50 +000040 static void Initialize();
Johnny Chen9ed5b492012-01-05 21:48:15 +000041
Kate Stoneb9c1b512016-09-06 20:57:50 +000042 static void Terminate();
Johnny Chen9ed5b492012-01-05 21:48:15 +000043
Kate Stoneb9c1b512016-09-06 20:57:50 +000044 static lldb_private::ConstString GetPluginNameStatic();
Johnny Chen9ed5b492012-01-05 21:48:15 +000045
Kate Stoneb9c1b512016-09-06 20:57:50 +000046 static const char *GetPluginDescriptionStatic();
Johnny Chen9ed5b492012-01-05 21:48:15 +000047
Kate Stoneb9c1b512016-09-06 20:57:50 +000048 //------------------------------------------------------------------
49 // Constructors and destructors
50 //------------------------------------------------------------------
51 ProcessFreeBSD(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp,
52 lldb::UnixSignalsSP &unix_signals_sp);
Johnny Chen9ed5b492012-01-05 21:48:15 +000053
Kate Stoneb9c1b512016-09-06 20:57:50 +000054 ~ProcessFreeBSD();
Ed Maste7fd845c2013-12-09 15:51:17 +000055
Kate Stoneb9c1b512016-09-06 20:57:50 +000056 virtual lldb_private::Error WillResume() override;
Ed Maste7fd845c2013-12-09 15:51:17 +000057
Kate Stoneb9c1b512016-09-06 20:57:50 +000058 //------------------------------------------------------------------
59 // PluginInterface protocol
60 //------------------------------------------------------------------
61 virtual lldb_private::ConstString GetPluginName() override;
Johnny Chen9ed5b492012-01-05 21:48:15 +000062
Kate Stoneb9c1b512016-09-06 20:57:50 +000063 virtual uint32_t GetPluginVersion() override;
Johnny Chen9ed5b492012-01-05 21:48:15 +000064
Ed Mastefe5a6422015-07-28 15:45:57 +000065public:
Kate Stoneb9c1b512016-09-06 20:57:50 +000066 //------------------------------------------------------------------
67 // Process protocol.
68 //------------------------------------------------------------------
69 void Finalize() override;
Ed Mastefe5a6422015-07-28 15:45:57 +000070
Kate Stoneb9c1b512016-09-06 20:57:50 +000071 bool CanDebug(lldb::TargetSP target_sp,
72 bool plugin_specified_by_name) override;
Ed Mastefe5a6422015-07-28 15:45:57 +000073
Kate Stoneb9c1b512016-09-06 20:57:50 +000074 lldb_private::Error WillLaunch(lldb_private::Module *module) override;
Ed Mastefe5a6422015-07-28 15:45:57 +000075
Kate Stoneb9c1b512016-09-06 20:57:50 +000076 lldb_private::Error DoAttachToProcessWithID(
77 lldb::pid_t pid,
78 const lldb_private::ProcessAttachInfo &attach_info) override;
Ed Mastefe5a6422015-07-28 15:45:57 +000079
Kate Stoneb9c1b512016-09-06 20:57:50 +000080 lldb_private::Error
81 DoLaunch(lldb_private::Module *exe_module,
82 lldb_private::ProcessLaunchInfo &launch_info) override;
Ed Mastefe5a6422015-07-28 15:45:57 +000083
Kate Stoneb9c1b512016-09-06 20:57:50 +000084 void DidLaunch() override;
Ed Mastefe5a6422015-07-28 15:45:57 +000085
Kate Stoneb9c1b512016-09-06 20:57:50 +000086 lldb_private::Error DoResume() override;
Ed Mastefe5a6422015-07-28 15:45:57 +000087
Kate Stoneb9c1b512016-09-06 20:57:50 +000088 lldb_private::Error DoHalt(bool &caused_stop) override;
Ed Mastefe5a6422015-07-28 15:45:57 +000089
Kate Stoneb9c1b512016-09-06 20:57:50 +000090 lldb_private::Error DoDetach(bool keep_stopped) override;
Ed Mastefe5a6422015-07-28 15:45:57 +000091
Kate Stoneb9c1b512016-09-06 20:57:50 +000092 lldb_private::Error DoSignal(int signal) override;
Ed Mastefe5a6422015-07-28 15:45:57 +000093
Kate Stoneb9c1b512016-09-06 20:57:50 +000094 lldb_private::Error DoDestroy() override;
Ed Mastefe5a6422015-07-28 15:45:57 +000095
Kate Stoneb9c1b512016-09-06 20:57:50 +000096 void DoDidExec() override;
Ed Mastefe5a6422015-07-28 15:45:57 +000097
Kate Stoneb9c1b512016-09-06 20:57:50 +000098 void RefreshStateAfterStop() override;
Ed Mastefe5a6422015-07-28 15:45:57 +000099
Kate Stoneb9c1b512016-09-06 20:57:50 +0000100 bool IsAlive() override;
Ed Mastefe5a6422015-07-28 15:45:57 +0000101
Kate Stoneb9c1b512016-09-06 20:57:50 +0000102 size_t DoReadMemory(lldb::addr_t vm_addr, void *buf, size_t size,
103 lldb_private::Error &error) override;
Ed Mastefe5a6422015-07-28 15:45:57 +0000104
Kate Stoneb9c1b512016-09-06 20:57:50 +0000105 size_t DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size,
106 lldb_private::Error &error) override;
107
108 lldb::addr_t DoAllocateMemory(size_t size, uint32_t permissions,
109 lldb_private::Error &error) override;
110
111 lldb_private::Error DoDeallocateMemory(lldb::addr_t ptr) override;
112
113 virtual size_t
114 GetSoftwareBreakpointTrapOpcode(lldb_private::BreakpointSite *bp_site);
115
116 lldb_private::Error
117 EnableBreakpointSite(lldb_private::BreakpointSite *bp_site) override;
118
119 lldb_private::Error
120 DisableBreakpointSite(lldb_private::BreakpointSite *bp_site) override;
121
122 lldb_private::Error EnableWatchpoint(lldb_private::Watchpoint *wp,
123 bool notify = true) override;
124
125 lldb_private::Error DisableWatchpoint(lldb_private::Watchpoint *wp,
126 bool notify = true) override;
127
128 lldb_private::Error GetWatchpointSupportInfo(uint32_t &num) override;
129
130 lldb_private::Error GetWatchpointSupportInfo(uint32_t &num,
131 bool &after) override;
132
133 virtual uint32_t UpdateThreadListIfNeeded();
134
135 bool UpdateThreadList(lldb_private::ThreadList &old_thread_list,
136 lldb_private::ThreadList &new_thread_list) override;
137
138 virtual lldb::ByteOrder GetByteOrder() const;
139
140 lldb::addr_t GetImageInfoAddress() override;
141
142 size_t PutSTDIN(const char *buf, size_t len,
Ed Mastefe5a6422015-07-28 15:45:57 +0000143 lldb_private::Error &error) override;
144
Kate Stoneb9c1b512016-09-06 20:57:50 +0000145 const lldb::DataBufferSP GetAuxvData() override;
Ed Mastefe5a6422015-07-28 15:45:57 +0000146
Kate Stoneb9c1b512016-09-06 20:57:50 +0000147 //--------------------------------------------------------------------------
148 // ProcessFreeBSD internal API.
Ed Mastefe5a6422015-07-28 15:45:57 +0000149
Kate Stoneb9c1b512016-09-06 20:57:50 +0000150 /// Registers the given message with this process.
151 virtual void SendMessage(const ProcessMessage &message);
Ed Mastefe5a6422015-07-28 15:45:57 +0000152
Kate Stoneb9c1b512016-09-06 20:57:50 +0000153 ProcessMonitor &GetMonitor() {
154 assert(m_monitor);
155 return *m_monitor;
156 }
Ed Mastefe5a6422015-07-28 15:45:57 +0000157
Kate Stoneb9c1b512016-09-06 20:57:50 +0000158 lldb_private::FileSpec
159 GetFileSpec(const lldb_private::FileAction *file_action,
160 const lldb_private::FileSpec &default_file_spec,
161 const lldb_private::FileSpec &dbg_pts_file_spec);
Ed Mastefe5a6422015-07-28 15:45:57 +0000162
Kate Stoneb9c1b512016-09-06 20:57:50 +0000163 /// Adds the thread to the list of threads for which we have received the
164 /// initial stopping signal.
165 /// The \p stop_tid parameter indicates the thread which the stop happened
166 /// for.
167 bool AddThreadForInitialStopIfNeeded(lldb::tid_t stop_tid);
Ed Mastefe5a6422015-07-28 15:45:57 +0000168
Kate Stoneb9c1b512016-09-06 20:57:50 +0000169 bool WaitingForInitialStop(lldb::tid_t stop_tid);
Ed Mastefe5a6422015-07-28 15:45:57 +0000170
Kate Stoneb9c1b512016-09-06 20:57:50 +0000171 virtual FreeBSDThread *CreateNewFreeBSDThread(lldb_private::Process &process,
172 lldb::tid_t tid);
Ed Mastefe5a6422015-07-28 15:45:57 +0000173
Ed Maste7fd845c2013-12-09 15:51:17 +0000174protected:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000175 /// Target byte order.
176 lldb::ByteOrder m_byte_order;
Ed Mastefe5a6422015-07-28 15:45:57 +0000177
Kate Stoneb9c1b512016-09-06 20:57:50 +0000178 /// Process monitor;
179 ProcessMonitor *m_monitor;
Ed Mastefe5a6422015-07-28 15:45:57 +0000180
Kate Stoneb9c1b512016-09-06 20:57:50 +0000181 /// The module we are executing.
182 lldb_private::Module *m_module;
Ed Mastefe5a6422015-07-28 15:45:57 +0000183
Kate Stoneb9c1b512016-09-06 20:57:50 +0000184 /// Message queue notifying this instance of inferior process state changes.
185 std::recursive_mutex m_message_mutex;
186 std::queue<ProcessMessage> m_message_queue;
Ed Mastefe5a6422015-07-28 15:45:57 +0000187
Kate Stoneb9c1b512016-09-06 20:57:50 +0000188 /// Drive any exit events to completion.
189 bool m_exit_now;
Ed Mastefe5a6422015-07-28 15:45:57 +0000190
Kate Stoneb9c1b512016-09-06 20:57:50 +0000191 /// Returns true if the process has exited.
192 bool HasExited();
Ed Mastefe5a6422015-07-28 15:45:57 +0000193
Kate Stoneb9c1b512016-09-06 20:57:50 +0000194 /// Returns true if the process is stopped.
195 bool IsStopped();
Ed Mastefe5a6422015-07-28 15:45:57 +0000196
Kate Stoneb9c1b512016-09-06 20:57:50 +0000197 /// Returns true if at least one running is currently running
198 bool IsAThreadRunning();
Ed Mastefe5a6422015-07-28 15:45:57 +0000199
Kate Stoneb9c1b512016-09-06 20:57:50 +0000200 typedef std::map<lldb::addr_t, lldb::addr_t> MMapMap;
201 MMapMap m_addr_to_mmap_size;
Ed Mastefe5a6422015-07-28 15:45:57 +0000202
Kate Stoneb9c1b512016-09-06 20:57:50 +0000203 typedef std::set<lldb::tid_t> ThreadStopSet;
204 /// Every thread begins with a stop signal. This keeps track
205 /// of the threads for which we have received the stop signal.
206 ThreadStopSet m_seen_initial_stop;
Ed Mastefe5a6422015-07-28 15:45:57 +0000207
Kate Stoneb9c1b512016-09-06 20:57:50 +0000208 friend class FreeBSDThread;
Ed Maste7fd845c2013-12-09 15:51:17 +0000209
Kate Stoneb9c1b512016-09-06 20:57:50 +0000210 typedef std::vector<lldb::tid_t> tid_collection;
211 tid_collection m_suspend_tids;
212 tid_collection m_run_tids;
213 tid_collection m_step_tids;
Ed Maste7fd845c2013-12-09 15:51:17 +0000214
Kate Stoneb9c1b512016-09-06 20:57:50 +0000215 int m_resume_signo;
Johnny Chen9ed5b492012-01-05 21:48:15 +0000216};
217
Kate Stoneb9c1b512016-09-06 20:57:50 +0000218#endif // liblldb_ProcessFreeBSD_H_