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