Home | History | Annotate | Download | only in POSIX
      1 //===-- ProcessPOSIX.cpp ----------------------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "lldb/lldb-python.h"
     11 
     12 // C Includes
     13 #include <errno.h>
     14 
     15 // C++ Includes
     16 // Other libraries and framework includes
     17 #include "lldb/Breakpoint/Watchpoint.h"
     18 #include "lldb/Core/Module.h"
     19 #include "lldb/Core/PluginManager.h"
     20 #include "lldb/Core/State.h"
     21 #include "lldb/Host/FileSpec.h"
     22 #include "lldb/Host/Host.h"
     23 #include "lldb/Symbol/ObjectFile.h"
     24 #include "lldb/Target/DynamicLoader.h"
     25 #include "lldb/Target/Platform.h"
     26 #include "lldb/Target/Target.h"
     27 
     28 #include "ProcessPOSIX.h"
     29 #include "ProcessPOSIXLog.h"
     30 #include "Plugins/Process/Utility/InferiorCallPOSIX.h"
     31 #include "ProcessMonitor.h"
     32 #include "POSIXThread.h"
     33 
     34 using namespace lldb;
     35 using namespace lldb_private;
     36 
     37 //------------------------------------------------------------------------------
     38 // Static functions.
     39 #if 0
     40 Process*
     41 ProcessPOSIX::CreateInstance(Target& target, Listener &listener)
     42 {
     43     return new ProcessPOSIX(target, listener);
     44 }
     45 
     46 
     47 void
     48 ProcessPOSIX::Initialize()
     49 {
     50     static bool g_initialized = false;
     51 
     52     if (!g_initialized)
     53     {
     54         g_initialized = true;
     55         PluginManager::RegisterPlugin(GetPluginNameStatic(),
     56                                       GetPluginDescriptionStatic(),
     57                                       CreateInstance);
     58 
     59         Log::Callbacks log_callbacks = {
     60             ProcessPOSIXLog::DisableLog,
     61             ProcessPOSIXLog::EnableLog,
     62             ProcessPOSIXLog::ListLogCategories
     63         };
     64 
     65         Log::RegisterLogChannel (ProcessPOSIX::GetPluginNameStatic(), log_callbacks);
     66     }
     67 }
     68 #endif
     69 
     70 //------------------------------------------------------------------------------
     71 // Constructors and destructors.
     72 
     73 ProcessPOSIX::ProcessPOSIX(Target& target, Listener &listener)
     74     : Process(target, listener),
     75       m_byte_order(lldb::endian::InlHostByteOrder()),
     76       m_monitor(NULL),
     77       m_module(NULL),
     78       m_message_mutex (Mutex::eMutexTypeRecursive),
     79       m_exit_now(false),
     80       m_seen_initial_stop()
     81 {
     82     // FIXME: Putting this code in the ctor and saving the byte order in a
     83     // member variable is a hack to avoid const qual issues in GetByteOrder.
     84 	lldb::ModuleSP module = GetTarget().GetExecutableModule();
     85 	if (module && module->GetObjectFile())
     86 		m_byte_order = module->GetObjectFile()->GetByteOrder();
     87 }
     88 
     89 ProcessPOSIX::~ProcessPOSIX()
     90 {
     91     delete m_monitor;
     92 }
     93 
     94 //------------------------------------------------------------------------------
     95 // Process protocol.
     96 void
     97 ProcessPOSIX::Finalize()
     98 {
     99   Process::Finalize();
    100 
    101   if (m_monitor)
    102     m_monitor->StopMonitor();
    103 }
    104 
    105 bool
    106 ProcessPOSIX::CanDebug(Target &target, bool plugin_specified_by_name)
    107 {
    108     // For now we are just making sure the file exists for a given module
    109     ModuleSP exe_module_sp(target.GetExecutableModule());
    110     if (exe_module_sp.get())
    111         return exe_module_sp->GetFileSpec().Exists();
    112     // If there is no executable module, we return true since we might be preparing to attach.
    113     return true;
    114 }
    115 
    116 Error
    117 ProcessPOSIX::DoAttachToProcessWithID(lldb::pid_t pid)
    118 {
    119     Error error;
    120     assert(m_monitor == NULL);
    121 
    122     Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PROCESS));
    123     if (log && log->GetMask().Test(POSIX_LOG_VERBOSE))
    124         log->Printf ("ProcessPOSIX::%s(pid = %" PRIi64 ")", __FUNCTION__, GetID());
    125 
    126     m_monitor = new ProcessMonitor(this, pid, error);
    127 
    128     if (!error.Success())
    129         return error;
    130 
    131     PlatformSP platform_sp (m_target.GetPlatform ());
    132     assert (platform_sp.get());
    133     if (!platform_sp)
    134         return error;  // FIXME: Detatch?
    135 
    136     // Find out what we can about this process
    137     ProcessInstanceInfo process_info;
    138     platform_sp->GetProcessInfo (pid, process_info);
    139 
    140     // Resolve the executable module
    141     ModuleSP exe_module_sp;
    142     FileSpecList executable_search_paths (Target::GetDefaultExecutableSearchPaths());
    143     error = platform_sp->ResolveExecutable(process_info.GetExecutableFile(),
    144                                            m_target.GetArchitecture(),
    145                                            exe_module_sp,
    146                                            executable_search_paths.GetSize() ? &executable_search_paths : NULL);
    147     if (!error.Success())
    148         return error;
    149 
    150     // Fix the target architecture if necessary
    151     const ArchSpec &module_arch = exe_module_sp->GetArchitecture();
    152     if (module_arch.IsValid() && !m_target.GetArchitecture().IsExactMatch(module_arch))
    153         m_target.SetArchitecture(module_arch);
    154 
    155     // Initialize the target module list
    156     m_target.SetExecutableModule (exe_module_sp, true);
    157 
    158     SetSTDIOFileDescriptor(m_monitor->GetTerminalFD());
    159 
    160     SetID(pid);
    161 
    162     return error;
    163 }
    164 
    165 Error
    166 ProcessPOSIX::DoAttachToProcessWithID (lldb::pid_t pid,  const ProcessAttachInfo &attach_info)
    167 {
    168     return DoAttachToProcessWithID(pid);
    169 }
    170 
    171 Error
    172 ProcessPOSIX::WillLaunch(Module* module)
    173 {
    174     Error error;
    175     return error;
    176 }
    177 
    178 const char *
    179 ProcessPOSIX::GetFilePath(
    180     const lldb_private::ProcessLaunchInfo::FileAction *file_action,
    181     const char *default_path)
    182 {
    183     const char *pts_name = "/dev/pts/";
    184     const char *path = NULL;
    185 
    186     if (file_action)
    187     {
    188         if (file_action->GetAction () == ProcessLaunchInfo::FileAction::eFileActionOpen)
    189             path = file_action->GetPath();
    190             // By default the stdio paths passed in will be pseudo-terminal
    191             // (/dev/pts). If so, convert to using a different default path
    192             // instead to redirect I/O to the debugger console. This should
    193             //  also handle user overrides to /dev/null or a different file.
    194             if (::strncmp(path, pts_name, ::strlen(pts_name)) == 0)
    195                 path = default_path;
    196     }
    197 
    198     return path;
    199 }
    200 
    201 Error
    202 ProcessPOSIX::DoLaunch (Module *module,
    203                        const ProcessLaunchInfo &launch_info)
    204 {
    205     Error error;
    206     assert(m_monitor == NULL);
    207 
    208     const char* working_dir = launch_info.GetWorkingDirectory();
    209     if (working_dir) {
    210       FileSpec WorkingDir(working_dir, true);
    211       if (!WorkingDir || WorkingDir.GetFileType() != FileSpec::eFileTypeDirectory)
    212       {
    213           error.SetErrorStringWithFormat("No such file or directory: %s", working_dir);
    214           return error;
    215       }
    216     }
    217 
    218     SetPrivateState(eStateLaunching);
    219 
    220     const lldb_private::ProcessLaunchInfo::FileAction *file_action;
    221 
    222     // Default of NULL will mean to use existing open file descriptors
    223     const char *stdin_path = NULL;
    224     const char *stdout_path = NULL;
    225     const char *stderr_path = NULL;
    226 
    227     file_action = launch_info.GetFileActionForFD (STDIN_FILENO);
    228     stdin_path = GetFilePath(file_action, stdin_path);
    229 
    230     file_action = launch_info.GetFileActionForFD (STDOUT_FILENO);
    231     stdout_path = GetFilePath(file_action, stdout_path);
    232 
    233     file_action = launch_info.GetFileActionForFD (STDERR_FILENO);
    234     stderr_path = GetFilePath(file_action, stderr_path);
    235 
    236     m_monitor = new ProcessMonitor (this,
    237                                     module,
    238                                     launch_info.GetArguments().GetConstArgumentVector(),
    239                                     launch_info.GetEnvironmentEntries().GetConstArgumentVector(),
    240                                     stdin_path,
    241                                     stdout_path,
    242                                     stderr_path,
    243                                     working_dir,
    244                                     error);
    245 
    246     m_module = module;
    247 
    248     if (!error.Success())
    249         return error;
    250 
    251     SetSTDIOFileDescriptor(m_monitor->GetTerminalFD());
    252 
    253     SetID(m_monitor->GetPID());
    254     return error;
    255 }
    256 
    257 void
    258 ProcessPOSIX::DidLaunch()
    259 {
    260 }
    261 
    262 Error
    263 ProcessPOSIX::DoResume()
    264 {
    265     StateType state = GetPrivateState();
    266 
    267     assert(state == eStateStopped);
    268 
    269     SetPrivateState(eStateRunning);
    270 
    271     bool did_resume = false;
    272 
    273     Mutex::Locker lock(m_thread_list.GetMutex());
    274 
    275     uint32_t thread_count = m_thread_list.GetSize(false);
    276     for (uint32_t i = 0; i < thread_count; ++i)
    277     {
    278         POSIXThread *thread = static_cast<POSIXThread*>(
    279             m_thread_list.GetThreadAtIndex(i, false).get());
    280         did_resume = thread->Resume() || did_resume;
    281     }
    282     assert(did_resume && "Process resume failed!");
    283 
    284     return Error();
    285 }
    286 
    287 addr_t
    288 ProcessPOSIX::GetImageInfoAddress()
    289 {
    290     Target *target = &GetTarget();
    291     ObjectFile *obj_file = target->GetExecutableModule()->GetObjectFile();
    292     Address addr = obj_file->GetImageInfoAddress();
    293 
    294     if (addr.IsValid())
    295         return addr.GetLoadAddress(target);
    296     else
    297         return LLDB_INVALID_ADDRESS;
    298 }
    299 
    300 Error
    301 ProcessPOSIX::DoHalt(bool &caused_stop)
    302 {
    303     Error error;
    304 
    305     if (IsStopped())
    306     {
    307         caused_stop = false;
    308     }
    309     else if (kill(GetID(), SIGSTOP))
    310     {
    311         caused_stop = false;
    312         error.SetErrorToErrno();
    313     }
    314     else
    315     {
    316         caused_stop = true;
    317     }
    318     return error;
    319 }
    320 
    321 Error
    322 ProcessPOSIX::DoDetach(bool keep_stopped)
    323 {
    324     Error error;
    325     if (keep_stopped)
    326     {
    327         // FIXME: If you want to implement keep_stopped,
    328         // this would be the place to do it.
    329         error.SetErrorString("Detaching with keep_stopped true is not currently supported on this platform.");
    330         return error;
    331     }
    332 
    333     Mutex::Locker lock(m_thread_list.GetMutex());
    334 
    335     uint32_t thread_count = m_thread_list.GetSize(false);
    336     for (uint32_t i = 0; i < thread_count; ++i)
    337     {
    338         POSIXThread *thread = static_cast<POSIXThread*>(
    339             m_thread_list.GetThreadAtIndex(i, false).get());
    340         error = m_monitor->Detach(thread->GetID());
    341     }
    342 
    343     if (error.Success())
    344         SetPrivateState(eStateDetached);
    345 
    346     return error;
    347 }
    348 
    349 Error
    350 ProcessPOSIX::DoSignal(int signal)
    351 {
    352     Error error;
    353 
    354     if (kill(GetID(), signal))
    355         error.SetErrorToErrno();
    356 
    357     return error;
    358 }
    359 
    360 Error
    361 ProcessPOSIX::DoDestroy()
    362 {
    363     Error error;
    364 
    365     if (!HasExited())
    366     {
    367         // Drive the exit event to completion (do not keep the inferior in
    368         // limbo).
    369         m_exit_now = true;
    370 
    371         if ((m_monitor == NULL || kill(m_monitor->GetPID(), SIGKILL)) && error.Success())
    372         {
    373             error.SetErrorToErrno();
    374             return error;
    375         }
    376 
    377         SetPrivateState(eStateExited);
    378     }
    379 
    380     return error;
    381 }
    382 
    383 void
    384 ProcessPOSIX::SendMessage(const ProcessMessage &message)
    385 {
    386     Mutex::Locker lock(m_message_mutex);
    387 
    388     Mutex::Locker thread_lock(m_thread_list.GetMutex());
    389 
    390     POSIXThread *thread = static_cast<POSIXThread*>(
    391         m_thread_list.FindThreadByID(message.GetTID(), false).get());
    392 
    393     switch (message.GetKind())
    394     {
    395     case ProcessMessage::eInvalidMessage:
    396         return;
    397 
    398     case ProcessMessage::eLimboMessage:
    399         assert(thread);
    400         thread->SetState(eStateStopped);
    401         if (message.GetTID() == GetID())
    402         {
    403             m_exit_status = message.GetExitStatus();
    404             if (m_exit_now)
    405             {
    406                 SetPrivateState(eStateExited);
    407                 m_monitor->Detach(GetID());
    408             }
    409             else
    410             {
    411                 StopAllThreads(message.GetTID());
    412                 SetPrivateState(eStateStopped);
    413             }
    414         }
    415         else
    416         {
    417             StopAllThreads(message.GetTID());
    418             SetPrivateState(eStateStopped);
    419         }
    420         break;
    421 
    422     case ProcessMessage::eExitMessage:
    423         assert(thread);
    424         thread->SetState(eStateExited);
    425         // FIXME: I'm not sure we need to do this.
    426         if (message.GetTID() == GetID())
    427         {
    428             m_exit_status = message.GetExitStatus();
    429             SetExitStatus(m_exit_status, NULL);
    430         }
    431         else if (!IsAThreadRunning())
    432             SetPrivateState(eStateStopped);
    433         break;
    434 
    435         assert(thread);
    436         thread->SetState(eStateStopped);
    437         StopAllThreads(message.GetTID());
    438         SetPrivateState(eStateStopped);
    439         break;
    440 
    441     case ProcessMessage::eSignalMessage:
    442     case ProcessMessage::eSignalDeliveredMessage:
    443         if (message.GetSignal() == SIGSTOP &&
    444             AddThreadForInitialStopIfNeeded(message.GetTID()))
    445             return;
    446         // Intentional fall-through
    447 
    448     case ProcessMessage::eBreakpointMessage:
    449     case ProcessMessage::eTraceMessage:
    450     case ProcessMessage::eWatchpointMessage:
    451     case ProcessMessage::eNewThreadMessage:
    452     case ProcessMessage::eCrashMessage:
    453         assert(thread);
    454         thread->SetState(eStateStopped);
    455         StopAllThreads(message.GetTID());
    456         SetPrivateState(eStateStopped);
    457         break;
    458     }
    459 
    460     m_message_queue.push(message);
    461 }
    462 
    463 void
    464 ProcessPOSIX::StopAllThreads(lldb::tid_t stop_tid)
    465 {
    466     // FIXME: Will this work the same way on FreeBSD and Linux?
    467 }
    468 
    469 bool
    470 ProcessPOSIX::AddThreadForInitialStopIfNeeded(lldb::tid_t stop_tid)
    471 {
    472     bool added_to_set = false;
    473     ThreadStopSet::iterator it = m_seen_initial_stop.find(stop_tid);
    474     if (it == m_seen_initial_stop.end())
    475     {
    476         m_seen_initial_stop.insert(stop_tid);
    477         added_to_set = true;
    478     }
    479     return added_to_set;
    480 }
    481 
    482 POSIXThread *
    483 ProcessPOSIX::CreateNewPOSIXThread(lldb_private::Process &process, lldb::tid_t tid)
    484 {
    485     return new POSIXThread(process, tid);
    486 }
    487 
    488 void
    489 ProcessPOSIX::RefreshStateAfterStop()
    490 {
    491     Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PROCESS));
    492     if (log && log->GetMask().Test(POSIX_LOG_VERBOSE))
    493         log->Printf ("ProcessPOSIX::%s(), message_queue size = %d", __FUNCTION__, (int)m_message_queue.size());
    494 
    495     Mutex::Locker lock(m_message_mutex);
    496 
    497     // This method used to only handle one message.  Changing it to loop allows
    498     // it to handle the case where we hit a breakpoint while handling a different
    499     // breakpoint.
    500     while (!m_message_queue.empty())
    501     {
    502         ProcessMessage &message = m_message_queue.front();
    503 
    504         // Resolve the thread this message corresponds to and pass it along.
    505         lldb::tid_t tid = message.GetTID();
    506         if (log)
    507             log->Printf ("ProcessPOSIX::%s(), message_queue size = %d, pid = %" PRIi64, __FUNCTION__, (int)m_message_queue.size(), tid);
    508         POSIXThread *thread = static_cast<POSIXThread*>(
    509             GetThreadList().FindThreadByID(tid, false).get());
    510 
    511         if (message.GetKind() == ProcessMessage::eNewThreadMessage)
    512         {
    513             if (log)
    514                 log->Printf ("ProcessPOSIX::%s() adding thread, tid = %" PRIi64, __FUNCTION__, message.GetChildTID());
    515             lldb::tid_t child_tid = message.GetChildTID();
    516             ThreadSP thread_sp;
    517             thread_sp.reset(CreateNewPOSIXThread(*this, child_tid));
    518 
    519             Mutex::Locker lock(m_thread_list.GetMutex());
    520 
    521             m_thread_list.AddThread(thread_sp);
    522         }
    523 
    524         m_thread_list.RefreshStateAfterStop();
    525 
    526         if (thread)
    527             thread->Notify(message);
    528 
    529         if (message.GetKind() == ProcessMessage::eExitMessage)
    530         {
    531             // FIXME: We should tell the user about this, but the limbo message is probably better for that.
    532             if (log)
    533                 log->Printf ("ProcessPOSIX::%s() removing thread, tid = %" PRIi64, __FUNCTION__, tid);
    534 
    535             Mutex::Locker lock(m_thread_list.GetMutex());
    536 
    537             ThreadSP thread_sp = m_thread_list.RemoveThreadByID(tid, false);
    538             thread_sp.reset();
    539             m_seen_initial_stop.erase(tid);
    540         }
    541 
    542         m_message_queue.pop();
    543     }
    544 }
    545 
    546 bool
    547 ProcessPOSIX::IsAlive()
    548 {
    549     StateType state = GetPrivateState();
    550     return state != eStateDetached
    551         && state != eStateExited
    552         && state != eStateInvalid
    553         && state != eStateUnloaded;
    554 }
    555 
    556 size_t
    557 ProcessPOSIX::DoReadMemory(addr_t vm_addr,
    558                            void *buf, size_t size, Error &error)
    559 {
    560     assert(m_monitor);
    561     return m_monitor->ReadMemory(vm_addr, buf, size, error);
    562 }
    563 
    564 size_t
    565 ProcessPOSIX::DoWriteMemory(addr_t vm_addr, const void *buf, size_t size,
    566                             Error &error)
    567 {
    568     assert(m_monitor);
    569     return m_monitor->WriteMemory(vm_addr, buf, size, error);
    570 }
    571 
    572 addr_t
    573 ProcessPOSIX::DoAllocateMemory(size_t size, uint32_t permissions,
    574                                Error &error)
    575 {
    576     addr_t allocated_addr = LLDB_INVALID_ADDRESS;
    577 
    578     unsigned prot = 0;
    579     if (permissions & lldb::ePermissionsReadable)
    580         prot |= eMmapProtRead;
    581     if (permissions & lldb::ePermissionsWritable)
    582         prot |= eMmapProtWrite;
    583     if (permissions & lldb::ePermissionsExecutable)
    584         prot |= eMmapProtExec;
    585 
    586     if (InferiorCallMmap(this, allocated_addr, 0, size, prot,
    587                          eMmapFlagsAnon | eMmapFlagsPrivate, -1, 0)) {
    588         m_addr_to_mmap_size[allocated_addr] = size;
    589         error.Clear();
    590     } else {
    591         allocated_addr = LLDB_INVALID_ADDRESS;
    592         error.SetErrorStringWithFormat("unable to allocate %zu bytes of memory with permissions %s", size, GetPermissionsAsCString (permissions));
    593     }
    594 
    595     return allocated_addr;
    596 }
    597 
    598 Error
    599 ProcessPOSIX::DoDeallocateMemory(lldb::addr_t addr)
    600 {
    601     Error error;
    602     MMapMap::iterator pos = m_addr_to_mmap_size.find(addr);
    603     if (pos != m_addr_to_mmap_size.end() &&
    604         InferiorCallMunmap(this, addr, pos->second))
    605         m_addr_to_mmap_size.erase (pos);
    606     else
    607         error.SetErrorStringWithFormat("unable to deallocate memory at 0x%" PRIx64, addr);
    608 
    609     return error;
    610 }
    611 
    612 addr_t
    613 ProcessPOSIX::ResolveIndirectFunction(const Address *address, Error &error)
    614 {
    615     addr_t function_addr = LLDB_INVALID_ADDRESS;
    616     if (address == NULL) {
    617         error.SetErrorStringWithFormat("unable to determine direct function call for NULL address");
    618     } else if (!InferiorCall(this, address, function_addr)) {
    619         function_addr = LLDB_INVALID_ADDRESS;
    620         error.SetErrorStringWithFormat("unable to determine direct function call for indirect function %s",
    621                                        address->CalculateSymbolContextSymbol()->GetName().AsCString());
    622     }
    623     return function_addr;
    624 }
    625 
    626 size_t
    627 ProcessPOSIX::GetSoftwareBreakpointTrapOpcode(BreakpointSite* bp_site)
    628 {
    629     static const uint8_t g_i386_opcode[] = { 0xCC };
    630 
    631     ArchSpec arch = GetTarget().GetArchitecture();
    632     const uint8_t *opcode = NULL;
    633     size_t opcode_size = 0;
    634 
    635     switch (arch.GetCore())
    636     {
    637     default:
    638         assert(false && "CPU type not supported!");
    639         break;
    640 
    641     case ArchSpec::eCore_x86_32_i386:
    642     case ArchSpec::eCore_x86_64_x86_64:
    643         opcode = g_i386_opcode;
    644         opcode_size = sizeof(g_i386_opcode);
    645         break;
    646     }
    647 
    648     bp_site->SetTrapOpcode(opcode, opcode_size);
    649     return opcode_size;
    650 }
    651 
    652 Error
    653 ProcessPOSIX::EnableBreakpointSite(BreakpointSite *bp_site)
    654 {
    655     return EnableSoftwareBreakpoint(bp_site);
    656 }
    657 
    658 Error
    659 ProcessPOSIX::DisableBreakpointSite(BreakpointSite *bp_site)
    660 {
    661     return DisableSoftwareBreakpoint(bp_site);
    662 }
    663 
    664 Error
    665 ProcessPOSIX::EnableWatchpoint(Watchpoint *wp, bool notify)
    666 {
    667     Error error;
    668     if (wp)
    669     {
    670         user_id_t watchID = wp->GetID();
    671         addr_t addr = wp->GetLoadAddress();
    672         Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_WATCHPOINTS));
    673         if (log)
    674             log->Printf ("ProcessPOSIX::EnableWatchpoint(watchID = %" PRIu64 ")",
    675                          watchID);
    676         if (wp->IsEnabled())
    677         {
    678             if (log)
    679                 log->Printf("ProcessPOSIX::EnableWatchpoint(watchID = %" PRIu64
    680                             ") addr = 0x%8.8" PRIx64 ": watchpoint already enabled.",
    681                             watchID, (uint64_t)addr);
    682             return error;
    683         }
    684 
    685         // Try to find a vacant watchpoint slot in the inferiors' main thread
    686         uint32_t wp_hw_index = LLDB_INVALID_INDEX32;
    687         Mutex::Locker lock(m_thread_list.GetMutex());
    688         POSIXThread *thread = static_cast<POSIXThread*>(
    689                                m_thread_list.GetThreadAtIndex(0, false).get());
    690 
    691         if (thread)
    692             wp_hw_index = thread->FindVacantWatchpointIndex();
    693 
    694         if (wp_hw_index == LLDB_INVALID_INDEX32)
    695         {
    696             error.SetErrorString("Setting hardware watchpoint failed.");
    697         }
    698         else
    699         {
    700             wp->SetHardwareIndex(wp_hw_index);
    701             bool wp_enabled = true;
    702             uint32_t thread_count = m_thread_list.GetSize(false);
    703             for (uint32_t i = 0; i < thread_count; ++i)
    704             {
    705                 thread = static_cast<POSIXThread*>(
    706                          m_thread_list.GetThreadAtIndex(i, false).get());
    707                 if (thread)
    708                     wp_enabled &= thread->EnableHardwareWatchpoint(wp);
    709                 else
    710                     wp_enabled = false;
    711             }
    712             if (wp_enabled)
    713             {
    714                 wp->SetEnabled(true, notify);
    715                 return error;
    716             }
    717             else
    718             {
    719                 // Watchpoint enabling failed on at least one
    720                 // of the threads so roll back all of them
    721                 DisableWatchpoint(wp, false);
    722                 error.SetErrorString("Setting hardware watchpoint failed");
    723             }
    724         }
    725     }
    726     else
    727         error.SetErrorString("Watchpoint argument was NULL.");
    728     return error;
    729 }
    730 
    731 Error
    732 ProcessPOSIX::DisableWatchpoint(Watchpoint *wp, bool notify)
    733 {
    734     Error error;
    735     if (wp)
    736     {
    737         user_id_t watchID = wp->GetID();
    738         addr_t addr = wp->GetLoadAddress();
    739         Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_WATCHPOINTS));
    740         if (log)
    741             log->Printf("ProcessPOSIX::DisableWatchpoint(watchID = %" PRIu64 ")",
    742                         watchID);
    743         if (!wp->IsEnabled())
    744         {
    745             if (log)
    746                 log->Printf("ProcessPOSIX::DisableWatchpoint(watchID = %" PRIu64
    747                             ") addr = 0x%8.8" PRIx64 ": watchpoint already disabled.",
    748                             watchID, (uint64_t)addr);
    749             // This is needed (for now) to keep watchpoints disabled correctly
    750             wp->SetEnabled(false, notify);
    751             return error;
    752         }
    753 
    754         if (wp->IsHardware())
    755         {
    756             bool wp_disabled = true;
    757             Mutex::Locker lock(m_thread_list.GetMutex());
    758             uint32_t thread_count = m_thread_list.GetSize(false);
    759             for (uint32_t i = 0; i < thread_count; ++i)
    760             {
    761                 POSIXThread *thread = static_cast<POSIXThread*>(
    762                                       m_thread_list.GetThreadAtIndex(i, false).get());
    763                 if (thread)
    764                     wp_disabled &= thread->DisableHardwareWatchpoint(wp);
    765                 else
    766                     wp_disabled = false;
    767             }
    768             if (wp_disabled)
    769             {
    770                 wp->SetHardwareIndex(LLDB_INVALID_INDEX32);
    771                 wp->SetEnabled(false, notify);
    772                 return error;
    773             }
    774             else
    775                 error.SetErrorString("Disabling hardware watchpoint failed");
    776         }
    777     }
    778     else
    779         error.SetErrorString("Watchpoint argument was NULL.");
    780     return error;
    781 }
    782 
    783 Error
    784 ProcessPOSIX::GetWatchpointSupportInfo(uint32_t &num)
    785 {
    786     Error error;
    787     Mutex::Locker lock(m_thread_list.GetMutex());
    788     POSIXThread *thread = static_cast<POSIXThread*>(
    789                           m_thread_list.GetThreadAtIndex(0, false).get());
    790     if (thread)
    791         num = thread->NumSupportedHardwareWatchpoints();
    792     else
    793         error.SetErrorString("Process does not exist.");
    794     return error;
    795 }
    796 
    797 Error
    798 ProcessPOSIX::GetWatchpointSupportInfo(uint32_t &num, bool &after)
    799 {
    800     Error error = GetWatchpointSupportInfo(num);
    801     // Watchpoints trigger and halt the inferior after
    802     // the corresponding instruction has been executed.
    803     after = true;
    804     return error;
    805 }
    806 
    807 uint32_t
    808 ProcessPOSIX::UpdateThreadListIfNeeded()
    809 {
    810     Mutex::Locker lock(m_thread_list.GetMutex());
    811     // Do not allow recursive updates.
    812     return m_thread_list.GetSize(false);
    813 }
    814 
    815 bool
    816 ProcessPOSIX::UpdateThreadList(ThreadList &old_thread_list, ThreadList &new_thread_list)
    817 {
    818     Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD));
    819     if (log && log->GetMask().Test(POSIX_LOG_VERBOSE))
    820         log->Printf ("ProcessPOSIX::%s() (pid = %" PRIi64 ")", __FUNCTION__, GetID());
    821 
    822     // Update the process thread list with this new thread.
    823     // FIXME: We should be using tid, not pid.
    824     assert(m_monitor);
    825     ThreadSP thread_sp (old_thread_list.FindThreadByID (GetID(), false));
    826     if (!thread_sp) {
    827         thread_sp.reset(CreateNewPOSIXThread(*this, GetID()));
    828     }
    829 
    830     if (log && log->GetMask().Test(POSIX_LOG_VERBOSE))
    831         log->Printf ("ProcessPOSIX::%s() updated pid = %" PRIi64, __FUNCTION__, GetID());
    832     new_thread_list.AddThread(thread_sp);
    833 
    834     return new_thread_list.GetSize(false) > 0;
    835 }
    836 
    837 ByteOrder
    838 ProcessPOSIX::GetByteOrder() const
    839 {
    840     // FIXME: We should be able to extract this value directly.  See comment in
    841     // ProcessPOSIX().
    842     return m_byte_order;
    843 }
    844 
    845 size_t
    846 ProcessPOSIX::PutSTDIN(const char *buf, size_t len, Error &error)
    847 {
    848     ssize_t status;
    849     if ((status = write(m_monitor->GetTerminalFD(), buf, len)) < 0)
    850     {
    851         error.SetErrorToErrno();
    852         return 0;
    853     }
    854     return status;
    855 }
    856 
    857 UnixSignals &
    858 ProcessPOSIX::GetUnixSignals()
    859 {
    860     return m_signals;
    861 }
    862 
    863 //------------------------------------------------------------------------------
    864 // Utility functions.
    865 
    866 bool
    867 ProcessPOSIX::HasExited()
    868 {
    869     switch (GetPrivateState())
    870     {
    871     default:
    872         break;
    873 
    874     case eStateDetached:
    875     case eStateExited:
    876         return true;
    877     }
    878 
    879     return false;
    880 }
    881 
    882 bool
    883 ProcessPOSIX::IsStopped()
    884 {
    885     switch (GetPrivateState())
    886     {
    887     default:
    888         break;
    889 
    890     case eStateStopped:
    891     case eStateCrashed:
    892     case eStateSuspended:
    893         return true;
    894     }
    895 
    896     return false;
    897 }
    898 
    899 bool
    900 ProcessPOSIX::IsAThreadRunning()
    901 {
    902     bool is_running = false;
    903     Mutex::Locker lock(m_thread_list.GetMutex());
    904     uint32_t thread_count = m_thread_list.GetSize(false);
    905     for (uint32_t i = 0; i < thread_count; ++i)
    906     {
    907         POSIXThread *thread = static_cast<POSIXThread*>(
    908             m_thread_list.GetThreadAtIndex(i, false).get());
    909         StateType thread_state = thread->GetState();
    910         if (thread_state == eStateRunning || thread_state == eStateStepping)
    911         {
    912             is_running = true;
    913             break;
    914         }
    915     }
    916     return is_running;
    917 }
    918