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