12341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//===-- POSIXThread.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
172341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// Project includes
183d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec#include "lldb/Breakpoint/Watchpoint.h"
19674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi#include "lldb/Breakpoint/BreakpointLocation.h"
202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Core/Debugger.h"
213bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor#include "lldb/Core/State.h"
222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Host/Host.h"
232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Target/Process.h"
242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Target/StopInfo.h"
252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Target/Target.h"
26674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi#include "lldb/Target/ThreadSpec.h"
272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "POSIXStopInfo.h"
282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "POSIXThread.h"
292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "ProcessPOSIX.h"
302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "ProcessPOSIXLog.h"
312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "ProcessMonitor.h"
322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "RegisterContext_i386.h"
332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "RegisterContext_x86_64.h"
342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "RegisterContextPOSIX.h"
35dae196da3bf9c181405c9c0c1083069dc007e318Ashok Thirumurthi#include "RegisterContextLinux_x86_64.h"
36dae196da3bf9c181405c9c0c1083069dc007e318Ashok Thirumurthi#include "RegisterContextFreeBSD_x86_64.h"
372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "UnwindLLDB.h"
392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
40e5eaa30f62c697d649966c86acd4e3c52b39b355Greg Claytonusing namespace lldb;
412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenusing namespace lldb_private;
422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
445e91e379b3be10738ab5aeae87b47001de16cd7cGreg ClaytonPOSIXThread::POSIXThread(Process &process, lldb::tid_t tid)
452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    : Thread(process, tid),
460ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec      m_frame_ap (),
470ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec      m_breakpoint (),
484349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartain      m_thread_name_valid (false),
490ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec      m_thread_name ()
502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
51d8f6b6446d8b9d1568f91f51bc5dd3aae45db5ccAshok Thirumurthi    Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD));
522341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (log && log->GetMask().Test(POSIX_LOG_VERBOSE))
535f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        log->Printf ("POSIXThread::%s (tid = %" PRIi64 ")", __FUNCTION__, tid);
5412c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec
5512c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec    // Set the current watchpoints for this thread.
5612c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec    Target &target = GetProcess()->GetTarget();
5712c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec    const WatchpointList &wp_list = target.GetWatchpointList();
5812c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec    size_t wp_size = wp_list.GetSize();
5912c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec
6012c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec    for (uint32_t wp_idx = 0; wp_idx < wp_size; wp_idx++)
6112c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec    {
6212c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec        lldb::WatchpointSP wp = wp_list.GetByIndex(wp_idx);
6312c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec        if (wp.get() && wp->IsEnabled())
6412c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec        {
6512c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec            assert(EnableHardwareWatchpoint(wp.get()));
6612c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec        }
6712c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec    }
682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenPOSIXThread::~POSIXThread()
712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    DestroyThread();
732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessMonitor &
762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenPOSIXThread::GetMonitor()
772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
78e5eaa30f62c697d649966c86acd4e3c52b39b355Greg Clayton    ProcessSP base = GetProcess();
79e5eaa30f62c697d649966c86acd4e3c52b39b355Greg Clayton    ProcessPOSIX &process = static_cast<ProcessPOSIX&>(*base);
802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return process.GetMonitor();
812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenvoid
842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenPOSIXThread::RefreshStateAfterStop()
852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
863bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    // Invalidate all registers in our register context. We don't set "force" to
873bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    // true because the stop reply packet might have had some register values
883bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    // that were expedited and these will already be copied into the register
893bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    // context by the time this function gets called. The KDPRegisterContext
903bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    // class has been made smart enough to detect when it needs to invalidate
913bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    // which registers are valid by putting hooks in the register read and
923bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    // register supply functions where they check the process stop ID and do
933bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    // the right thing.
943bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    //if (StateIsStoppedState(GetState())
953bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    {
963bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        const bool force = false;
973bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        GetRegisterContext()->InvalidateIfNeeded (force);
983bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    }
993bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    // FIXME: This should probably happen somewhere else.
1003bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    SetResumeState(eStateRunning);
101d8f6b6446d8b9d1568f91f51bc5dd3aae45db5ccAshok Thirumurthi    Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD));
1023bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    if (log)
1033bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        log->Printf ("POSIXThread::%s (tid = %" PRIi64 ") setting thread resume state to running", __FUNCTION__, GetID());
1042341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
1052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1062341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenconst char *
1072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenPOSIXThread::GetInfo()
1082341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
1092341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return NULL;
1102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
1112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1120ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopecvoid
1130ba7548c72ed9a242415cb78f2351146d7afe3b7Matt KopecPOSIXThread::SetName (const char *name)
1140ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec{
1154349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartain    m_thread_name_valid = (name && name[0]);
1164349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartain    if (m_thread_name_valid)
1170ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec        m_thread_name.assign (name);
1180ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec    else
1190ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec        m_thread_name.clear();
1200ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec}
1210ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec
1220ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopecconst char *
1230ba7548c72ed9a242415cb78f2351146d7afe3b7Matt KopecPOSIXThread::GetName ()
1240ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec{
1254349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartain    if (!m_thread_name_valid)
1264349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartain    {
1274349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartain        SetName(Host::GetThreadName(GetProcess()->GetID(), GetID()).c_str());
1284349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartain        m_thread_name_valid = true;
1294349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartain    }
1304349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartain
1310ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec    if (m_thread_name.empty())
1320ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec        return NULL;
1330ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec    return m_thread_name.c_str();
1340ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec}
1350ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec
1362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenlldb::RegisterContextSP
1372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenPOSIXThread::GetRegisterContext()
1382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
1392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (!m_reg_context_sp)
1402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    {
1412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        ArchSpec arch = Host::GetArchitecture();
1422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        switch (arch.GetCore())
1442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        {
1452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        default:
1462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            assert(false && "CPU type not supported!");
1472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            break;
1482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        case ArchSpec::eCore_x86_32_i386:
1502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        case ArchSpec::eCore_x86_32_i486:
1512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        case ArchSpec::eCore_x86_32_i486sx:
1522341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            m_reg_context_sp.reset(new RegisterContext_i386(*this, 0));
1532341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            break;
1542341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        case ArchSpec::eCore_x86_64_x86_64:
1568c2dc0ed580bf17b93431f8aca0ad7a89b594066Ed Maste            switch (arch.GetTriple().getOS())
1578c2dc0ed580bf17b93431f8aca0ad7a89b594066Ed Maste            {
1588c2dc0ed580bf17b93431f8aca0ad7a89b594066Ed Maste                case llvm::Triple::FreeBSD:
1598c2dc0ed580bf17b93431f8aca0ad7a89b594066Ed Maste                    m_reg_context_sp.reset(new RegisterContextFreeBSD_x86_64(*this, 0));
1608c2dc0ed580bf17b93431f8aca0ad7a89b594066Ed Maste                    break;
1618c2dc0ed580bf17b93431f8aca0ad7a89b594066Ed Maste                case llvm::Triple::Linux:
1628c2dc0ed580bf17b93431f8aca0ad7a89b594066Ed Maste                    m_reg_context_sp.reset(new RegisterContextLinux_x86_64(*this, 0));
1638c2dc0ed580bf17b93431f8aca0ad7a89b594066Ed Maste                    break;
1648c2dc0ed580bf17b93431f8aca0ad7a89b594066Ed Maste                default:
1658c2dc0ed580bf17b93431f8aca0ad7a89b594066Ed Maste                    assert(false && "OS not supported");
1668c2dc0ed580bf17b93431f8aca0ad7a89b594066Ed Maste                    break;
1678c2dc0ed580bf17b93431f8aca0ad7a89b594066Ed Maste            }
1682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            break;
1692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        }
1702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    }
1712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return m_reg_context_sp;
1722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
1732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenlldb::RegisterContextSP
1752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenPOSIXThread::CreateRegisterContextForFrame(lldb_private::StackFrame *frame)
1762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
1772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb::RegisterContextSP reg_ctx_sp;
1782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    uint32_t concrete_frame_idx = 0;
1792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
180d8f6b6446d8b9d1568f91f51bc5dd3aae45db5ccAshok Thirumurthi    Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD));
1812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (log && log->GetMask().Test(POSIX_LOG_VERBOSE))
1822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        log->Printf ("POSIXThread::%s ()", __FUNCTION__);
1832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (frame)
1852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        concrete_frame_idx = frame->GetConcreteFrameIndex();
1862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (concrete_frame_idx == 0)
1882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        reg_ctx_sp = GetRegisterContext();
1892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    else
1902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    {
1912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        assert(GetUnwinder());
1922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        reg_ctx_sp = GetUnwinder()->CreateRegisterContextForFrame(frame);
1932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    }
1942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return reg_ctx_sp;
1962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
1972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
198863aa28adf536c9c008e1590f25da662431d6f13Greg Claytonbool
199863aa28adf536c9c008e1590f25da662431d6f13Greg ClaytonPOSIXThread::CalculateStopInfo()
2002341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
201dc07851c7d6eb5debba116d81648a88a0e595114Ashok Thirumurthi    SetStopInfo (m_stop_info_sp);
202863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton    return true;
2032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
2042341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenUnwind *
2062341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenPOSIXThread::GetUnwinder()
2072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
2082341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (m_unwinder_ap.get() == NULL)
2092341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        m_unwinder_ap.reset(new UnwindLLDB(*this));
2102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return m_unwinder_ap.get();
2122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
2132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
214a46013bde54626b68cd2013b108f73a205f4b29aGreg Claytonvoid
2152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenPOSIXThread::WillResume(lldb::StateType resume_state)
2162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
2173bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD));
2183bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    if (log)
2193bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        log->Printf ("POSIXThread::%s (tid = %" PRIi64 ") setting thread resume state to %s", __FUNCTION__, GetID(), StateAsCString(resume_state));
2203bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    // TODO: the line below shouldn't really be done, but
221a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    // the POSIXThread might rely on this so I will leave this in for now
2222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    SetResumeState(resume_state);
2232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
2242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2253bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylorvoid
2263bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew KaylorPOSIXThread::DidStop()
2273bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor{
2283bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    // Don't set the thread state to stopped unless we really stopped.
2293bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor}
2303bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor
2312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenbool
2322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenPOSIXThread::Resume()
2332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
2342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb::StateType resume_state = GetResumeState();
2352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ProcessMonitor &monitor = GetMonitor();
2362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    bool status;
2372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
238d8f6b6446d8b9d1568f91f51bc5dd3aae45db5ccAshok Thirumurthi    Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD));
2393bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    if (log)
2403bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        log->Printf ("POSIXThread::%s (), resume_state = %s", __FUNCTION__,
2413bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor                         StateAsCString(resume_state));
2422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    switch (resume_state)
2442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    {
2452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    default:
2462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        assert(false && "Unexpected state for resume!");
2472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        status = false;
2482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        break;
2492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case lldb::eStateRunning:
2512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        SetState(resume_state);
2522341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        status = monitor.Resume(GetID(), GetResumeSignal());
2532341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        break;
2542341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case lldb::eStateStepping:
2562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        SetState(resume_state);
2572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        status = monitor.SingleStep(GetID(), GetResumeSignal());
2582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        break;
259d601e83ba2bb1b731986602f36bbc2e0514196d4Daniel Malea    case lldb::eStateStopped:
260d601e83ba2bb1b731986602f36bbc2e0514196d4Daniel Malea    case lldb::eStateSuspended:
261d601e83ba2bb1b731986602f36bbc2e0514196d4Daniel Malea        status = true;
262d601e83ba2bb1b731986602f36bbc2e0514196d4Daniel Malea        break;
2632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    }
2642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return status;
2662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
2672341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenvoid
2692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenPOSIXThread::Notify(const ProcessMessage &message)
2702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
271d8f6b6446d8b9d1568f91f51bc5dd3aae45db5ccAshok Thirumurthi    Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD));
2722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (log)
273010a8d85100602eff09bd61a85987efd0001188aMatt Kopec        log->Printf ("POSIXThread::%s () message kind = '%s' for tid %" PRIu64,
274010a8d85100602eff09bd61a85987efd0001188aMatt Kopec                     __FUNCTION__, message.PrintKind(), GetID());
2752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    switch (message.GetKind())
2772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    {
2782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    default:
2792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        assert(false && "Unexpected message kind!");
2802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        break;
2812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2823bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    case ProcessMessage::eExitMessage:
2833bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        // Nothing to be done.
2843bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor        break;
2853bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor
2862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case ProcessMessage::eLimboMessage:
2872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        LimboNotify(message);
2882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        break;
2893bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor
2902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case ProcessMessage::eSignalMessage:
2912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        SignalNotify(message);
2922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        break;
2932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case ProcessMessage::eSignalDeliveredMessage:
2952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        SignalDeliveredNotify(message);
2962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        break;
2972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case ProcessMessage::eTraceMessage:
2992341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        TraceNotify(message);
3002341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        break;
3012341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
3022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case ProcessMessage::eBreakpointMessage:
3032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        BreakNotify(message);
3042341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        break;
3052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
3063d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    case ProcessMessage::eWatchpointMessage:
3073d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        WatchNotify(message);
3083d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        break;
3093d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
3102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case ProcessMessage::eCrashMessage:
3112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        CrashNotify(message);
3122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        break;
313f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec
314f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec    case ProcessMessage::eNewThreadMessage:
315f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec        ThreadNotify(message);
316f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec        break;
3172341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    }
3182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
3192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
3203d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopecbool
3213d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt KopecPOSIXThread::EnableHardwareWatchpoint(Watchpoint *wp)
3223d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec{
32312c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec    bool wp_set = false;
3243d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    if (wp)
3253d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    {
3263d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        addr_t wp_addr = wp->GetLoadAddress();
3273d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        size_t wp_size = wp->GetByteSize();
3283d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        bool wp_read = wp->WatchpointRead();
3293d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        bool wp_write = wp->WatchpointWrite();
33012c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec        uint32_t wp_hw_index = wp->GetHardwareIndex();
33112c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec        RegisterContextPOSIX* reg_ctx = GetRegisterContextPOSIX();
33212c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec        if (reg_ctx)
33312c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec            wp_set = reg_ctx->SetHardwareWatchpointWithIndex(wp_addr, wp_size,
33412c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec                                                             wp_read, wp_write,
33512c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec                                                             wp_hw_index);
3363d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    }
33712c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec    return wp_set;
3383d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec}
3393d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
3403d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopecbool
3413d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt KopecPOSIXThread::DisableHardwareWatchpoint(Watchpoint *wp)
3423d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec{
3433d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    bool result = false;
3443d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    if (wp)
3453d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    {
3463d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        lldb::RegisterContextSP reg_ctx_sp = GetRegisterContext();
3473d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        if (reg_ctx_sp.get())
3483d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec            result = reg_ctx_sp->ClearHardwareWatchpoint(wp->GetHardwareIndex());
3493d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    }
3503d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    return result;
3513d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec}
3523d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
3533d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopecuint32_t
3543d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt KopecPOSIXThread::NumSupportedHardwareWatchpoints()
3553d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec{
3563d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    lldb::RegisterContextSP reg_ctx_sp = GetRegisterContext();
3573d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    if (reg_ctx_sp.get())
3583d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        return reg_ctx_sp->NumSupportedHardwareWatchpoints();
3593d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    return 0;
3603d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec}
3613d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
36212c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopecuint32_t
36312c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt KopecPOSIXThread::FindVacantWatchpointIndex()
36412c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec{
36512c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec    uint32_t hw_index = LLDB_INVALID_INDEX32;
36612c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec    uint32_t num_hw_wps = NumSupportedHardwareWatchpoints();
36712c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec    uint32_t wp_idx;
36812c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec    RegisterContextPOSIX* reg_ctx = GetRegisterContextPOSIX();
36912c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec    if (reg_ctx)
37012c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec    {
37112c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec        for (wp_idx = 0; wp_idx < num_hw_wps; wp_idx++)
37212c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec        {
37312c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec            if (reg_ctx->IsWatchpointVacant(wp_idx))
37412c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec            {
37512c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec                hw_index = wp_idx;
37612c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec                break;
37712c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec            }
37812c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec        }
37912c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec    }
38012c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec    return hw_index;
38112c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec}
38212c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec
3832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenvoid
3842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenPOSIXThread::BreakNotify(const ProcessMessage &message)
3852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
3862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    bool status;
387d8f6b6446d8b9d1568f91f51bc5dd3aae45db5ccAshok Thirumurthi    Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD));
3882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
3892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    assert(GetRegisterContext());
3902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    status = GetRegisterContextPOSIX()->UpdateAfterBreakpoint();
3912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    assert(status && "Breakpoint update failed!");
3922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
3932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // With our register state restored, resolve the breakpoint object
3942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // corresponding to our current PC.
3952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    assert(GetRegisterContext());
3962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb::addr_t pc = GetRegisterContext()->GetPC();
3972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (log)
3985f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        log->Printf ("POSIXThread::%s () PC=0x%8.8" PRIx64, __FUNCTION__, pc);
399e5eaa30f62c697d649966c86acd4e3c52b39b355Greg Clayton    lldb::BreakpointSiteSP bp_site(GetProcess()->GetBreakpointSiteList().FindByAddress(pc));
4002341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
401674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi    // If the breakpoint is for this thread, then we'll report the hit, but if it is for another thread,
402674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi    // we can just report no reason.  We don't need to worry about stepping over the breakpoint here, that
403674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi    // will be taken care of when the thread resumes and notices that there's a breakpoint under the pc.
404674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi    if (bp_site && bp_site->ValidForThisThread(this))
405674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi    {
406674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi        lldb::break_id_t bp_id = bp_site->GetID();
407674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi        if (GetProcess()->GetThreadList().SetSelectedThreadByID(GetID()))
408674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi            SetStopInfo (StopInfo::CreateStopReasonWithBreakpointSiteID(*this, bp_id));
409674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi        else
410674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi            assert(false && "Invalid thread ID during BreakNotify.");
411674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi    }
412674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi    else
413674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi    {
414674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi        const ThreadSpec *spec = bp_site ?
415674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi            bp_site->GetOwnerAtIndex(0)->GetOptionsNoCreate()->GetThreadSpecNoCreate() : 0;
4163bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor
417674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi        if (spec && spec->TIDMatches(*this))
418674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi            assert(false && "BreakpointSite is invalid for the current ThreadSpec.");
419674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi        else
420674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi        {
421674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi            if (!m_stop_info_sp) {
422674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi                StopInfoSP invalid_stop_info_sp;
423674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi                SetStopInfo (invalid_stop_info_sp);
424674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi            }
425674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi        }
426674f7d1d53fd1e663a4a4c4d734b79dece0f7cccAshok Thirumurthi    }
4272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
4282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
4292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenvoid
4303d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt KopecPOSIXThread::WatchNotify(const ProcessMessage &message)
4313d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec{
4323d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD));
4333d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
4343d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    lldb::addr_t halt_addr = message.GetHWAddress();
4353d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    if (log)
4363d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        log->Printf ("POSIXThread::%s () Hardware Watchpoint Address = 0x%8.8"
4373d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec                     PRIx64, __FUNCTION__, halt_addr);
4383d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
4393d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    RegisterContextPOSIX* reg_ctx = GetRegisterContextPOSIX();
4403d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    if (reg_ctx)
4413d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    {
4423d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        uint32_t num_hw_wps = reg_ctx->NumSupportedHardwareWatchpoints();
4433d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        uint32_t wp_idx;
4443d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        for (wp_idx = 0; wp_idx < num_hw_wps; wp_idx++)
4453d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        {
4463d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec            if (reg_ctx->IsWatchpointHit(wp_idx))
4473d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec            {
4483d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec                // Clear the watchpoint hit here
4493d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec                reg_ctx->ClearWatchpointHits();
4503d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec                break;
4513d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec            }
4523d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        }
4533d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
4543d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        if (wp_idx == num_hw_wps)
4553d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec            return;
4563d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
4573d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        Target &target = GetProcess()->GetTarget();
4583d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        lldb::addr_t wp_monitor_addr = reg_ctx->GetWatchpointAddress(wp_idx);
4593d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        const WatchpointList &wp_list = target.GetWatchpointList();
4603d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec        lldb::WatchpointSP wp_sp = wp_list.FindByAddress(wp_monitor_addr);
4613d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
462aeb2faf0a2bbb38ecc6ab05955bd80ef69bf9020Matt Kopec        assert(wp_sp.get() && "No watchpoint found");
463aeb2faf0a2bbb38ecc6ab05955bd80ef69bf9020Matt Kopec        SetStopInfo (StopInfo::CreateStopReasonWithWatchpointID(*this,
464aeb2faf0a2bbb38ecc6ab05955bd80ef69bf9020Matt Kopec                                                                wp_sp->GetID()));
4653d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    }
4663d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec}
4673d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
4683d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopecvoid
4692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenPOSIXThread::TraceNotify(const ProcessMessage &message)
4702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
4714e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor    SetStopInfo (StopInfo::CreateStopReasonToTrace(*this));
4722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
4732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
4742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenvoid
4752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenPOSIXThread::LimboNotify(const ProcessMessage &message)
4762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
4774e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor    SetStopInfo (lldb::StopInfoSP(new POSIXLimboStopInfo(*this)));
4782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
4792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
4802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenvoid
4812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenPOSIXThread::SignalNotify(const ProcessMessage &message)
4822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
4832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    int signo = message.GetSignal();
4842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
4854e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor    SetStopInfo (StopInfo::CreateStopReasonWithSignal(*this, signo));
4862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    SetResumeSignal(signo);
4872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
4882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
4892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenvoid
4902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenPOSIXThread::SignalDeliveredNotify(const ProcessMessage &message)
4912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
4922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    int signo = message.GetSignal();
4932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
4944e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor    SetStopInfo (StopInfo::CreateStopReasonWithSignal(*this, signo));
4952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    SetResumeSignal(signo);
4962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
4972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
4982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenvoid
4992341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenPOSIXThread::CrashNotify(const ProcessMessage &message)
5002341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
5013bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    // FIXME: Update stop reason as per bugzilla 14598
5022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    int signo = message.GetSignal();
5032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
5042341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    assert(message.GetKind() == ProcessMessage::eCrashMessage);
5052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
506d8f6b6446d8b9d1568f91f51bc5dd3aae45db5ccAshok Thirumurthi    Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD));
5072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    if (log)
508010a8d85100602eff09bd61a85987efd0001188aMatt Kopec        log->Printf ("POSIXThread::%s () signo = %i, reason = '%s'",
509010a8d85100602eff09bd61a85987efd0001188aMatt Kopec                     __FUNCTION__, signo, message.PrintCrashReason());
5102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
511010a8d85100602eff09bd61a85987efd0001188aMatt Kopec    SetStopInfo (lldb::StopInfoSP(new POSIXCrashStopInfo(*this, signo,
512010a8d85100602eff09bd61a85987efd0001188aMatt Kopec                                                         message.GetCrashReason(),
513010a8d85100602eff09bd61a85987efd0001188aMatt Kopec                                                         message.GetFaultAddress())));
5142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    SetResumeSignal(signo);
5152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
5162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
517f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopecvoid
518f1fda3748c39c92d2e79aeba0715baffabd3286bMatt KopecPOSIXThread::ThreadNotify(const ProcessMessage &message)
519f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec{
5204e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor    SetStopInfo (lldb::StopInfoSP(new POSIXNewThreadStopInfo(*this)));
521f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec}
522f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec
5232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenunsigned
5242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenPOSIXThread::GetRegisterIndexFromOffset(unsigned offset)
5252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
5263a0e6a527395682c6e8a3fe346a704cbe7c27274Andy Gibbs    unsigned reg = LLDB_INVALID_REGNUM;
5272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ArchSpec arch = Host::GetArchitecture();
5282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
5292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    switch (arch.GetCore())
5302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    {
5312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    default:
53209dffd865889d31d85ecaac55033e0c0aa727c2aAndy Gibbs        llvm_unreachable("CPU type not supported!");
5332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        break;
5342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
5352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case ArchSpec::eCore_x86_32_i386:
5362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case ArchSpec::eCore_x86_32_i486:
5372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case ArchSpec::eCore_x86_32_i486sx:
5382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case ArchSpec::eCore_x86_64_x86_64:
539c73fedb63ab170d711fb73d198451eb8db710e8dAshok Thirumurthi        {
540c73fedb63ab170d711fb73d198451eb8db710e8dAshok Thirumurthi            RegisterContextSP base = GetRegisterContext();
541c73fedb63ab170d711fb73d198451eb8db710e8dAshok Thirumurthi            if (base) {
542c73fedb63ab170d711fb73d198451eb8db710e8dAshok Thirumurthi                RegisterContextPOSIX &context = static_cast<RegisterContextPOSIX &>(*base);
543c73fedb63ab170d711fb73d198451eb8db710e8dAshok Thirumurthi                reg = context.GetRegisterIndexFromOffset(offset);
544c73fedb63ab170d711fb73d198451eb8db710e8dAshok Thirumurthi            }
545c73fedb63ab170d711fb73d198451eb8db710e8dAshok Thirumurthi        }
5462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        break;
5472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    }
5482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return reg;
5492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
5502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
5512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenconst char *
5522341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenPOSIXThread::GetRegisterName(unsigned reg)
5532341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
554c73fedb63ab170d711fb73d198451eb8db710e8dAshok Thirumurthi    const char * name = nullptr;
5552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ArchSpec arch = Host::GetArchitecture();
5562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
5572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    switch (arch.GetCore())
5582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    {
5592341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    default:
5602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        assert(false && "CPU type not supported!");
5612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        break;
5622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
5632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case ArchSpec::eCore_x86_32_i386:
5642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case ArchSpec::eCore_x86_32_i486:
5652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case ArchSpec::eCore_x86_32_i486sx:
5662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    case ArchSpec::eCore_x86_64_x86_64:
567c73fedb63ab170d711fb73d198451eb8db710e8dAshok Thirumurthi        name = GetRegisterContext()->GetRegisterName(reg);
5682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        break;
5692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    }
5702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return name;
5712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
5722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
5732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenconst char *
5742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenPOSIXThread::GetRegisterNameFromOffset(unsigned offset)
5752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
5762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    return GetRegisterName(GetRegisterIndexFromOffset(offset));
5772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
5782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
579