12341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//===-- ProcessPOSIX.cpp ----------------------------------------*- 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
10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h"
11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea
122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// C Includes
132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include <errno.h>
142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// C++ Includes
162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// Other libraries and framework includes
173d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec#include "lldb/Breakpoint/Watchpoint.h"
188ac035dd248b61846cb0cba7c7257dcdd600f749Greg Clayton#include "lldb/Core/Module.h"
192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Core/PluginManager.h"
202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Core/State.h"
211e44fddf7f0c75b275bea0d5a55b4be01240c01aDaniel Malea#include "lldb/Host/FileSpec.h"
222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Host/Host.h"
232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Symbol/ObjectFile.h"
242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Target/DynamicLoader.h"
256c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor#include "lldb/Target/Platform.h"
262341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Target/Target.h"
272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "ProcessPOSIX.h"
292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "ProcessPOSIXLog.h"
302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "Plugins/Process/Utility/InferiorCallPOSIX.h"
312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "ProcessMonitor.h"
322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "POSIXThread.h"
332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenusing namespace lldb;
352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenusing namespace lldb_private;
362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//------------------------------------------------------------------------------
382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// Static functions.
392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#if 0
402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcess*
412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::CreateInstance(Target& target, Listener &listener)
422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return new ProcessPOSIX(target, listener);
442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenvoid
482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::Initialize()
492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    static bool g_initialized = false;
512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
522341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (!g_initialized)
532341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    {
542341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        g_initialized = true;
552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        PluginManager::RegisterPlugin(GetPluginNameStatic(),
562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                                      GetPluginDescriptionStatic(),
572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                                      CreateInstance);
582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
592341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        Log::Callbacks log_callbacks = {
602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            ProcessPOSIXLog::DisableLog,
612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            ProcessPOSIXLog::EnableLog,
622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            ProcessPOSIXLog::ListLogCategories
632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        };
642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        Log::RegisterLogChannel (ProcessPOSIX::GetPluginNameStatic(), log_callbacks);
662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    }
672341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#endif
692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//------------------------------------------------------------------------------
712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// Constructors and destructors.
722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::ProcessPOSIX(Target& target, Listener &listener)
742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    : Process(target, listener),
7578dae82bea7365f3a3501618c5d724a1a11d944fJohnny Chen      m_byte_order(lldb::endian::InlHostByteOrder()),
762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen      m_monitor(NULL),
772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen      m_module(NULL),
783bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor      m_message_mutex (Mutex::eMutexTypeRecursive),
79ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec      m_exit_now(false),
80ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec      m_seen_initial_stop()
812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // FIXME: Putting this code in the ctor and saving the byte order in a
832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // member variable is a hack to avoid const qual issues in GetByteOrder.
8478dae82bea7365f3a3501618c5d724a1a11d944fJohnny Chen	lldb::ModuleSP module = GetTarget().GetExecutableModule();
85a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain	if (module && module->GetObjectFile())
8678dae82bea7365f3a3501618c5d724a1a11d944fJohnny Chen		m_byte_order = module->GetObjectFile()->GetByteOrder();
872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::~ProcessPOSIX()
902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    delete m_monitor;
922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//------------------------------------------------------------------------------
952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// Process protocol.
9685923290360a48aaa2518cf18941673ba4d6deacAndrew Kaylorvoid
9785923290360a48aaa2518cf18941673ba4d6deacAndrew KaylorProcessPOSIX::Finalize()
9885923290360a48aaa2518cf18941673ba4d6deacAndrew Kaylor{
9985923290360a48aaa2518cf18941673ba4d6deacAndrew Kaylor  Process::Finalize();
10085923290360a48aaa2518cf18941673ba4d6deacAndrew Kaylor
10185923290360a48aaa2518cf18941673ba4d6deacAndrew Kaylor  if (m_monitor)
10285923290360a48aaa2518cf18941673ba4d6deacAndrew Kaylor    m_monitor->StopMonitor();
10385923290360a48aaa2518cf18941673ba4d6deacAndrew Kaylor}
1042341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenbool
1062341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::CanDebug(Target &target, bool plugin_specified_by_name)
1072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
1082341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // For now we are just making sure the file exists for a given module
1092341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ModuleSP exe_module_sp(target.GetExecutableModule());
1102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (exe_module_sp.get())
1112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        return exe_module_sp->GetFileSpec().Exists();
1126c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor    // If there is no executable module, we return true since we might be preparing to attach.
1136c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor    return true;
1142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
1152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenError
1172341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::DoAttachToProcessWithID(lldb::pid_t pid)
1182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
1192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    Error error;
1202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    assert(m_monitor == NULL);
1212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
122d8f6b6446d8b9d1568f91f51bc5dd3aae45db5ccAshok Thirumurthi    Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PROCESS));
1232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (log && log->GetMask().Test(POSIX_LOG_VERBOSE))
1245f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        log->Printf ("ProcessPOSIX::%s(pid = %" PRIi64 ")", __FUNCTION__, GetID());
1252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
126e279f1a76b26dd1a154fc0220af7049526e05b61Andrew Kaylor    m_monitor = new ProcessMonitor(this, pid, error);
1272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (!error.Success())
1292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        return error;
1302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1316c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor    PlatformSP platform_sp (m_target.GetPlatform ());
1326c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor    assert (platform_sp.get());
1336c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor    if (!platform_sp)
1346c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor        return error;  // FIXME: Detatch?
1356c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor
1366c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor    // Find out what we can about this process
1376c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor    ProcessInstanceInfo process_info;
1386c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor    platform_sp->GetProcessInfo (pid, process_info);
1396c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor
1406c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor    // Resolve the executable module
1416c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor    ModuleSP exe_module_sp;
1426c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor    FileSpecList executable_search_paths (Target::GetDefaultExecutableSearchPaths());
1436c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor    error = platform_sp->ResolveExecutable(process_info.GetExecutableFile(),
1446c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor                                           m_target.GetArchitecture(),
1456c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor                                           exe_module_sp,
1466c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor                                           executable_search_paths.GetSize() ? &executable_search_paths : NULL);
1474c7dfad58aee0a15a2448225caa788fea052557eEd Maste    if (!error.Success())
1484c7dfad58aee0a15a2448225caa788fea052557eEd Maste        return error;
1496c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor
1506c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor    // Fix the target architecture if necessary
1516c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor    const ArchSpec &module_arch = exe_module_sp->GetArchitecture();
1526c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor    if (module_arch.IsValid() && !m_target.GetArchitecture().IsExactMatch(module_arch))
1536c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor        m_target.SetArchitecture(module_arch);
1546c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor
1556c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor    // Initialize the target module list
1566c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor    m_target.SetExecutableModule (exe_module_sp, true);
1576c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor
1586c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor    SetSTDIOFileDescriptor(m_monitor->GetTerminalFD());
1596c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor
1602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    SetID(pid);
1616c1a8cfbb81ae38aee68f281b2af4010044cc00dAndrew Kaylor
1622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return error;
1632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
1642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenError
166c643077dd2048204d78bc8b19629d0a3dca055fdGreg ClaytonProcessPOSIX::DoAttachToProcessWithID (lldb::pid_t pid,  const ProcessAttachInfo &attach_info)
167c643077dd2048204d78bc8b19629d0a3dca055fdGreg Clayton{
168c643077dd2048204d78bc8b19629d0a3dca055fdGreg Clayton    return DoAttachToProcessWithID(pid);
169c643077dd2048204d78bc8b19629d0a3dca055fdGreg Clayton}
170c643077dd2048204d78bc8b19629d0a3dca055fdGreg Clayton
171c643077dd2048204d78bc8b19629d0a3dca055fdGreg ClaytonError
1722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::WillLaunch(Module* module)
1732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
1742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    Error error;
1752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return error;
1762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
1772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenconst char *
1792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::GetFilePath(
1802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    const lldb_private::ProcessLaunchInfo::FileAction *file_action,
1812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    const char *default_path)
1822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
1832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    const char *pts_name = "/dev/pts/";
1842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    const char *path = NULL;
1852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (file_action)
1872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    {
1882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        if (file_action->GetAction () == ProcessLaunchInfo::FileAction::eFileActionOpen)
1892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            path = file_action->GetPath();
1902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            // By default the stdio paths passed in will be pseudo-terminal
1912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            // (/dev/pts). If so, convert to using a different default path
1922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            // instead to redirect I/O to the debugger console. This should
1932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            //  also handle user overrides to /dev/null or a different file.
1942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            if (::strncmp(path, pts_name, ::strlen(pts_name)) == 0)
1952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                path = default_path;
1962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    }
1972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return path;
1992341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
2002341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2012341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenError
2022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::DoLaunch (Module *module,
2032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                       const ProcessLaunchInfo &launch_info)
2042341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
2052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    Error error;
2062341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    assert(m_monitor == NULL);
2072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2081e44fddf7f0c75b275bea0d5a55b4be01240c01aDaniel Malea    const char* working_dir = launch_info.GetWorkingDirectory();
2091e44fddf7f0c75b275bea0d5a55b4be01240c01aDaniel Malea    if (working_dir) {
2101e44fddf7f0c75b275bea0d5a55b4be01240c01aDaniel Malea      FileSpec WorkingDir(working_dir, true);
2111e44fddf7f0c75b275bea0d5a55b4be01240c01aDaniel Malea      if (!WorkingDir || WorkingDir.GetFileType() != FileSpec::eFileTypeDirectory)
2121e44fddf7f0c75b275bea0d5a55b4be01240c01aDaniel Malea      {
2131e44fddf7f0c75b275bea0d5a55b4be01240c01aDaniel Malea          error.SetErrorStringWithFormat("No such file or directory: %s", working_dir);
2141e44fddf7f0c75b275bea0d5a55b4be01240c01aDaniel Malea          return error;
2151e44fddf7f0c75b275bea0d5a55b4be01240c01aDaniel Malea      }
2161e44fddf7f0c75b275bea0d5a55b4be01240c01aDaniel Malea    }
2171e44fddf7f0c75b275bea0d5a55b4be01240c01aDaniel Malea
2182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    SetPrivateState(eStateLaunching);
2192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    const lldb_private::ProcessLaunchInfo::FileAction *file_action;
2212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // Default of NULL will mean to use existing open file descriptors
2232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    const char *stdin_path = NULL;
2242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    const char *stdout_path = NULL;
2252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    const char *stderr_path = NULL;
2261e44fddf7f0c75b275bea0d5a55b4be01240c01aDaniel Malea
2272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    file_action = launch_info.GetFileActionForFD (STDIN_FILENO);
2282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    stdin_path = GetFilePath(file_action, stdin_path);
2292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    file_action = launch_info.GetFileActionForFD (STDOUT_FILENO);
2312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    stdout_path = GetFilePath(file_action, stdout_path);
2322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    file_action = launch_info.GetFileActionForFD (STDERR_FILENO);
2342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    stderr_path = GetFilePath(file_action, stderr_path);
2352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
236e279f1a76b26dd1a154fc0220af7049526e05b61Andrew Kaylor    m_monitor = new ProcessMonitor (this,
2372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                                    module,
2382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                                    launch_info.GetArguments().GetConstArgumentVector(),
2392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                                    launch_info.GetEnvironmentEntries().GetConstArgumentVector(),
2402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                                    stdin_path,
2412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                                    stdout_path,
2422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                                    stderr_path,
2431e44fddf7f0c75b275bea0d5a55b4be01240c01aDaniel Malea                                    working_dir,
2442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                                    error);
2452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    m_module = module;
2472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (!error.Success())
2492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        return error;
2502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
251a7cd95d428cea6a767badf54c89cfd301d119c31Matt Kopec    SetSTDIOFileDescriptor(m_monitor->GetTerminalFD());
252a7cd95d428cea6a767badf54c89cfd301d119c31Matt Kopec
2532341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    SetID(m_monitor->GetPID());
2542341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return error;
2552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
2562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenvoid
2582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::DidLaunch()
2592341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
2602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
2612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenError
2632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::DoResume()
2642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
2652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    StateType state = GetPrivateState();
2662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
26752b8b7515dd20a56e25589f8a019cc5d89e2f3e9Matt Kopec    assert(state == eStateStopped);
2682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
26952b8b7515dd20a56e25589f8a019cc5d89e2f3e9Matt Kopec    SetPrivateState(eStateRunning);
2702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    bool did_resume = false;
2721455203fc255aa7a9ac85d0e73d9b6dd73415e73Daniel Malea
2731455203fc255aa7a9ac85d0e73d9b6dd73415e73Daniel Malea    Mutex::Locker lock(m_thread_list.GetMutex());
2741455203fc255aa7a9ac85d0e73d9b6dd73415e73Daniel Malea
2752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    uint32_t thread_count = m_thread_list.GetSize(false);
2762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    for (uint32_t i = 0; i < thread_count; ++i)
2772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    {
2782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        POSIXThread *thread = static_cast<POSIXThread*>(
2792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            m_thread_list.GetThreadAtIndex(i, false).get());
2802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        did_resume = thread->Resume() || did_resume;
2812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    }
2822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    assert(did_resume && "Process resume failed!");
2832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return Error();
2852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
2862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenaddr_t
2882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::GetImageInfoAddress()
2892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
2902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    Target *target = &GetTarget();
2912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ObjectFile *obj_file = target->GetExecutableModule()->GetObjectFile();
2922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    Address addr = obj_file->GetImageInfoAddress();
2932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (addr.IsValid())
2952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        return addr.GetLoadAddress(target);
2962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    else
2972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        return LLDB_INVALID_ADDRESS;
2982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
2992341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
3002341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenError
3012341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::DoHalt(bool &caused_stop)
3022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
3032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    Error error;
3042341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
3052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (IsStopped())
3062341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    {
3072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        caused_stop = false;
3082341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    }
3092341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    else if (kill(GetID(), SIGSTOP))
3102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    {
3112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        caused_stop = false;
3122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        error.SetErrorToErrno();
3132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    }
3142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    else
3152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    {
3162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        caused_stop = true;
3172341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    }
3182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return error;
3192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
3202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
3212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenError
322761afb822b18c46b2ad84be03f372e90ac1e6143Jim InghamProcessPOSIX::DoDetach(bool keep_stopped)
3232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
3242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    Error error;
325761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham    if (keep_stopped)
326761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham    {
32745158a8974d3c938ac3ad087d569fc49c541acd0Ed Maste        // FIXME: If you want to implement keep_stopped,
328761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham        // this would be the place to do it.
32945158a8974d3c938ac3ad087d569fc49c541acd0Ed Maste        error.SetErrorString("Detaching with keep_stopped true is not currently supported on this platform.");
330761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham        return error;
331761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham    }
3322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
3331455203fc255aa7a9ac85d0e73d9b6dd73415e73Daniel Malea    Mutex::Locker lock(m_thread_list.GetMutex());
3341455203fc255aa7a9ac85d0e73d9b6dd73415e73Daniel Malea
335c350e13fd3351613345141bee7d8b2543df54636Matt Kopec    uint32_t thread_count = m_thread_list.GetSize(false);
336c350e13fd3351613345141bee7d8b2543df54636Matt Kopec    for (uint32_t i = 0; i < thread_count; ++i)
337c350e13fd3351613345141bee7d8b2543df54636Matt Kopec    {
338c350e13fd3351613345141bee7d8b2543df54636Matt Kopec        POSIXThread *thread = static_cast<POSIXThread*>(
339c350e13fd3351613345141bee7d8b2543df54636Matt Kopec            m_thread_list.GetThreadAtIndex(i, false).get());
340c350e13fd3351613345141bee7d8b2543df54636Matt Kopec        error = m_monitor->Detach(thread->GetID());
341c350e13fd3351613345141bee7d8b2543df54636Matt Kopec    }
342c350e13fd3351613345141bee7d8b2543df54636Matt Kopec
3432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (error.Success())
3442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        SetPrivateState(eStateDetached);
3452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
3462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return error;
3472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
3482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
3492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenError
3502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::DoSignal(int signal)
3512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
3522341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    Error error;
3532341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
3542341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (kill(GetID(), signal))
3552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        error.SetErrorToErrno();
3562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
3572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return error;
3582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
3592341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
3602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenError
3612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::DoDestroy()
3622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
3632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    Error error;
3642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
3652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (!HasExited())
3662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    {
3672341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        // Drive the exit event to completion (do not keep the inferior in
3682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        // limbo).
3692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        m_exit_now = true;
3702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
371972c438c9f3c5f77e51f3a46088cd6d2372f87adGreg Clayton        if ((m_monitor == NULL || kill(m_monitor->GetPID(), SIGKILL)) && error.Success())
3722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        {
3732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            error.SetErrorToErrno();
3742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            return error;
3752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        }
3762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
3772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        SetPrivateState(eStateExited);
3782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    }
3792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
3802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return error;
3812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
3822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
3832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenvoid
3842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::SendMessage(const ProcessMessage &message)
3852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
3862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    Mutex::Locker lock(m_message_mutex);
3872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
3881455203fc255aa7a9ac85d0e73d9b6dd73415e73Daniel Malea    Mutex::Locker thread_lock(m_thread_list.GetMutex());
3891455203fc255aa7a9ac85d0e73d9b6dd73415e73Daniel Malea
3903bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    POSIXThread *thread = static_cast<POSIXThread*>(
3913bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        m_thread_list.FindThreadByID(message.GetTID(), false).get());
3923bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor
3932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    switch (message.GetKind())
3942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    {
3952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case ProcessMessage::eInvalidMessage:
3962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        return;
3972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
3982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case ProcessMessage::eLimboMessage:
3993bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        assert(thread);
4003bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        thread->SetState(eStateStopped);
4013bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        if (message.GetTID() == GetID())
4022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        {
4033bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor            m_exit_status = message.GetExitStatus();
4043bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor            if (m_exit_now)
4053bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor            {
4063bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor                SetPrivateState(eStateExited);
407c350e13fd3351613345141bee7d8b2543df54636Matt Kopec                m_monitor->Detach(GetID());
4083bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor            }
4093bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor            else
4103bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor            {
4113bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor                StopAllThreads(message.GetTID());
4123bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor                SetPrivateState(eStateStopped);
4133bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor            }
4142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        }
4152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        else
4163bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        {
4173bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor            StopAllThreads(message.GetTID());
4182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            SetPrivateState(eStateStopped);
4193bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        }
4202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        break;
4212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
4222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case ProcessMessage::eExitMessage:
4233bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        assert(thread);
4243bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        thread->SetState(eStateExited);
4253bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        // FIXME: I'm not sure we need to do this.
4263bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        if (message.GetTID() == GetID())
4273bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        {
4283bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor            m_exit_status = message.GetExitStatus();
4293bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor            SetExitStatus(m_exit_status, NULL);
4303bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        }
431ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec        else if (!IsAThreadRunning())
432ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec            SetPrivateState(eStateStopped);
4332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        break;
4342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
4353bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        assert(thread);
4363bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        thread->SetState(eStateStopped);
4373bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        StopAllThreads(message.GetTID());
4382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        SetPrivateState(eStateStopped);
4392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        break;
4402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
4412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case ProcessMessage::eSignalMessage:
4422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case ProcessMessage::eSignalDeliveredMessage:
443ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec        if (message.GetSignal() == SIGSTOP &&
444ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec            AddThreadForInitialStopIfNeeded(message.GetTID()))
445f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec            return;
446ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec        // Intentional fall-through
4472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
448ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec    case ProcessMessage::eBreakpointMessage:
449ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec    case ProcessMessage::eTraceMessage:
450ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec    case ProcessMessage::eWatchpointMessage:
451ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec    case ProcessMessage::eNewThreadMessage:
452ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec    case ProcessMessage::eCrashMessage:
453ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec        assert(thread);
454ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec        thread->SetState(eStateStopped);
455ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec        StopAllThreads(message.GetTID());
456ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec        SetPrivateState(eStateStopped);
457ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec        break;
4582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    }
4592341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
4602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    m_message_queue.push(message);
4612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
4622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
4633bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylorvoid
4643bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew KaylorProcessPOSIX::StopAllThreads(lldb::tid_t stop_tid)
4653bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor{
4663bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    // FIXME: Will this work the same way on FreeBSD and Linux?
4673bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor}
4683bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor
469ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopecbool
470ff3536bf16cf4abda02a69353db94137ee31819fMatt KopecProcessPOSIX::AddThreadForInitialStopIfNeeded(lldb::tid_t stop_tid)
471ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec{
472ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec    bool added_to_set = false;
473ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec    ThreadStopSet::iterator it = m_seen_initial_stop.find(stop_tid);
474ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec    if (it == m_seen_initial_stop.end())
475ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec    {
476ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec        m_seen_initial_stop.insert(stop_tid);
477ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec        added_to_set = true;
478ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec    }
479ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec    return added_to_set;
480ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec}
481ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec
4824349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael SartainPOSIXThread *
4834349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael SartainProcessPOSIX::CreateNewPOSIXThread(lldb_private::Process &process, lldb::tid_t tid)
4844349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartain{
4854349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartain    return new POSIXThread(process, tid);
4864349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartain}
4874349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartain
4882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenvoid
4892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::RefreshStateAfterStop()
4902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
491d8f6b6446d8b9d1568f91f51bc5dd3aae45db5ccAshok Thirumurthi    Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PROCESS));
4922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (log && log->GetMask().Test(POSIX_LOG_VERBOSE))
4933bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        log->Printf ("ProcessPOSIX::%s(), message_queue size = %d", __FUNCTION__, (int)m_message_queue.size());
4942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
4952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    Mutex::Locker lock(m_message_mutex);
4962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
4973bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    // This method used to only handle one message.  Changing it to loop allows
4983bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    // it to handle the case where we hit a breakpoint while handling a different
4993bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    // breakpoint.
5003bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    while (!m_message_queue.empty())
5013bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    {
5023bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        ProcessMessage &message = m_message_queue.front();
5032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
5043bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        // Resolve the thread this message corresponds to and pass it along.
5053bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        lldb::tid_t tid = message.GetTID();
5063bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        if (log)
5073bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor            log->Printf ("ProcessPOSIX::%s(), message_queue size = %d, pid = %" PRIi64, __FUNCTION__, (int)m_message_queue.size(), tid);
5083bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        POSIXThread *thread = static_cast<POSIXThread*>(
5093bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor            GetThreadList().FindThreadByID(tid, false).get());
5102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
5113bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        if (message.GetKind() == ProcessMessage::eNewThreadMessage)
5123bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        {
5133bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor            if (log)
5143bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor                log->Printf ("ProcessPOSIX::%s() adding thread, tid = %" PRIi64, __FUNCTION__, message.GetChildTID());
5150ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec            lldb::tid_t child_tid = message.GetChildTID();
5163bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor            ThreadSP thread_sp;
5174349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartain            thread_sp.reset(CreateNewPOSIXThread(*this, child_tid));
5180ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec
5191455203fc255aa7a9ac85d0e73d9b6dd73415e73Daniel Malea            Mutex::Locker lock(m_thread_list.GetMutex());
5201455203fc255aa7a9ac85d0e73d9b6dd73415e73Daniel Malea
5213bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor            m_thread_list.AddThread(thread_sp);
5223bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        }
5233bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor
5243bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        m_thread_list.RefreshStateAfterStop();
525f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec
5263bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        if (thread)
5273bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor            thread->Notify(message);
5282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
5293bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        if (message.GetKind() == ProcessMessage::eExitMessage)
5303bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        {
5313bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor            // FIXME: We should tell the user about this, but the limbo message is probably better for that.
5323bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor            if (log)
5333bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor                log->Printf ("ProcessPOSIX::%s() removing thread, tid = %" PRIi64, __FUNCTION__, tid);
5341455203fc255aa7a9ac85d0e73d9b6dd73415e73Daniel Malea
5351455203fc255aa7a9ac85d0e73d9b6dd73415e73Daniel Malea            Mutex::Locker lock(m_thread_list.GetMutex());
5361455203fc255aa7a9ac85d0e73d9b6dd73415e73Daniel Malea
5373bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor            ThreadSP thread_sp = m_thread_list.RemoveThreadByID(tid, false);
5383bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor            thread_sp.reset();
539ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec            m_seen_initial_stop.erase(tid);
5403bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        }
5413bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor
5423bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        m_message_queue.pop();
5433bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    }
5442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
5452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
5462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenbool
5472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::IsAlive()
5482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
5492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    StateType state = GetPrivateState();
5500247cf5dde28bd9588e0e8daa27a2c9f95c408fbDaniel Malea    return state != eStateDetached
5510247cf5dde28bd9588e0e8daa27a2c9f95c408fbDaniel Malea        && state != eStateExited
5520247cf5dde28bd9588e0e8daa27a2c9f95c408fbDaniel Malea        && state != eStateInvalid
5530247cf5dde28bd9588e0e8daa27a2c9f95c408fbDaniel Malea        && state != eStateUnloaded;
5542341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
5552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
5562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chensize_t
5572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::DoReadMemory(addr_t vm_addr,
5582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                           void *buf, size_t size, Error &error)
5592341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
5602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    assert(m_monitor);
5612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return m_monitor->ReadMemory(vm_addr, buf, size, error);
5622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
5632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
5642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chensize_t
5652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::DoWriteMemory(addr_t vm_addr, const void *buf, size_t size,
5662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                            Error &error)
5672341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
5682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    assert(m_monitor);
5692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return m_monitor->WriteMemory(vm_addr, buf, size, error);
5702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
5712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
5722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenaddr_t
5732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::DoAllocateMemory(size_t size, uint32_t permissions,
5742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                               Error &error)
5752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
5762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    addr_t allocated_addr = LLDB_INVALID_ADDRESS;
5772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
5782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    unsigned prot = 0;
5792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (permissions & lldb::ePermissionsReadable)
5802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        prot |= eMmapProtRead;
5812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (permissions & lldb::ePermissionsWritable)
5822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        prot |= eMmapProtWrite;
5832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (permissions & lldb::ePermissionsExecutable)
5842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        prot |= eMmapProtExec;
5852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
5862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (InferiorCallMmap(this, allocated_addr, 0, size, prot,
5872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen                         eMmapFlagsAnon | eMmapFlagsPrivate, -1, 0)) {
5882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        m_addr_to_mmap_size[allocated_addr] = size;
5892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        error.Clear();
5902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    } else {
5912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        allocated_addr = LLDB_INVALID_ADDRESS;
5922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        error.SetErrorStringWithFormat("unable to allocate %zu bytes of memory with permissions %s", size, GetPermissionsAsCString (permissions));
5932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    }
5942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
5952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return allocated_addr;
5962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
5972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
5982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenError
5992341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::DoDeallocateMemory(lldb::addr_t addr)
6002341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
6012341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    Error error;
6022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    MMapMap::iterator pos = m_addr_to_mmap_size.find(addr);
6032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (pos != m_addr_to_mmap_size.end() &&
6042341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        InferiorCallMunmap(this, addr, pos->second))
6052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        m_addr_to_mmap_size.erase (pos);
6062341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    else
6075f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        error.SetErrorStringWithFormat("unable to deallocate memory at 0x%" PRIx64, addr);
6082341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
6092341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return error;
6102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
6112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
6124f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopecaddr_t
6134f9103faba72fdfc4b4299d6d459bc820ee597b2Matt KopecProcessPOSIX::ResolveIndirectFunction(const Address *address, Error &error)
6144f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec{
6154f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec    addr_t function_addr = LLDB_INVALID_ADDRESS;
6164f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec    if (address == NULL) {
6174f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec        error.SetErrorStringWithFormat("unable to determine direct function call for NULL address");
6184f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec    } else if (!InferiorCall(this, address, function_addr)) {
6194f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec        function_addr = LLDB_INVALID_ADDRESS;
6207012548b5056aeb1c0cd0a25fd93470544287151Matt Kopec        error.SetErrorStringWithFormat("unable to determine direct function call for indirect function %s",
6217012548b5056aeb1c0cd0a25fd93470544287151Matt Kopec                                       address->CalculateSymbolContextSymbol()->GetName().AsCString());
6224f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec    }
6234f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec    return function_addr;
6244f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec}
6254f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec
6262341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chensize_t
6272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::GetSoftwareBreakpointTrapOpcode(BreakpointSite* bp_site)
6282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
6292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    static const uint8_t g_i386_opcode[] = { 0xCC };
6302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
6312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ArchSpec arch = GetTarget().GetArchitecture();
6322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    const uint8_t *opcode = NULL;
6332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    size_t opcode_size = 0;
6342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
6352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    switch (arch.GetCore())
6362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    {
6372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    default:
6382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        assert(false && "CPU type not supported!");
6392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        break;
6402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
6412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case ArchSpec::eCore_x86_32_i386:
6422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case ArchSpec::eCore_x86_64_x86_64:
6432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        opcode = g_i386_opcode;
6442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        opcode_size = sizeof(g_i386_opcode);
6452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        break;
6462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    }
6472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
6482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    bp_site->SetTrapOpcode(opcode, opcode_size);
6492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return opcode_size;
6502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
6512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
6522341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenError
65352d8dd99f9610d28e8f5bbec0de2efcfdafed026Daniel MaleaProcessPOSIX::EnableBreakpointSite(BreakpointSite *bp_site)
6542341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
6552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return EnableSoftwareBreakpoint(bp_site);
6562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
6572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
6582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenError
65952d8dd99f9610d28e8f5bbec0de2efcfdafed026Daniel MaleaProcessPOSIX::DisableBreakpointSite(BreakpointSite *bp_site)
6602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
6612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return DisableSoftwareBreakpoint(bp_site);
6622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
6632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
6643d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt KopecError
6653d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt KopecProcessPOSIX::EnableWatchpoint(Watchpoint *wp, bool notify)
6663d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec{
6673d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    Error error;
6683d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    if (wp)
6693d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    {
6703d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        user_id_t watchID = wp->GetID();
6713d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        addr_t addr = wp->GetLoadAddress();
6723d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_WATCHPOINTS));
6733d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        if (log)
6743d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec            log->Printf ("ProcessPOSIX::EnableWatchpoint(watchID = %" PRIu64 ")",
6753d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec                         watchID);
6763d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        if (wp->IsEnabled())
6773d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        {
6783d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec            if (log)
6793d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec                log->Printf("ProcessPOSIX::EnableWatchpoint(watchID = %" PRIu64
6803d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec                            ") addr = 0x%8.8" PRIx64 ": watchpoint already enabled.",
6813d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec                            watchID, (uint64_t)addr);
6823d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec            return error;
6833d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        }
6843d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
68512c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec        // Try to find a vacant watchpoint slot in the inferiors' main thread
68612c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec        uint32_t wp_hw_index = LLDB_INVALID_INDEX32;
6871455203fc255aa7a9ac85d0e73d9b6dd73415e73Daniel Malea        Mutex::Locker lock(m_thread_list.GetMutex());
68812c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec        POSIXThread *thread = static_cast<POSIXThread*>(
68912c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec                               m_thread_list.GetThreadAtIndex(0, false).get());
69012c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec
69112c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec        if (thread)
69212c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec            wp_hw_index = thread->FindVacantWatchpointIndex();
69312c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec
69412c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec        if (wp_hw_index == LLDB_INVALID_INDEX32)
6953d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        {
69612c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec            error.SetErrorString("Setting hardware watchpoint failed.");
6973d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        }
6983d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        else
6993d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        {
70012c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec            wp->SetHardwareIndex(wp_hw_index);
70112c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec            bool wp_enabled = true;
70212c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec            uint32_t thread_count = m_thread_list.GetSize(false);
70312c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec            for (uint32_t i = 0; i < thread_count; ++i)
70412c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec            {
70512c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec                thread = static_cast<POSIXThread*>(
70612c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec                         m_thread_list.GetThreadAtIndex(i, false).get());
70712c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec                if (thread)
70812c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec                    wp_enabled &= thread->EnableHardwareWatchpoint(wp);
70912c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec                else
71012c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec                    wp_enabled = false;
71112c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec            }
71212c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec            if (wp_enabled)
71312c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec            {
71412c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec                wp->SetEnabled(true, notify);
71512c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec                return error;
71612c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec            }
71712c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec            else
71812c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec            {
71912c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec                // Watchpoint enabling failed on at least one
72012c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec                // of the threads so roll back all of them
72112c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec                DisableWatchpoint(wp, false);
72212c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec                error.SetErrorString("Setting hardware watchpoint failed");
72312c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec            }
7243d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        }
7253d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    }
7263d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    else
7273d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        error.SetErrorString("Watchpoint argument was NULL.");
7283d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    return error;
7293d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec}
7303d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
7313d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt KopecError
7323d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt KopecProcessPOSIX::DisableWatchpoint(Watchpoint *wp, bool notify)
7333d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec{
7343d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    Error error;
7353d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    if (wp)
7363d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    {
7373d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        user_id_t watchID = wp->GetID();
7383d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        addr_t addr = wp->GetLoadAddress();
7393d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_WATCHPOINTS));
7403d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        if (log)
7413d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec            log->Printf("ProcessPOSIX::DisableWatchpoint(watchID = %" PRIu64 ")",
7423d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec                        watchID);
7433d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        if (!wp->IsEnabled())
7443d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        {
7453d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec            if (log)
7463d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec                log->Printf("ProcessPOSIX::DisableWatchpoint(watchID = %" PRIu64
7473d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec                            ") addr = 0x%8.8" PRIx64 ": watchpoint already disabled.",
7483d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec                            watchID, (uint64_t)addr);
7493d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec            // This is needed (for now) to keep watchpoints disabled correctly
7503d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec            wp->SetEnabled(false, notify);
7513d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec            return error;
7523d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        }
7533d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
7543d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        if (wp->IsHardware())
7553d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        {
7563d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec            bool wp_disabled = true;
7571455203fc255aa7a9ac85d0e73d9b6dd73415e73Daniel Malea            Mutex::Locker lock(m_thread_list.GetMutex());
7583d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec            uint32_t thread_count = m_thread_list.GetSize(false);
7593d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec            for (uint32_t i = 0; i < thread_count; ++i)
7603d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec            {
7613d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec                POSIXThread *thread = static_cast<POSIXThread*>(
7623d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec                                      m_thread_list.GetThreadAtIndex(i, false).get());
7633d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec                if (thread)
7643d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec                    wp_disabled &= thread->DisableHardwareWatchpoint(wp);
7653d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec                else
7663d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec                    wp_disabled = false;
7673d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec            }
7683d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec            if (wp_disabled)
7693d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec            {
77012c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec                wp->SetHardwareIndex(LLDB_INVALID_INDEX32);
7713d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec                wp->SetEnabled(false, notify);
7723d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec                return error;
7733d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec            }
7743d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec            else
7753d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec                error.SetErrorString("Disabling hardware watchpoint failed");
7763d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        }
7773d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    }
7783d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    else
7793d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        error.SetErrorString("Watchpoint argument was NULL.");
7803d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    return error;
7813d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec}
7823d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
7833d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt KopecError
7843d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt KopecProcessPOSIX::GetWatchpointSupportInfo(uint32_t &num)
7853d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec{
7863d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    Error error;
7871455203fc255aa7a9ac85d0e73d9b6dd73415e73Daniel Malea    Mutex::Locker lock(m_thread_list.GetMutex());
7883d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    POSIXThread *thread = static_cast<POSIXThread*>(
7893d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec                          m_thread_list.GetThreadAtIndex(0, false).get());
7903d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    if (thread)
7913d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        num = thread->NumSupportedHardwareWatchpoints();
7923d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    else
7933d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        error.SetErrorString("Process does not exist.");
7943d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    return error;
7953d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec}
7963d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
7973d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt KopecError
7983d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt KopecProcessPOSIX::GetWatchpointSupportInfo(uint32_t &num, bool &after)
7993d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec{
8003d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    Error error = GetWatchpointSupportInfo(num);
8013d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    // Watchpoints trigger and halt the inferior after
8023d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    // the corresponding instruction has been executed.
8033d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    after = true;
8043d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    return error;
8053d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec}
8063d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
8072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenuint32_t
8082341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::UpdateThreadListIfNeeded()
8092341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
8101455203fc255aa7a9ac85d0e73d9b6dd73415e73Daniel Malea    Mutex::Locker lock(m_thread_list.GetMutex());
8112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // Do not allow recursive updates.
8122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return m_thread_list.GetSize(false);
8132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
8142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
815c8dd570dddf0b73b74db5c1ecb8f18f023f864e7Greg Claytonbool
8162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::UpdateThreadList(ThreadList &old_thread_list, ThreadList &new_thread_list)
8172341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
818d8f6b6446d8b9d1568f91f51bc5dd3aae45db5ccAshok Thirumurthi    Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD));
8192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (log && log->GetMask().Test(POSIX_LOG_VERBOSE))
8205f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        log->Printf ("ProcessPOSIX::%s() (pid = %" PRIi64 ")", __FUNCTION__, GetID());
8212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
8222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // Update the process thread list with this new thread.
8232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // FIXME: We should be using tid, not pid.
8242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    assert(m_monitor);
8252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ThreadSP thread_sp (old_thread_list.FindThreadByID (GetID(), false));
826e5eaa30f62c697d649966c86acd4e3c52b39b355Greg Clayton    if (!thread_sp) {
8274349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartain        thread_sp.reset(CreateNewPOSIXThread(*this, GetID()));
828e5eaa30f62c697d649966c86acd4e3c52b39b355Greg Clayton    }
8292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
8302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (log && log->GetMask().Test(POSIX_LOG_VERBOSE))
8315f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        log->Printf ("ProcessPOSIX::%s() updated pid = %" PRIi64, __FUNCTION__, GetID());
8322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    new_thread_list.AddThread(thread_sp);
8332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
834c8dd570dddf0b73b74db5c1ecb8f18f023f864e7Greg Clayton    return new_thread_list.GetSize(false) > 0;
8352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
8362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
8372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenByteOrder
8382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::GetByteOrder() const
8392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
8402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // FIXME: We should be able to extract this value directly.  See comment in
8412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // ProcessPOSIX().
8422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return m_byte_order;
8432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
8442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
8452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chensize_t
8462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::PutSTDIN(const char *buf, size_t len, Error &error)
8472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
8482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ssize_t status;
8492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if ((status = write(m_monitor->GetTerminalFD(), buf, len)) < 0)
8502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    {
8512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        error.SetErrorToErrno();
8522341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        return 0;
8532341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    }
8542341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return status;
8552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
8562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
8572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenUnixSignals &
8582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::GetUnixSignals()
8592341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
8602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return m_signals;
8612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
8622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
8632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//------------------------------------------------------------------------------
8642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// Utility functions.
8652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
8662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenbool
8672341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::HasExited()
8682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
8692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    switch (GetPrivateState())
8702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    {
8712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    default:
8722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        break;
8732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
8742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case eStateDetached:
8752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case eStateExited:
8762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        return true;
8772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    }
8782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
8792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return false;
8802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
8812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
8822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenbool
8832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessPOSIX::IsStopped()
8842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
8852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    switch (GetPrivateState())
8862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    {
8872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    default:
8882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        break;
8892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
8902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case eStateStopped:
8912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case eStateCrashed:
8922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case eStateSuspended:
8932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        return true;
8942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    }
8952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
8962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return false;
8972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
898ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec
899ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopecbool
900ff3536bf16cf4abda02a69353db94137ee31819fMatt KopecProcessPOSIX::IsAThreadRunning()
901ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec{
902ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec    bool is_running = false;
9031455203fc255aa7a9ac85d0e73d9b6dd73415e73Daniel Malea    Mutex::Locker lock(m_thread_list.GetMutex());
904ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec    uint32_t thread_count = m_thread_list.GetSize(false);
905ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec    for (uint32_t i = 0; i < thread_count; ++i)
906ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec    {
907ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec        POSIXThread *thread = static_cast<POSIXThread*>(
908ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec            m_thread_list.GetThreadAtIndex(i, false).get());
909ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec        StateType thread_state = thread->GetState();
910ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec        if (thread_state == eStateRunning || thread_state == eStateStepping)
911ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec        {
912ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec            is_running = true;
913ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec            break;
914ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec        }
915ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec    }
916ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec    return is_running;
917ff3536bf16cf4abda02a69353db94137ee31819fMatt Kopec}
918