blob: a50ea7e3d0a5552a95f99db81f024646bd184cfd [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 +0000223Error NativeThreadLinux::SingleStep(uint32_t signo) {
224 const StateType new_state = StateType::eStateStepping;
225 MaybeLogStateChange(new_state);
226 m_state = new_state;
227 m_stop_info.reason = StopReason::eStopReasonNone;
Pavel Labatha37bbbd2017-02-17 11:48:34 +0000228
229 if(!m_step_workaround) {
230 // If we already hava a workaround inplace, don't reset it. Otherwise, the
231 // destructor of the existing instance will run after the new instance has
232 // fetched the cpu mask, and the thread will end up with the wrong mask.
233 m_step_workaround = SingleStepWorkaround::Get(m_tid);
234 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000235
236 intptr_t data = 0;
237 if (signo != LLDB_INVALID_SIGNAL_NUMBER)
238 data = signo;
239
240 // If hardware single-stepping is not supported, we just do a continue. The
241 // breakpoint on the
242 // next instruction has been setup in NativeProcessLinux::Resume.
243 return NativeProcessLinux::PtraceWrapper(
244 GetProcess().SupportHardwareSingleStepping() ? PTRACE_SINGLESTEP
245 : PTRACE_CONT,
246 m_tid, nullptr, reinterpret_cast<void *>(data));
247}
248
249void NativeThreadLinux::SetStoppedBySignal(uint32_t signo,
250 const siginfo_t *info) {
251 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD));
252 if (log)
253 log->Printf("NativeThreadLinux::%s called with signal 0x%02" PRIx32,
254 __FUNCTION__, signo);
255
256 SetStopped();
257
258 m_stop_info.reason = StopReason::eStopReasonSignal;
259 m_stop_info.details.signal.signo = signo;
260
261 m_stop_description.clear();
262 if (info) {
263 switch (signo) {
264 case SIGSEGV:
265 case SIGBUS:
266 case SIGFPE:
267 case SIGILL:
268 // In case of MIPS64 target, SI_KERNEL is generated for invalid 64bit
269 // address.
270 const auto reason =
271 (info->si_signo == SIGBUS && info->si_code == SI_KERNEL)
272 ? CrashReason::eInvalidAddress
273 : GetCrashReason(*info);
Valentina Giusti6f8c1f82016-10-06 18:05:12 +0000274 m_stop_description = GetCrashReasonString(reason, *info);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000275 break;
276 }
277 }
278}
279
280bool NativeThreadLinux::IsStopped(int *signo) {
281 if (!StateIsStoppedState(m_state, false))
282 return false;
283
284 // If we are stopped by a signal, return the signo.
285 if (signo && m_state == StateType::eStateStopped &&
286 m_stop_info.reason == StopReason::eStopReasonSignal) {
287 *signo = m_stop_info.details.signal.signo;
288 }
289
290 // Regardless, we are stopped.
291 return true;
292}
293
294void NativeThreadLinux::SetStopped() {
295 if (m_state == StateType::eStateStepping)
Pavel Labath8abd34f2017-01-25 11:19:45 +0000296 m_step_workaround.reset();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000297
298 const StateType new_state = StateType::eStateStopped;
299 MaybeLogStateChange(new_state);
300 m_state = new_state;
301 m_stop_description.clear();
302}
303
304void NativeThreadLinux::SetStoppedByExec() {
305 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD));
306 if (log)
307 log->Printf("NativeThreadLinux::%s()", __FUNCTION__);
308
309 SetStopped();
310
311 m_stop_info.reason = StopReason::eStopReasonExec;
312 m_stop_info.details.signal.signo = SIGSTOP;
313}
314
315void NativeThreadLinux::SetStoppedByBreakpoint() {
316 SetStopped();
317
318 m_stop_info.reason = StopReason::eStopReasonBreakpoint;
319 m_stop_info.details.signal.signo = SIGTRAP;
320 m_stop_description.clear();
321}
322
323void NativeThreadLinux::SetStoppedByWatchpoint(uint32_t wp_index) {
324 SetStopped();
325
326 lldbassert(wp_index != LLDB_INVALID_INDEX32 && "wp_index cannot be invalid");
327
328 std::ostringstream ostr;
329 ostr << GetRegisterContext()->GetWatchpointAddress(wp_index) << " ";
330 ostr << wp_index;
331
332 /*
333 * MIPS: Last 3bits of the watchpoint address are masked by the kernel. For
334 * example:
335 * 'n' is at 0x120010d00 and 'm' is 0x120010d04. When a watchpoint is set at
336 * 'm', then
337 * watch exception is generated even when 'n' is read/written. To handle this
338 * case,
339 * find the base address of the load/store instruction and append it in the
340 * stop-info
341 * packet.
342 */
343 ostr << " " << GetRegisterContext()->GetWatchpointHitAddress(wp_index);
344
345 m_stop_description = ostr.str();
346
347 m_stop_info.reason = StopReason::eStopReasonWatchpoint;
348 m_stop_info.details.signal.signo = SIGTRAP;
349}
350
351bool NativeThreadLinux::IsStoppedAtBreakpoint() {
352 return GetState() == StateType::eStateStopped &&
353 m_stop_info.reason == StopReason::eStopReasonBreakpoint;
354}
355
356bool NativeThreadLinux::IsStoppedAtWatchpoint() {
357 return GetState() == StateType::eStateStopped &&
358 m_stop_info.reason == StopReason::eStopReasonWatchpoint;
359}
360
361void NativeThreadLinux::SetStoppedByTrace() {
362 SetStopped();
363
364 m_stop_info.reason = StopReason::eStopReasonTrace;
365 m_stop_info.details.signal.signo = SIGTRAP;
366}
367
368void NativeThreadLinux::SetStoppedWithNoReason() {
369 SetStopped();
370
371 m_stop_info.reason = StopReason::eStopReasonNone;
372 m_stop_info.details.signal.signo = 0;
373}
374
375void NativeThreadLinux::SetExited() {
376 const StateType new_state = StateType::eStateExited;
377 MaybeLogStateChange(new_state);
378 m_state = new_state;
379
380 m_stop_info.reason = StopReason::eStopReasonThreadExiting;
381}
382
383Error NativeThreadLinux::RequestStop() {
384 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD));
385
386 NativeProcessLinux &process = GetProcess();
387
388 lldb::pid_t pid = process.GetID();
389 lldb::tid_t tid = GetID();
390
391 if (log)
392 log->Printf("NativeThreadLinux::%s requesting thread stop(pid: %" PRIu64
393 ", tid: %" PRIu64 ")",
394 __FUNCTION__, pid, tid);
395
396 Error err;
397 errno = 0;
398 if (::tgkill(pid, tid, SIGSTOP) != 0) {
399 err.SetErrorToErrno();
400 if (log)
401 log->Printf("NativeThreadLinux::%s tgkill(%" PRIu64 ", %" PRIu64
402 ", SIGSTOP) failed: %s",
403 __FUNCTION__, pid, tid, err.AsCString());
404 }
405
406 return err;
407}
408
409void NativeThreadLinux::MaybeLogStateChange(lldb::StateType new_state) {
410 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD));
411 // If we're not logging, we're done.
412 if (!log)
413 return;
414
415 // If this is a state change to the same state, we're done.
416 lldb::StateType old_state = m_state;
417 if (new_state == old_state)
418 return;
419
420 NativeProcessProtocolSP m_process_sp = m_process_wp.lock();
421 lldb::pid_t pid =
422 m_process_sp ? m_process_sp->GetID() : LLDB_INVALID_PROCESS_ID;
423
424 // Log it.
425 log->Printf("NativeThreadLinux: thread (pid=%" PRIu64 ", tid=%" PRIu64
426 ") changing from state %s to %s",
427 pid, GetID(), StateAsCString(old_state),
428 StateAsCString(new_state));
429}
430
431NativeProcessLinux &NativeThreadLinux::GetProcess() {
432 auto process_sp = std::static_pointer_cast<NativeProcessLinux>(
433 NativeThreadProtocol::GetProcess());
434 assert(process_sp);
435 return *process_sp;
Pavel Labath605b51b2016-02-23 13:56:30 +0000436}