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