blob: d18d3c16d2c973af8fd13385403e7022c2dd57ec [file] [log] [blame]
Todd Fialaaf245d12014-06-30 21:05:18 +00001//===-- NativeThreadLinux.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 "NativeThreadLinux.h"
11
12#include <signal.h>
Chaoren Lin18fe6402015-02-03 01:51:47 +000013#include <sstream>
Todd Fialaaf245d12014-06-30 21:05:18 +000014
15#include "NativeProcessLinux.h"
Pavel Labath0f4b17d2015-08-24 13:25:54 +000016#include "NativeRegisterContextLinux.h"
Pavel Labath605b51b2016-02-23 13:56:30 +000017#include "SingleStepCheck.h"
Todd Fiala2850b1b2014-06-30 23:51:35 +000018
Todd Fialaaf245d12014-06-30 21:05:18 +000019#include "lldb/Core/Log.h"
20#include "lldb/Core/State.h"
Zachary Turner39de3112014-09-09 20:54:56 +000021#include "lldb/Host/HostNativeThread.h"
Pavel Labath605b51b2016-02-23 13:56:30 +000022#include "lldb/Host/linux/Ptrace.h"
Chaoren Linc16f5dc2015-03-19 23:28:10 +000023#include "lldb/Utility/LLDBAssert.h"
Todd Fialaaf245d12014-06-30 21:05:18 +000024#include "lldb/lldb-enumerations.h"
Zachary Turner39de3112014-09-09 20:54:56 +000025
26#include "llvm/ADT/SmallString.h"
27
Chaoren Lin28e57422015-02-03 01:51:25 +000028#include "Plugins/Process/POSIX/CrashReason.h"
29
Pavel Labath8c8ff7a2015-05-11 10:03:10 +000030#include <sys/syscall.h>
31// Try to define a macro to encapsulate the tgkill syscall
Kate Stoneb9c1b512016-09-06 20:57:50 +000032#define tgkill(pid, tid, sig) \
33 syscall(__NR_tgkill, static_cast<::pid_t>(pid), static_cast<::pid_t>(tid), \
34 sig)
Pavel Labath8c8ff7a2015-05-11 10:03:10 +000035
Todd Fialaaf245d12014-06-30 21:05:18 +000036using namespace lldb;
37using namespace lldb_private;
Tamas Berghammerdb264a62015-03-31 09:52:22 +000038using namespace lldb_private::process_linux;
Todd Fialaaf245d12014-06-30 21:05:18 +000039
Kate Stoneb9c1b512016-09-06 20:57:50 +000040namespace {
41void LogThreadStopInfo(Log &log, const ThreadStopInfo &stop_info,
42 const char *const header) {
43 switch (stop_info.reason) {
44 case eStopReasonNone:
45 log.Printf("%s: %s no stop reason", __FUNCTION__, header);
46 return;
47 case eStopReasonTrace:
48 log.Printf("%s: %s trace, stopping signal 0x%" PRIx32, __FUNCTION__, header,
49 stop_info.details.signal.signo);
50 return;
51 case eStopReasonBreakpoint:
52 log.Printf("%s: %s breakpoint, stopping signal 0x%" PRIx32, __FUNCTION__,
53 header, stop_info.details.signal.signo);
54 return;
55 case eStopReasonWatchpoint:
56 log.Printf("%s: %s watchpoint, stopping signal 0x%" PRIx32, __FUNCTION__,
57 header, stop_info.details.signal.signo);
58 return;
59 case eStopReasonSignal:
60 log.Printf("%s: %s signal 0x%02" PRIx32, __FUNCTION__, header,
61 stop_info.details.signal.signo);
62 return;
63 case eStopReasonException:
64 log.Printf("%s: %s exception type 0x%02" PRIx64, __FUNCTION__, header,
65 stop_info.details.exception.type);
66 return;
67 case eStopReasonExec:
68 log.Printf("%s: %s exec, stopping signal 0x%" PRIx32, __FUNCTION__, header,
69 stop_info.details.signal.signo);
70 return;
71 case eStopReasonPlanComplete:
72 log.Printf("%s: %s plan complete", __FUNCTION__, header);
73 return;
74 case eStopReasonThreadExiting:
75 log.Printf("%s: %s thread exiting", __FUNCTION__, header);
76 return;
77 case eStopReasonInstrumentation:
78 log.Printf("%s: %s instrumentation", __FUNCTION__, header);
79 return;
80 default:
81 log.Printf("%s: %s invalid stop reason %" PRIu32, __FUNCTION__, header,
82 static_cast<uint32_t>(stop_info.reason));
83 }
84}
Todd Fialaaf245d12014-06-30 21:05:18 +000085}
86
Kate Stoneb9c1b512016-09-06 20:57:50 +000087NativeThreadLinux::NativeThreadLinux(NativeProcessLinux *process,
88 lldb::tid_t tid)
89 : NativeThreadProtocol(process, tid), m_state(StateType::eStateInvalid),
90 m_stop_info(), m_reg_context_sp(), m_stop_description() {}
91
92std::string NativeThreadLinux::GetName() {
93 NativeProcessProtocolSP process_sp = m_process_wp.lock();
94 if (!process_sp)
95 return "<unknown: no process>";
96
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();
Todd Fialaaf245d12014-06-30 21:05:18 +0000102}
103
Kate Stoneb9c1b512016-09-06 20:57:50 +0000104lldb::StateType NativeThreadLinux::GetState() { return m_state; }
Todd Fialaaf245d12014-06-30 21:05:18 +0000105
Kate Stoneb9c1b512016-09-06 20:57:50 +0000106bool NativeThreadLinux::GetStopReason(ThreadStopInfo &stop_info,
107 std::string &description) {
108 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD));
Todd Fialaaf245d12014-06-30 21:05:18 +0000109
Kate Stoneb9c1b512016-09-06 20:57:50 +0000110 description.clear();
Todd Fialaaf245d12014-06-30 21:05:18 +0000111
Kate Stoneb9c1b512016-09-06 20:57:50 +0000112 switch (m_state) {
113 case eStateStopped:
114 case eStateCrashed:
115 case eStateExited:
116 case eStateSuspended:
117 case eStateUnloaded:
Todd Fialaaf245d12014-06-30 21:05:18 +0000118 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000119 LogThreadStopInfo(*log, m_stop_info, "m_stop_info in thread:");
120 stop_info = m_stop_info;
121 description = m_stop_description;
122 if (log)
123 LogThreadStopInfo(*log, stop_info, "returned stop_info:");
Todd Fialaaf245d12014-06-30 21:05:18 +0000124
Todd Fiala511e5cd2014-09-11 23:29:14 +0000125 return true;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000126
127 case eStateInvalid:
128 case eStateConnected:
129 case eStateAttaching:
130 case eStateLaunching:
131 case eStateRunning:
132 case eStateStepping:
133 case eStateDetached:
134 if (log) {
135 log->Printf("NativeThreadLinux::%s tid %" PRIu64
136 " in state %s cannot answer stop reason",
137 __FUNCTION__, GetID(), StateAsCString(m_state));
138 }
139 return false;
140 }
141 llvm_unreachable("unhandled StateType!");
Todd Fiala511e5cd2014-09-11 23:29:14 +0000142}
143
Kate Stoneb9c1b512016-09-06 20:57:50 +0000144NativeRegisterContextSP NativeThreadLinux::GetRegisterContext() {
145 // Return the register context if we already created it.
146 if (m_reg_context_sp)
147 return m_reg_context_sp;
Pavel Labath605b51b2016-02-23 13:56:30 +0000148
Kate Stoneb9c1b512016-09-06 20:57:50 +0000149 NativeProcessProtocolSP m_process_sp = m_process_wp.lock();
150 if (!m_process_sp)
151 return NativeRegisterContextSP();
152
153 ArchSpec target_arch;
154 if (!m_process_sp->GetArchitecture(target_arch))
155 return NativeRegisterContextSP();
156
157 const uint32_t concrete_frame_idx = 0;
158 m_reg_context_sp.reset(
159 NativeRegisterContextLinux::CreateHostNativeRegisterContextLinux(
160 target_arch, *this, concrete_frame_idx));
161
162 return m_reg_context_sp;
Pavel Labath605b51b2016-02-23 13:56:30 +0000163}
Todd Fiala511e5cd2014-09-11 23:29:14 +0000164
Kate Stoneb9c1b512016-09-06 20:57:50 +0000165Error NativeThreadLinux::SetWatchpoint(lldb::addr_t addr, size_t size,
166 uint32_t watch_flags, bool hardware) {
167 if (!hardware)
168 return Error("not implemented");
169 if (m_state == eStateLaunching)
Mehdi Amini665be502016-11-11 05:07:57 +0000170 return Error();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000171 Error error = RemoveWatchpoint(addr);
172 if (error.Fail())
173 return error;
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});
Mehdi Amini665be502016-11-11 05:07:57 +0000179 return Error();
Todd Fialaa9882ce2014-08-28 15:46:54 +0000180}
181
Kate Stoneb9c1b512016-09-06 20:57:50 +0000182Error NativeThreadLinux::RemoveWatchpoint(lldb::addr_t addr) {
183 auto wp = m_watchpoint_index_map.find(addr);
184 if (wp == m_watchpoint_index_map.end())
Mehdi Amini665be502016-11-11 05:07:57 +0000185 return Error();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000186 uint32_t wp_index = wp->second;
187 m_watchpoint_index_map.erase(wp);
188 if (GetRegisterContext()->ClearHardwareWatchpoint(wp_index))
Mehdi Amini665be502016-11-11 05:07:57 +0000189 return Error();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000190 return Error("Clearing hardware watchpoint failed.");
Chaoren Lin18fe6402015-02-03 01:51:47 +0000191}
192
Kate Stoneb9c1b512016-09-06 20:57:50 +0000193Error NativeThreadLinux::Resume(uint32_t signo) {
194 const StateType new_state = StateType::eStateRunning;
195 MaybeLogStateChange(new_state);
196 m_state = new_state;
Tamas Berghammereadb2a92015-03-17 14:40:57 +0000197
Kate Stoneb9c1b512016-09-06 20:57:50 +0000198 m_stop_info.reason = StopReason::eStopReasonNone;
199 m_stop_description.clear();
Tamas Berghammereadb2a92015-03-17 14:40:57 +0000200
Kate Stoneb9c1b512016-09-06 20:57:50 +0000201 // 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()) {
Pavel Labath605b51b2016-02-23 13:56:30 +0000204 NativeProcessLinux &process = GetProcess();
Pavel Labath8c8ff7a2015-05-11 10:03:10 +0000205
Kate Stoneb9c1b512016-09-06 20:57:50 +0000206 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);
Pavel Labath8c8ff7a2015-05-11 10:03:10 +0000211 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000212 }
Pavel Labath8c8ff7a2015-05-11 10:03:10 +0000213
Kate Stoneb9c1b512016-09-06 20:57:50 +0000214 intptr_t data = 0;
215
216 if (signo != LLDB_INVALID_SIGNAL_NUMBER)
217 data = signo;
218
219 return NativeProcessLinux::PtraceWrapper(PTRACE_CONT, GetID(), nullptr,
220 reinterpret_cast<void *>(data));
Pavel Labath8c8ff7a2015-05-11 10:03:10 +0000221}
222
Kate Stoneb9c1b512016-09-06 20:57:50 +0000223void NativeThreadLinux::MaybePrepareSingleStepWorkaround() {
224 if (!SingleStepWorkaroundNeeded())
225 return;
Todd Fialaaf245d12014-06-30 21:05:18 +0000226
Kate Stoneb9c1b512016-09-06 20:57:50 +0000227 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD));
Todd Fialaaf245d12014-06-30 21:05:18 +0000228
Kate Stoneb9c1b512016-09-06 20:57:50 +0000229 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...
232 if (log) {
233 Error error(errno, eErrorTypePOSIX);
234 log->Printf(
235 "NativeThreadLinux::%s Unable to get cpu affinity for thread %" PRIx64
236 ": %s",
237 __FUNCTION__, m_tid, error.AsCString());
238 }
239 return;
240 }
Todd Fialaaf245d12014-06-30 21:05:18 +0000241
Kate Stoneb9c1b512016-09-06 20:57:50 +0000242 cpu_set_t set;
243 CPU_ZERO(&set);
244 CPU_SET(0, &set);
245 if (sched_setaffinity(static_cast<::pid_t>(m_tid), sizeof set, &set) != 0 &&
246 log) {
247 // This may fail in very locked down systems, if the thread is not allowed
248 // to run on
249 // cpu 0. If that happens, only thing we can do is it log it and continue...
250 Error error(errno, eErrorTypePOSIX);
251 log->Printf(
252 "NativeThreadLinux::%s Unable to set cpu affinity for thread %" PRIx64
253 ": %s",
254 __FUNCTION__, m_tid, error.AsCString());
255 }
Todd Fialaaf245d12014-06-30 21:05:18 +0000256}
Pavel Labath605b51b2016-02-23 13:56:30 +0000257
Kate Stoneb9c1b512016-09-06 20:57:50 +0000258void NativeThreadLinux::MaybeCleanupSingleStepWorkaround() {
259 if (!SingleStepWorkaroundNeeded())
260 return;
261
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));
266 log->Printf(
267 "NativeThreadLinux::%s Unable to reset cpu affinity for thread %" PRIx64
268 ": %s",
269 __FUNCTION__, m_tid, error.AsCString());
270 }
271}
272
273Error NativeThreadLinux::SingleStep(uint32_t signo) {
274 const StateType new_state = StateType::eStateStepping;
275 MaybeLogStateChange(new_state);
276 m_state = new_state;
277 m_stop_info.reason = StopReason::eStopReasonNone;
278
279 MaybePrepareSingleStepWorkaround();
280
281 intptr_t data = 0;
282 if (signo != LLDB_INVALID_SIGNAL_NUMBER)
283 data = signo;
284
285 // If hardware single-stepping is not supported, we just do a continue. The
286 // breakpoint on the
287 // next instruction has been setup in NativeProcessLinux::Resume.
288 return NativeProcessLinux::PtraceWrapper(
289 GetProcess().SupportHardwareSingleStepping() ? PTRACE_SINGLESTEP
290 : PTRACE_CONT,
291 m_tid, nullptr, reinterpret_cast<void *>(data));
292}
293
294void NativeThreadLinux::SetStoppedBySignal(uint32_t signo,
295 const siginfo_t *info) {
296 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD));
297 if (log)
298 log->Printf("NativeThreadLinux::%s called with signal 0x%02" PRIx32,
299 __FUNCTION__, signo);
300
301 SetStopped();
302
303 m_stop_info.reason = StopReason::eStopReasonSignal;
304 m_stop_info.details.signal.signo = signo;
305
306 m_stop_description.clear();
307 if (info) {
308 switch (signo) {
309 case SIGSEGV:
310 case SIGBUS:
311 case SIGFPE:
312 case SIGILL:
313 // In case of MIPS64 target, SI_KERNEL is generated for invalid 64bit
314 // address.
315 const auto reason =
316 (info->si_signo == SIGBUS && info->si_code == SI_KERNEL)
317 ? CrashReason::eInvalidAddress
318 : GetCrashReason(*info);
Valentina Giusti6f8c1f82016-10-06 18:05:12 +0000319 m_stop_description = GetCrashReasonString(reason, *info);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000320 break;
321 }
322 }
323}
324
325bool NativeThreadLinux::IsStopped(int *signo) {
326 if (!StateIsStoppedState(m_state, false))
327 return false;
328
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;
333 }
334
335 // Regardless, we are stopped.
336 return true;
337}
338
339void NativeThreadLinux::SetStopped() {
340 if (m_state == StateType::eStateStepping)
341 MaybeCleanupSingleStepWorkaround();
342
343 const StateType new_state = StateType::eStateStopped;
344 MaybeLogStateChange(new_state);
345 m_state = new_state;
346 m_stop_description.clear();
347}
348
349void NativeThreadLinux::SetStoppedByExec() {
350 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD));
351 if (log)
352 log->Printf("NativeThreadLinux::%s()", __FUNCTION__);
353
354 SetStopped();
355
356 m_stop_info.reason = StopReason::eStopReasonExec;
357 m_stop_info.details.signal.signo = SIGSTOP;
358}
359
360void NativeThreadLinux::SetStoppedByBreakpoint() {
361 SetStopped();
362
363 m_stop_info.reason = StopReason::eStopReasonBreakpoint;
364 m_stop_info.details.signal.signo = SIGTRAP;
365 m_stop_description.clear();
366}
367
368void NativeThreadLinux::SetStoppedByWatchpoint(uint32_t wp_index) {
369 SetStopped();
370
371 lldbassert(wp_index != LLDB_INVALID_INDEX32 && "wp_index cannot be invalid");
372
373 std::ostringstream ostr;
374 ostr << GetRegisterContext()->GetWatchpointAddress(wp_index) << " ";
375 ostr << wp_index;
376
377 /*
378 * MIPS: Last 3bits of the watchpoint address are masked by the kernel. For
379 * example:
380 * 'n' is at 0x120010d00 and 'm' is 0x120010d04. When a watchpoint is set at
381 * 'm', then
382 * watch exception is generated even when 'n' is read/written. To handle this
383 * case,
384 * find the base address of the load/store instruction and append it in the
385 * stop-info
386 * packet.
387 */
388 ostr << " " << GetRegisterContext()->GetWatchpointHitAddress(wp_index);
389
390 m_stop_description = ostr.str();
391
392 m_stop_info.reason = StopReason::eStopReasonWatchpoint;
393 m_stop_info.details.signal.signo = SIGTRAP;
394}
395
396bool NativeThreadLinux::IsStoppedAtBreakpoint() {
397 return GetState() == StateType::eStateStopped &&
398 m_stop_info.reason == StopReason::eStopReasonBreakpoint;
399}
400
401bool NativeThreadLinux::IsStoppedAtWatchpoint() {
402 return GetState() == StateType::eStateStopped &&
403 m_stop_info.reason == StopReason::eStopReasonWatchpoint;
404}
405
406void NativeThreadLinux::SetStoppedByTrace() {
407 SetStopped();
408
409 m_stop_info.reason = StopReason::eStopReasonTrace;
410 m_stop_info.details.signal.signo = SIGTRAP;
411}
412
413void NativeThreadLinux::SetStoppedWithNoReason() {
414 SetStopped();
415
416 m_stop_info.reason = StopReason::eStopReasonNone;
417 m_stop_info.details.signal.signo = 0;
418}
419
420void NativeThreadLinux::SetExited() {
421 const StateType new_state = StateType::eStateExited;
422 MaybeLogStateChange(new_state);
423 m_state = new_state;
424
425 m_stop_info.reason = StopReason::eStopReasonThreadExiting;
426}
427
428Error NativeThreadLinux::RequestStop() {
429 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD));
430
431 NativeProcessLinux &process = GetProcess();
432
433 lldb::pid_t pid = process.GetID();
434 lldb::tid_t tid = GetID();
435
436 if (log)
437 log->Printf("NativeThreadLinux::%s requesting thread stop(pid: %" PRIu64
438 ", tid: %" PRIu64 ")",
439 __FUNCTION__, pid, tid);
440
441 Error err;
442 errno = 0;
443 if (::tgkill(pid, tid, SIGSTOP) != 0) {
444 err.SetErrorToErrno();
445 if (log)
446 log->Printf("NativeThreadLinux::%s tgkill(%" PRIu64 ", %" PRIu64
447 ", SIGSTOP) failed: %s",
448 __FUNCTION__, pid, tid, err.AsCString());
449 }
450
451 return err;
452}
453
454void NativeThreadLinux::MaybeLogStateChange(lldb::StateType new_state) {
455 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD));
456 // If we're not logging, we're done.
457 if (!log)
458 return;
459
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)
463 return;
464
465 NativeProcessProtocolSP m_process_sp = m_process_wp.lock();
466 lldb::pid_t pid =
467 m_process_sp ? m_process_sp->GetID() : LLDB_INVALID_PROCESS_ID;
468
469 // Log it.
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));
474}
475
476NativeProcessLinux &NativeThreadLinux::GetProcess() {
477 auto process_sp = std::static_pointer_cast<NativeProcessLinux>(
478 NativeThreadProtocol::GetProcess());
479 assert(process_sp);
480 return *process_sp;
Pavel Labath605b51b2016-02-23 13:56:30 +0000481}