1 //===-- NativeThreadLinux.cpp --------------------------------- -*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "NativeThreadLinux.h"
15 #include "NativeProcessLinux.h"
16 #include "NativeRegisterContextLinux.h"
17 #include "SingleStepCheck.h"
19 #include "lldb/Core/Log.h"
20 #include "lldb/Core/State.h"
21 #include "lldb/Host/HostNativeThread.h"
22 #include "lldb/Host/linux/Ptrace.h"
23 #include "lldb/Utility/LLDBAssert.h"
24 #include "lldb/lldb-enumerations.h"
26 #include "llvm/ADT/SmallString.h"
28 #include "Plugins/Process/POSIX/CrashReason.h"
30 #include <sys/syscall.h>
31 // Try to define a macro to encapsulate the tgkill syscall
32 #define tgkill(pid, tid, sig) \
33 syscall(__NR_tgkill, static_cast<::pid_t>(pid), static_cast<::pid_t>(tid), \
37 using namespace lldb_private;
38 using namespace lldb_private::process_linux;
41 void LogThreadStopInfo(Log &log, const ThreadStopInfo &stop_info,
42 const char *const header) {
43 switch (stop_info.reason) {
45 log.Printf("%s: %s no stop reason", __FUNCTION__, header);
47 case eStopReasonTrace:
48 log.Printf("%s: %s trace, stopping signal 0x%" PRIx32, __FUNCTION__, header,
49 stop_info.details.signal.signo);
51 case eStopReasonBreakpoint:
52 log.Printf("%s: %s breakpoint, stopping signal 0x%" PRIx32, __FUNCTION__,
53 header, stop_info.details.signal.signo);
55 case eStopReasonWatchpoint:
56 log.Printf("%s: %s watchpoint, stopping signal 0x%" PRIx32, __FUNCTION__,
57 header, stop_info.details.signal.signo);
59 case eStopReasonSignal:
60 log.Printf("%s: %s signal 0x%02" PRIx32, __FUNCTION__, header,
61 stop_info.details.signal.signo);
63 case eStopReasonException:
64 log.Printf("%s: %s exception type 0x%02" PRIx64, __FUNCTION__, header,
65 stop_info.details.exception.type);
68 log.Printf("%s: %s exec, stopping signal 0x%" PRIx32, __FUNCTION__, header,
69 stop_info.details.signal.signo);
71 case eStopReasonPlanComplete:
72 log.Printf("%s: %s plan complete", __FUNCTION__, header);
74 case eStopReasonThreadExiting:
75 log.Printf("%s: %s thread exiting", __FUNCTION__, header);
77 case eStopReasonInstrumentation:
78 log.Printf("%s: %s instrumentation", __FUNCTION__, header);
81 log.Printf("%s: %s invalid stop reason %" PRIu32, __FUNCTION__, header,
82 static_cast<uint32_t>(stop_info.reason));
87 NativeThreadLinux::NativeThreadLinux(NativeProcessLinux *process,
89 : NativeThreadProtocol(process, tid), m_state(StateType::eStateInvalid),
90 m_stop_info(), m_reg_context_sp(), m_stop_description() {}
92 std::string NativeThreadLinux::GetName() {
93 NativeProcessProtocolSP process_sp = m_process_wp.lock();
95 return "<unknown: no process>";
97 // const NativeProcessLinux *const process =
98 // reinterpret_cast<NativeProcessLinux*> (process_sp->get ());
99 llvm::SmallString<32> thread_name;
100 HostNativeThread::GetName(GetID(), thread_name);
101 return thread_name.c_str();
104 lldb::StateType NativeThreadLinux::GetState() { return m_state; }
106 bool NativeThreadLinux::GetStopReason(ThreadStopInfo &stop_info,
107 std::string &description) {
108 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD));
116 case eStateSuspended:
119 LogThreadStopInfo(*log, m_stop_info, "m_stop_info in thread:");
120 stop_info = m_stop_info;
121 description = m_stop_description;
123 LogThreadStopInfo(*log, stop_info, "returned stop_info:");
128 case eStateConnected:
129 case eStateAttaching:
130 case eStateLaunching:
135 log->Printf("NativeThreadLinux::%s tid %" PRIu64
136 " in state %s cannot answer stop reason",
137 __FUNCTION__, GetID(), StateAsCString(m_state));
141 llvm_unreachable("unhandled StateType!");
144 NativeRegisterContextSP NativeThreadLinux::GetRegisterContext() {
145 // Return the register context if we already created it.
146 if (m_reg_context_sp)
147 return m_reg_context_sp;
149 NativeProcessProtocolSP m_process_sp = m_process_wp.lock();
151 return NativeRegisterContextSP();
153 ArchSpec target_arch;
154 if (!m_process_sp->GetArchitecture(target_arch))
155 return NativeRegisterContextSP();
157 const uint32_t concrete_frame_idx = 0;
158 m_reg_context_sp.reset(
159 NativeRegisterContextLinux::CreateHostNativeRegisterContextLinux(
160 target_arch, *this, concrete_frame_idx));
162 return m_reg_context_sp;
165 Error NativeThreadLinux::SetWatchpoint(lldb::addr_t addr, size_t size,
166 uint32_t watch_flags, bool hardware) {
168 return Error("not implemented");
169 if (m_state == eStateLaunching)
171 Error error = RemoveWatchpoint(addr);
174 NativeRegisterContextSP reg_ctx = GetRegisterContext();
175 uint32_t wp_index = reg_ctx->SetHardwareWatchpoint(addr, size, watch_flags);
176 if (wp_index == LLDB_INVALID_INDEX32)
177 return Error("Setting hardware watchpoint failed.");
178 m_watchpoint_index_map.insert({addr, wp_index});
182 Error NativeThreadLinux::RemoveWatchpoint(lldb::addr_t addr) {
183 auto wp = m_watchpoint_index_map.find(addr);
184 if (wp == m_watchpoint_index_map.end())
186 uint32_t wp_index = wp->second;
187 m_watchpoint_index_map.erase(wp);
188 if (GetRegisterContext()->ClearHardwareWatchpoint(wp_index))
190 return Error("Clearing hardware watchpoint failed.");
193 Error NativeThreadLinux::Resume(uint32_t signo) {
194 const StateType new_state = StateType::eStateRunning;
195 MaybeLogStateChange(new_state);
198 m_stop_info.reason = StopReason::eStopReasonNone;
199 m_stop_description.clear();
201 // If watchpoints have been set, but none on this thread,
202 // then this is a new thread. So set all existing watchpoints.
203 if (m_watchpoint_index_map.empty()) {
204 NativeProcessLinux &process = GetProcess();
206 const auto &watchpoint_map = process.GetWatchpointMap();
207 GetRegisterContext()->ClearAllHardwareWatchpoints();
208 for (const auto &pair : watchpoint_map) {
209 const auto &wp = pair.second;
210 SetWatchpoint(wp.m_addr, wp.m_size, wp.m_watch_flags, wp.m_hardware);
216 if (signo != LLDB_INVALID_SIGNAL_NUMBER)
219 return NativeProcessLinux::PtraceWrapper(PTRACE_CONT, GetID(), nullptr,
220 reinterpret_cast<void *>(data));
223 void NativeThreadLinux::MaybePrepareSingleStepWorkaround() {
224 if (!SingleStepWorkaroundNeeded())
227 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD));
229 if (sched_getaffinity(static_cast<::pid_t>(m_tid), sizeof m_original_cpu_set,
230 &m_original_cpu_set) != 0) {
231 // This should really not fail. But, just in case...
233 Error error(errno, eErrorTypePOSIX);
235 "NativeThreadLinux::%s Unable to get cpu affinity for thread %" PRIx64
237 __FUNCTION__, m_tid, error.AsCString());
245 if (sched_setaffinity(static_cast<::pid_t>(m_tid), sizeof set, &set) != 0 &&
247 // This may fail in very locked down systems, if the thread is not allowed
249 // cpu 0. If that happens, only thing we can do is it log it and continue...
250 Error error(errno, eErrorTypePOSIX);
252 "NativeThreadLinux::%s Unable to set cpu affinity for thread %" PRIx64
254 __FUNCTION__, m_tid, error.AsCString());
258 void NativeThreadLinux::MaybeCleanupSingleStepWorkaround() {
259 if (!SingleStepWorkaroundNeeded())
262 if (sched_setaffinity(static_cast<::pid_t>(m_tid), sizeof m_original_cpu_set,
263 &m_original_cpu_set) != 0) {
264 Error error(errno, eErrorTypePOSIX);
265 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD));
267 "NativeThreadLinux::%s Unable to reset cpu affinity for thread %" PRIx64
269 __FUNCTION__, m_tid, error.AsCString());
273 Error NativeThreadLinux::SingleStep(uint32_t signo) {
274 const StateType new_state = StateType::eStateStepping;
275 MaybeLogStateChange(new_state);
277 m_stop_info.reason = StopReason::eStopReasonNone;
279 MaybePrepareSingleStepWorkaround();
282 if (signo != LLDB_INVALID_SIGNAL_NUMBER)
285 // If hardware single-stepping is not supported, we just do a continue. The
287 // next instruction has been setup in NativeProcessLinux::Resume.
288 return NativeProcessLinux::PtraceWrapper(
289 GetProcess().SupportHardwareSingleStepping() ? PTRACE_SINGLESTEP
291 m_tid, nullptr, reinterpret_cast<void *>(data));
294 void NativeThreadLinux::SetStoppedBySignal(uint32_t signo,
295 const siginfo_t *info) {
296 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD));
298 log->Printf("NativeThreadLinux::%s called with signal 0x%02" PRIx32,
299 __FUNCTION__, signo);
303 m_stop_info.reason = StopReason::eStopReasonSignal;
304 m_stop_info.details.signal.signo = signo;
306 m_stop_description.clear();
313 // In case of MIPS64 target, SI_KERNEL is generated for invalid 64bit
316 (info->si_signo == SIGBUS && info->si_code == SI_KERNEL)
317 ? CrashReason::eInvalidAddress
318 : GetCrashReason(*info);
319 m_stop_description = GetCrashReasonString(reason, *info);
325 bool NativeThreadLinux::IsStopped(int *signo) {
326 if (!StateIsStoppedState(m_state, false))
329 // If we are stopped by a signal, return the signo.
330 if (signo && m_state == StateType::eStateStopped &&
331 m_stop_info.reason == StopReason::eStopReasonSignal) {
332 *signo = m_stop_info.details.signal.signo;
335 // Regardless, we are stopped.
339 void NativeThreadLinux::SetStopped() {
340 if (m_state == StateType::eStateStepping)
341 MaybeCleanupSingleStepWorkaround();
343 const StateType new_state = StateType::eStateStopped;
344 MaybeLogStateChange(new_state);
346 m_stop_description.clear();
349 void NativeThreadLinux::SetStoppedByExec() {
350 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD));
352 log->Printf("NativeThreadLinux::%s()", __FUNCTION__);
356 m_stop_info.reason = StopReason::eStopReasonExec;
357 m_stop_info.details.signal.signo = SIGSTOP;
360 void NativeThreadLinux::SetStoppedByBreakpoint() {
363 m_stop_info.reason = StopReason::eStopReasonBreakpoint;
364 m_stop_info.details.signal.signo = SIGTRAP;
365 m_stop_description.clear();
368 void NativeThreadLinux::SetStoppedByWatchpoint(uint32_t wp_index) {
371 lldbassert(wp_index != LLDB_INVALID_INDEX32 && "wp_index cannot be invalid");
373 std::ostringstream ostr;
374 ostr << GetRegisterContext()->GetWatchpointAddress(wp_index) << " ";
378 * MIPS: Last 3bits of the watchpoint address are masked by the kernel. For
380 * 'n' is at 0x120010d00 and 'm' is 0x120010d04. When a watchpoint is set at
382 * watch exception is generated even when 'n' is read/written. To handle this
384 * find the base address of the load/store instruction and append it in the
388 ostr << " " << GetRegisterContext()->GetWatchpointHitAddress(wp_index);
390 m_stop_description = ostr.str();
392 m_stop_info.reason = StopReason::eStopReasonWatchpoint;
393 m_stop_info.details.signal.signo = SIGTRAP;
396 bool NativeThreadLinux::IsStoppedAtBreakpoint() {
397 return GetState() == StateType::eStateStopped &&
398 m_stop_info.reason == StopReason::eStopReasonBreakpoint;
401 bool NativeThreadLinux::IsStoppedAtWatchpoint() {
402 return GetState() == StateType::eStateStopped &&
403 m_stop_info.reason == StopReason::eStopReasonWatchpoint;
406 void NativeThreadLinux::SetStoppedByTrace() {
409 m_stop_info.reason = StopReason::eStopReasonTrace;
410 m_stop_info.details.signal.signo = SIGTRAP;
413 void NativeThreadLinux::SetStoppedWithNoReason() {
416 m_stop_info.reason = StopReason::eStopReasonNone;
417 m_stop_info.details.signal.signo = 0;
420 void NativeThreadLinux::SetExited() {
421 const StateType new_state = StateType::eStateExited;
422 MaybeLogStateChange(new_state);
425 m_stop_info.reason = StopReason::eStopReasonThreadExiting;
428 Error NativeThreadLinux::RequestStop() {
429 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD));
431 NativeProcessLinux &process = GetProcess();
433 lldb::pid_t pid = process.GetID();
434 lldb::tid_t tid = GetID();
437 log->Printf("NativeThreadLinux::%s requesting thread stop(pid: %" PRIu64
438 ", tid: %" PRIu64 ")",
439 __FUNCTION__, pid, tid);
443 if (::tgkill(pid, tid, SIGSTOP) != 0) {
444 err.SetErrorToErrno();
446 log->Printf("NativeThreadLinux::%s tgkill(%" PRIu64 ", %" PRIu64
447 ", SIGSTOP) failed: %s",
448 __FUNCTION__, pid, tid, err.AsCString());
454 void NativeThreadLinux::MaybeLogStateChange(lldb::StateType new_state) {
455 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD));
456 // If we're not logging, we're done.
460 // If this is a state change to the same state, we're done.
461 lldb::StateType old_state = m_state;
462 if (new_state == old_state)
465 NativeProcessProtocolSP m_process_sp = m_process_wp.lock();
467 m_process_sp ? m_process_sp->GetID() : LLDB_INVALID_PROCESS_ID;
470 log->Printf("NativeThreadLinux: thread (pid=%" PRIu64 ", tid=%" PRIu64
471 ") changing from state %s to %s",
472 pid, GetID(), StateAsCString(old_state),
473 StateAsCString(new_state));
476 NativeProcessLinux &NativeThreadLinux::GetProcess() {
477 auto process_sp = std::static_pointer_cast<NativeProcessLinux>(
478 NativeThreadProtocol::GetProcess());