POSIXThread.cpp revision 269024
1//===-- POSIXThread.cpp -----------------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#include "lldb/lldb-python.h" 11 12// C Includes 13#include <errno.h> 14 15// C++ Includes 16// Other libraries and framework includes 17// Project includes 18#include "lldb/Breakpoint/Watchpoint.h" 19#include "lldb/Breakpoint/BreakpointLocation.h" 20#include "lldb/Core/Debugger.h" 21#include "lldb/Core/State.h" 22#include "lldb/Host/Host.h" 23#include "lldb/Target/Process.h" 24#include "lldb/Target/StopInfo.h" 25#include "lldb/Target/Target.h" 26#include "lldb/Target/ThreadSpec.h" 27#include "POSIXStopInfo.h" 28#include "POSIXThread.h" 29#include "ProcessPOSIX.h" 30#include "ProcessPOSIXLog.h" 31#include "ProcessMonitor.h" 32#include "RegisterContextPOSIXProcessMonitor_mips64.h" 33#include "RegisterContextPOSIXProcessMonitor_x86.h" 34#include "RegisterContextLinux_i386.h" 35#include "RegisterContextLinux_x86_64.h" 36#include "RegisterContextFreeBSD_i386.h" 37#include "RegisterContextFreeBSD_mips64.h" 38#include "RegisterContextFreeBSD_x86_64.h" 39 40#include "UnwindLLDB.h" 41 42using namespace lldb; 43using namespace lldb_private; 44 45 46POSIXThread::POSIXThread(Process &process, lldb::tid_t tid) 47 : Thread(process, tid), 48 m_frame_ap (), 49 m_breakpoint (), 50 m_thread_name_valid (false), 51 m_thread_name (), 52 m_posix_thread(NULL) 53{ 54 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD)); 55 if (log && log->GetMask().Test(POSIX_LOG_VERBOSE)) 56 log->Printf ("POSIXThread::%s (tid = %" PRIi64 ")", __FUNCTION__, tid); 57 58 // Set the current watchpoints for this thread. 59 Target &target = GetProcess()->GetTarget(); 60 const WatchpointList &wp_list = target.GetWatchpointList(); 61 size_t wp_size = wp_list.GetSize(); 62 63 for (uint32_t wp_idx = 0; wp_idx < wp_size; wp_idx++) 64 { 65 lldb::WatchpointSP wp = wp_list.GetByIndex(wp_idx); 66 if (wp.get() && wp->IsEnabled()) 67 { 68 // This watchpoint as been enabled; obviously this "new" thread 69 // has been created since that watchpoint was enabled. Since 70 // the POSIXBreakpointProtocol has yet to be initialized, its 71 // m_watchpoints_initialized member will be FALSE. Attempting to 72 // read the debug status register to determine if a watchpoint 73 // has been hit would result in the zeroing of that register. 74 // Since the active debug registers would have been cloned when 75 // this thread was created, simply force the m_watchpoints_initized 76 // member to TRUE and avoid resetting dr6 and dr7. 77 GetPOSIXBreakpointProtocol()->ForceWatchpointsInitialized(); 78 } 79 } 80} 81 82POSIXThread::~POSIXThread() 83{ 84 DestroyThread(); 85} 86 87ProcessMonitor & 88POSIXThread::GetMonitor() 89{ 90 ProcessSP base = GetProcess(); 91 ProcessPOSIX &process = static_cast<ProcessPOSIX&>(*base); 92 return process.GetMonitor(); 93} 94 95// Overridden by FreeBSDThread; this is used only on Linux. 96void 97POSIXThread::RefreshStateAfterStop() 98{ 99 // Invalidate all registers in our register context. We don't set "force" to 100 // true because the stop reply packet might have had some register values 101 // that were expedited and these will already be copied into the register 102 // context by the time this function gets called. The KDPRegisterContext 103 // class has been made smart enough to detect when it needs to invalidate 104 // which registers are valid by putting hooks in the register read and 105 // register supply functions where they check the process stop ID and do 106 // the right thing. 107 //if (StateIsStoppedState(GetState()) 108 { 109 const bool force = false; 110 GetRegisterContext()->InvalidateIfNeeded (force); 111 } 112 // FIXME: This should probably happen somewhere else. 113 SetResumeState(eStateRunning); 114 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD)); 115 if (log) 116 log->Printf ("POSIXThread::%s (tid = %" PRIi64 ") setting thread resume state to running", __FUNCTION__, GetID()); 117} 118 119const char * 120POSIXThread::GetInfo() 121{ 122 return NULL; 123} 124 125void 126POSIXThread::SetName (const char *name) 127{ 128 m_thread_name_valid = (name && name[0]); 129 if (m_thread_name_valid) 130 m_thread_name.assign (name); 131 else 132 m_thread_name.clear(); 133} 134 135const char * 136POSIXThread::GetName () 137{ 138 if (!m_thread_name_valid) 139 { 140 SetName(Host::GetThreadName(GetProcess()->GetID(), GetID()).c_str()); 141 m_thread_name_valid = true; 142 } 143 144 if (m_thread_name.empty()) 145 return NULL; 146 return m_thread_name.c_str(); 147} 148 149lldb::RegisterContextSP 150POSIXThread::GetRegisterContext() 151{ 152 if (!m_reg_context_sp) 153 { 154 m_posix_thread = NULL; 155 156 RegisterInfoInterface *reg_interface = NULL; 157 const ArchSpec &target_arch = GetProcess()->GetTarget().GetArchitecture(); 158 159 switch (target_arch.GetCore()) 160 { 161 case ArchSpec::eCore_mips64: 162 { 163 switch (target_arch.GetTriple().getOS()) 164 { 165 case llvm::Triple::FreeBSD: 166 reg_interface = new RegisterContextFreeBSD_mips64(target_arch); 167 break; 168 default: 169 assert(false && "OS not supported"); 170 break; 171 } 172 173 if (reg_interface) 174 { 175 RegisterContextPOSIXProcessMonitor_mips64 *reg_ctx = new RegisterContextPOSIXProcessMonitor_mips64(*this, 0, reg_interface); 176 m_posix_thread = reg_ctx; 177 m_reg_context_sp.reset(reg_ctx); 178 } 179 break; 180 } 181 182 case ArchSpec::eCore_x86_32_i386: 183 case ArchSpec::eCore_x86_32_i486: 184 case ArchSpec::eCore_x86_32_i486sx: 185 case ArchSpec::eCore_x86_64_x86_64: 186 { 187 switch (target_arch.GetTriple().getOS()) 188 { 189 case llvm::Triple::FreeBSD: 190 reg_interface = new RegisterContextFreeBSD_x86_64(target_arch); 191 break; 192 case llvm::Triple::Linux: 193 reg_interface = new RegisterContextLinux_x86_64(target_arch); 194 break; 195 default: 196 assert(false && "OS not supported"); 197 break; 198 } 199 200 if (reg_interface) 201 { 202 RegisterContextPOSIXProcessMonitor_x86_64 *reg_ctx = new RegisterContextPOSIXProcessMonitor_x86_64(*this, 0, reg_interface); 203 m_posix_thread = reg_ctx; 204 m_reg_context_sp.reset(reg_ctx); 205 } 206 break; 207 } 208 209 default: 210 assert(false && "CPU type not supported!"); 211 break; 212 } 213 } 214 return m_reg_context_sp; 215} 216 217lldb::RegisterContextSP 218POSIXThread::CreateRegisterContextForFrame(lldb_private::StackFrame *frame) 219{ 220 lldb::RegisterContextSP reg_ctx_sp; 221 uint32_t concrete_frame_idx = 0; 222 223 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD)); 224 if (log && log->GetMask().Test(POSIX_LOG_VERBOSE)) 225 log->Printf ("POSIXThread::%s ()", __FUNCTION__); 226 227 if (frame) 228 concrete_frame_idx = frame->GetConcreteFrameIndex(); 229 230 if (concrete_frame_idx == 0) 231 reg_ctx_sp = GetRegisterContext(); 232 else 233 { 234 assert(GetUnwinder()); 235 reg_ctx_sp = GetUnwinder()->CreateRegisterContextForFrame(frame); 236 } 237 238 return reg_ctx_sp; 239} 240 241lldb::addr_t 242POSIXThread::GetThreadPointer () 243{ 244 ProcessMonitor &monitor = GetMonitor(); 245 addr_t addr; 246 if (monitor.ReadThreadPointer (GetID(), addr)) 247 return addr; 248 else 249 return LLDB_INVALID_ADDRESS; 250} 251 252bool 253POSIXThread::CalculateStopInfo() 254{ 255 SetStopInfo (m_stop_info_sp); 256 return true; 257} 258 259Unwind * 260POSIXThread::GetUnwinder() 261{ 262 if (m_unwinder_ap.get() == NULL) 263 m_unwinder_ap.reset(new UnwindLLDB(*this)); 264 265 return m_unwinder_ap.get(); 266} 267 268// Overridden by FreeBSDThread; this is used only on Linux. 269void 270POSIXThread::WillResume(lldb::StateType resume_state) 271{ 272 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD)); 273 if (log) 274 log->Printf ("POSIXThread::%s (tid = %" PRIi64 ") setting thread resume state to %s", __FUNCTION__, GetID(), StateAsCString(resume_state)); 275 // TODO: the line below shouldn't really be done, but 276 // the POSIXThread might rely on this so I will leave this in for now 277 SetResumeState(resume_state); 278} 279 280void 281POSIXThread::DidStop() 282{ 283 // Don't set the thread state to stopped unless we really stopped. 284} 285 286bool 287POSIXThread::Resume() 288{ 289 lldb::StateType resume_state = GetResumeState(); 290 ProcessMonitor &monitor = GetMonitor(); 291 bool status; 292 293 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD)); 294 if (log) 295 log->Printf ("POSIXThread::%s (), resume_state = %s", __FUNCTION__, 296 StateAsCString(resume_state)); 297 298 switch (resume_state) 299 { 300 default: 301 assert(false && "Unexpected state for resume!"); 302 status = false; 303 break; 304 305 case lldb::eStateRunning: 306 SetState(resume_state); 307 status = monitor.Resume(GetID(), GetResumeSignal()); 308 break; 309 310 case lldb::eStateStepping: 311 SetState(resume_state); 312 status = monitor.SingleStep(GetID(), GetResumeSignal()); 313 break; 314 case lldb::eStateStopped: 315 case lldb::eStateSuspended: 316 status = true; 317 break; 318 } 319 320 return status; 321} 322 323void 324POSIXThread::Notify(const ProcessMessage &message) 325{ 326 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD)); 327 if (log) 328 log->Printf ("POSIXThread::%s () message kind = '%s' for tid %" PRIu64, 329 __FUNCTION__, message.PrintKind(), GetID()); 330 331 switch (message.GetKind()) 332 { 333 default: 334 assert(false && "Unexpected message kind!"); 335 break; 336 337 case ProcessMessage::eExitMessage: 338 // Nothing to be done. 339 break; 340 341 case ProcessMessage::eLimboMessage: 342 LimboNotify(message); 343 break; 344 345 case ProcessMessage::eSignalMessage: 346 SignalNotify(message); 347 break; 348 349 case ProcessMessage::eSignalDeliveredMessage: 350 SignalDeliveredNotify(message); 351 break; 352 353 case ProcessMessage::eTraceMessage: 354 TraceNotify(message); 355 break; 356 357 case ProcessMessage::eBreakpointMessage: 358 BreakNotify(message); 359 break; 360 361 case ProcessMessage::eWatchpointMessage: 362 WatchNotify(message); 363 break; 364 365 case ProcessMessage::eCrashMessage: 366 CrashNotify(message); 367 break; 368 369 case ProcessMessage::eNewThreadMessage: 370 ThreadNotify(message); 371 break; 372 373 case ProcessMessage::eExecMessage: 374 ExecNotify(message); 375 break; 376 } 377} 378 379bool 380POSIXThread::EnableHardwareWatchpoint(Watchpoint *wp) 381{ 382 bool wp_set = false; 383 if (wp) 384 { 385 addr_t wp_addr = wp->GetLoadAddress(); 386 size_t wp_size = wp->GetByteSize(); 387 bool wp_read = wp->WatchpointRead(); 388 bool wp_write = wp->WatchpointWrite(); 389 uint32_t wp_hw_index = wp->GetHardwareIndex(); 390 POSIXBreakpointProtocol* reg_ctx = GetPOSIXBreakpointProtocol(); 391 if (reg_ctx) 392 wp_set = reg_ctx->SetHardwareWatchpointWithIndex(wp_addr, wp_size, 393 wp_read, wp_write, 394 wp_hw_index); 395 } 396 return wp_set; 397} 398 399bool 400POSIXThread::DisableHardwareWatchpoint(Watchpoint *wp) 401{ 402 bool result = false; 403 if (wp) 404 { 405 lldb::RegisterContextSP reg_ctx_sp = GetRegisterContext(); 406 if (reg_ctx_sp.get()) 407 result = reg_ctx_sp->ClearHardwareWatchpoint(wp->GetHardwareIndex()); 408 } 409 return result; 410} 411 412uint32_t 413POSIXThread::NumSupportedHardwareWatchpoints() 414{ 415 lldb::RegisterContextSP reg_ctx_sp = GetRegisterContext(); 416 if (reg_ctx_sp.get()) 417 return reg_ctx_sp->NumSupportedHardwareWatchpoints(); 418 return 0; 419} 420 421uint32_t 422POSIXThread::FindVacantWatchpointIndex() 423{ 424 uint32_t hw_index = LLDB_INVALID_INDEX32; 425 uint32_t num_hw_wps = NumSupportedHardwareWatchpoints(); 426 uint32_t wp_idx; 427 POSIXBreakpointProtocol* reg_ctx = GetPOSIXBreakpointProtocol(); 428 if (reg_ctx) 429 { 430 for (wp_idx = 0; wp_idx < num_hw_wps; wp_idx++) 431 { 432 if (reg_ctx->IsWatchpointVacant(wp_idx)) 433 { 434 hw_index = wp_idx; 435 break; 436 } 437 } 438 } 439 return hw_index; 440} 441 442void 443POSIXThread::BreakNotify(const ProcessMessage &message) 444{ 445 bool status; 446 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD)); 447 448 assert(GetRegisterContext()); 449 status = GetPOSIXBreakpointProtocol()->UpdateAfterBreakpoint(); 450 assert(status && "Breakpoint update failed!"); 451 452 // With our register state restored, resolve the breakpoint object 453 // corresponding to our current PC. 454 assert(GetRegisterContext()); 455 lldb::addr_t pc = GetRegisterContext()->GetPC(); 456 if (log) 457 log->Printf ("POSIXThread::%s () PC=0x%8.8" PRIx64, __FUNCTION__, pc); 458 lldb::BreakpointSiteSP bp_site(GetProcess()->GetBreakpointSiteList().FindByAddress(pc)); 459 460 // If the breakpoint is for this thread, then we'll report the hit, but if it is for another thread, 461 // we create a stop reason with should_stop=false. If there is no breakpoint location, then report 462 // an invalid stop reason. We don't need to worry about stepping over the breakpoint here, that will 463 // be taken care of when the thread resumes and notices that there's a breakpoint under the pc. 464 if (bp_site) 465 { 466 lldb::break_id_t bp_id = bp_site->GetID(); 467 if (bp_site->ValidForThisThread(this)) 468 SetStopInfo (StopInfo::CreateStopReasonWithBreakpointSiteID(*this, bp_id)); 469 else 470 { 471 const bool should_stop = false; 472 SetStopInfo (StopInfo::CreateStopReasonWithBreakpointSiteID(*this, bp_id, should_stop)); 473 } 474 } 475 else 476 SetStopInfo(StopInfoSP()); 477} 478 479void 480POSIXThread::WatchNotify(const ProcessMessage &message) 481{ 482 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD)); 483 484 lldb::addr_t halt_addr = message.GetHWAddress(); 485 if (log) 486 log->Printf ("POSIXThread::%s () Hardware Watchpoint Address = 0x%8.8" 487 PRIx64, __FUNCTION__, halt_addr); 488 489 POSIXBreakpointProtocol* reg_ctx = GetPOSIXBreakpointProtocol(); 490 if (reg_ctx) 491 { 492 uint32_t num_hw_wps = reg_ctx->NumSupportedHardwareWatchpoints(); 493 uint32_t wp_idx; 494 for (wp_idx = 0; wp_idx < num_hw_wps; wp_idx++) 495 { 496 if (reg_ctx->IsWatchpointHit(wp_idx)) 497 { 498 // Clear the watchpoint hit here 499 reg_ctx->ClearWatchpointHits(); 500 break; 501 } 502 } 503 504 if (wp_idx == num_hw_wps) 505 return; 506 507 Target &target = GetProcess()->GetTarget(); 508 lldb::addr_t wp_monitor_addr = reg_ctx->GetWatchpointAddress(wp_idx); 509 const WatchpointList &wp_list = target.GetWatchpointList(); 510 lldb::WatchpointSP wp_sp = wp_list.FindByAddress(wp_monitor_addr); 511 512 assert(wp_sp.get() && "No watchpoint found"); 513 SetStopInfo (StopInfo::CreateStopReasonWithWatchpointID(*this, 514 wp_sp->GetID())); 515 } 516} 517 518void 519POSIXThread::TraceNotify(const ProcessMessage &message) 520{ 521 POSIXBreakpointProtocol* reg_ctx = GetPOSIXBreakpointProtocol(); 522 if (reg_ctx) 523 { 524 uint32_t num_hw_wps = reg_ctx->NumSupportedHardwareWatchpoints(); 525 uint32_t wp_idx; 526 for (wp_idx = 0; wp_idx < num_hw_wps; wp_idx++) 527 { 528 if (reg_ctx->IsWatchpointHit(wp_idx)) 529 { 530 WatchNotify(message); 531 return; 532 } 533 } 534 } 535 536 SetStopInfo (StopInfo::CreateStopReasonToTrace(*this)); 537} 538 539void 540POSIXThread::LimboNotify(const ProcessMessage &message) 541{ 542 SetStopInfo (lldb::StopInfoSP(new POSIXLimboStopInfo(*this))); 543} 544 545void 546POSIXThread::SignalNotify(const ProcessMessage &message) 547{ 548 int signo = message.GetSignal(); 549 550 SetStopInfo (StopInfo::CreateStopReasonWithSignal(*this, signo)); 551 SetResumeSignal(signo); 552} 553 554void 555POSIXThread::SignalDeliveredNotify(const ProcessMessage &message) 556{ 557 int signo = message.GetSignal(); 558 559 SetStopInfo (StopInfo::CreateStopReasonWithSignal(*this, signo)); 560 SetResumeSignal(signo); 561} 562 563void 564POSIXThread::CrashNotify(const ProcessMessage &message) 565{ 566 // FIXME: Update stop reason as per bugzilla 14598 567 int signo = message.GetSignal(); 568 569 assert(message.GetKind() == ProcessMessage::eCrashMessage); 570 571 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD)); 572 if (log) 573 log->Printf ("POSIXThread::%s () signo = %i, reason = '%s'", 574 __FUNCTION__, signo, message.PrintCrashReason()); 575 576 SetStopInfo (lldb::StopInfoSP(new POSIXCrashStopInfo(*this, signo, 577 message.GetCrashReason(), 578 message.GetFaultAddress()))); 579 SetResumeSignal(signo); 580} 581 582void 583POSIXThread::ThreadNotify(const ProcessMessage &message) 584{ 585 SetStopInfo (lldb::StopInfoSP(new POSIXNewThreadStopInfo(*this))); 586} 587 588unsigned 589POSIXThread::GetRegisterIndexFromOffset(unsigned offset) 590{ 591 unsigned reg = LLDB_INVALID_REGNUM; 592 ArchSpec arch = Host::GetArchitecture(); 593 594 switch (arch.GetCore()) 595 { 596 default: 597 llvm_unreachable("CPU type not supported!"); 598 break; 599 600 case ArchSpec::eCore_mips64: 601 case ArchSpec::eCore_x86_32_i386: 602 case ArchSpec::eCore_x86_32_i486: 603 case ArchSpec::eCore_x86_32_i486sx: 604 case ArchSpec::eCore_x86_64_x86_64: 605 { 606 POSIXBreakpointProtocol* reg_ctx = GetPOSIXBreakpointProtocol(); 607 reg = reg_ctx->GetRegisterIndexFromOffset(offset); 608 } 609 break; 610 } 611 return reg; 612} 613 614void 615POSIXThread::ExecNotify(const ProcessMessage &message) 616{ 617 SetStopInfo (StopInfo::CreateStopReasonWithExec(*this)); 618} 619 620const char * 621POSIXThread::GetRegisterName(unsigned reg) 622{ 623 const char * name = nullptr; 624 ArchSpec arch = Host::GetArchitecture(); 625 626 switch (arch.GetCore()) 627 { 628 default: 629 assert(false && "CPU type not supported!"); 630 break; 631 632 case ArchSpec::eCore_mips64: 633 case ArchSpec::eCore_x86_32_i386: 634 case ArchSpec::eCore_x86_32_i486: 635 case ArchSpec::eCore_x86_32_i486sx: 636 case ArchSpec::eCore_x86_64_x86_64: 637 name = GetRegisterContext()->GetRegisterName(reg); 638 break; 639 } 640 return name; 641} 642 643const char * 644POSIXThread::GetRegisterNameFromOffset(unsigned offset) 645{ 646 return GetRegisterName(GetRegisterIndexFromOffset(offset)); 647} 648 649