12341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//===-- ProcessPOSIX.h ------------------------------------------*- C++ -*-===// 22341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// 32341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// The LLVM Compiler Infrastructure 42341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// 52341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// This file is distributed under the University of Illinois Open Source 62341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// License. See LICENSE.TXT for details. 72341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// 82341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//===----------------------------------------------------------------------===// 92341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#ifndef liblldb_ProcessPOSIX_H_ 112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#define liblldb_ProcessPOSIX_H_ 122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// C Includes 142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// C++ Includes 162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include <queue> 17ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec#include <set> 182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// Other libraries and framework includes 202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Target/Process.h" 212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Target/UnixSignals.h" 222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "ProcessMessage.h" 232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenclass ProcessMonitor; 254349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartainclass POSIXThread; 262341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenclass ProcessPOSIX : 282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen public lldb_private::Process 292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenpublic: 312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen //------------------------------------------------------------------ 332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen // Constructors and destructors 342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen //------------------------------------------------------------------ 352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen ProcessPOSIX(lldb_private::Target& target, 362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb_private::Listener &listener); 372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual 392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen ~ProcessPOSIX(); 402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen //------------------------------------------------------------------ 422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen // Process protocol. 432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen //------------------------------------------------------------------ 4485923290360a48aaa2518cf18941673ba4d6deacAndrew Kaylor virtual void 4585923290360a48aaa2518cf18941673ba4d6deacAndrew Kaylor Finalize(); 4685923290360a48aaa2518cf18941673ba4d6deacAndrew Kaylor 472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual bool 482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen CanDebug(lldb_private::Target &target, bool plugin_specified_by_name); 492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb_private::Error 512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen WillLaunch(lldb_private::Module *module); 522341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 532341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb_private::Error 542341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DoAttachToProcessWithID(lldb::pid_t pid); 552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb_private::Error 57c643077dd2048204d78bc8b19629d0a3dca055fdGreg Clayton DoAttachToProcessWithID (lldb::pid_t pid, const lldb_private::ProcessAttachInfo &attach_info); 58c643077dd2048204d78bc8b19629d0a3dca055fdGreg Clayton 59c643077dd2048204d78bc8b19629d0a3dca055fdGreg Clayton virtual lldb_private::Error 602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DoLaunch (lldb_private::Module *exe_module, 612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen const lldb_private::ProcessLaunchInfo &launch_info); 622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual void 642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DidLaunch(); 652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb_private::Error 672341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DoResume(); 682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb_private::Error 702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DoHalt(bool &caused_stop); 712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb_private::Error 73761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham DoDetach(bool keep_stopped); 742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb_private::Error 762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DoSignal(int signal); 772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb_private::Error 792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DoDestroy(); 802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual void 822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen RefreshStateAfterStop(); 832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual bool 852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen IsAlive(); 862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual size_t 882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DoReadMemory(lldb::addr_t vm_addr, 892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen void *buf, 902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen size_t size, 912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb_private::Error &error); 922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual size_t 942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size, 952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb_private::Error &error); 962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb::addr_t 982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DoAllocateMemory(size_t size, uint32_t permissions, 992341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb_private::Error &error); 1002341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1012341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb_private::Error 1022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DoDeallocateMemory(lldb::addr_t ptr); 1032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1044f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec virtual lldb::addr_t 1054f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec ResolveIndirectFunction(const lldb_private::Address *address, lldb_private::Error &error); 1064f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec 1072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual size_t 1082341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetSoftwareBreakpointTrapOpcode(lldb_private::BreakpointSite* bp_site); 1092341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb_private::Error 11152d8dd99f9610d28e8f5bbec0de2efcfdafed026Daniel Malea EnableBreakpointSite(lldb_private::BreakpointSite *bp_site); 1122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb_private::Error 11452d8dd99f9610d28e8f5bbec0de2efcfdafed026Daniel Malea DisableBreakpointSite(lldb_private::BreakpointSite *bp_site); 1152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1163d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec virtual lldb_private::Error 1173d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec EnableWatchpoint(lldb_private::Watchpoint *wp, bool notify = true); 1183d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec 1193d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec virtual lldb_private::Error 1203d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec DisableWatchpoint(lldb_private::Watchpoint *wp, bool notify = true); 1213d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec 1223d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec virtual lldb_private::Error 1233d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec GetWatchpointSupportInfo(uint32_t &num); 1243d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec 1253d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec virtual lldb_private::Error 1263d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec GetWatchpointSupportInfo(uint32_t &num, bool &after); 1273d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec 1282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual uint32_t 1292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen UpdateThreadListIfNeeded(); 1302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 131c8dd570dddf0b73b74db5c1ecb8f18f023f864e7Greg Clayton virtual bool 1322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen UpdateThreadList(lldb_private::ThreadList &old_thread_list, 1332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb_private::ThreadList &new_thread_list) = 0; 1342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb::ByteOrder 1362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetByteOrder() const; 1372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb::addr_t 1392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetImageInfoAddress(); 1402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual size_t 1422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen PutSTDIN(const char *buf, size_t len, lldb_private::Error &error); 1432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen //-------------------------------------------------------------------------- 1452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen // ProcessPOSIX internal API. 1462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Registers the given message with this process. 1482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen void SendMessage(const ProcessMessage &message); 1492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen ProcessMonitor & 1512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetMonitor() { assert(m_monitor); return *m_monitor; } 1522341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1532341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb_private::UnixSignals & 1542341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetUnixSignals(); 1552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen const char * 1572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetFilePath(const lldb_private::ProcessLaunchInfo::FileAction *file_action, 1582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen const char *default_path); 1592341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1603bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor /// Stops all threads in the process. 1613bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor /// The \p stop_tid parameter indicates the thread which initiated the stop. 1623bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor virtual void 1633bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor StopAllThreads(lldb::tid_t stop_tid); 1643bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor 165ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec /// Adds the thread to the list of threads for which we have received the initial stopping signal. 166ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec /// The \p stop_tid paramter indicates the thread which the stop happened for. 167ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec bool 168ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec AddThreadForInitialStopIfNeeded(lldb::tid_t stop_tid); 169ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec 1704349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartain virtual POSIXThread * 1714349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartain CreateNewPOSIXThread(lldb_private::Process &process, lldb::tid_t tid); 1724349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartain 1732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenprotected: 1742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Target byte order. 1752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb::ByteOrder m_byte_order; 1762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Process monitor; 1782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen ProcessMonitor *m_monitor; 1792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// The module we are executing. 1812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb_private::Module *m_module; 1822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Message queue notifying this instance of inferior process state changes. 1842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb_private::Mutex m_message_mutex; 1852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen std::queue<ProcessMessage> m_message_queue; 1862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Drive any exit events to completion. 1882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen bool m_exit_now; 1892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// OS-specific signal set. 1912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb_private::UnixSignals m_signals; 1922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Returns true if the process has exited. 1942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen bool HasExited(); 1952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Returns true if the process is stopped. 1972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen bool IsStopped(); 1982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 199ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec /// Returns true if at least one running is currently running 200ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec bool IsAThreadRunning(); 201ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec 2022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen typedef std::map<lldb::addr_t, lldb::addr_t> MMapMap; 2032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen MMapMap m_addr_to_mmap_size; 204ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec 205ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec typedef std::set<lldb::tid_t> ThreadStopSet; 206ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec /// Every thread begins with a stop signal. This keeps track 207ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec /// of the threads for which we have received the stop signal. 208ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec ThreadStopSet m_seen_initial_stop; 2092341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}; 2102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 2112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#endif // liblldb_MacOSXProcess_H_ 212