1061da546Spatrick //===-- NativeThreadOpenBSD.cpp -------------------------------- -*- C++ -*-===//
2061da546Spatrick //
3061da546Spatrick // The LLVM Compiler Infrastructure
4061da546Spatrick //
5061da546Spatrick // This file is distributed under the University of Illinois Open Source
6061da546Spatrick // License. See LICENSE.TXT for details.
7061da546Spatrick //
8061da546Spatrick //===----------------------------------------------------------------------===//
9061da546Spatrick
10061da546Spatrick #include "NativeThreadOpenBSD.h"
11061da546Spatrick #include "NativeRegisterContextOpenBSD.h"
12061da546Spatrick
13061da546Spatrick #include "NativeProcessOpenBSD.h"
14061da546Spatrick
15061da546Spatrick #include "Plugins/Process/POSIX/CrashReason.h"
16061da546Spatrick #include "Plugins/Process/POSIX/ProcessPOSIXLog.h"
17061da546Spatrick #include "lldb/Utility/LLDBAssert.h"
18061da546Spatrick #include "lldb/Utility/RegisterValue.h"
19061da546Spatrick #include "lldb/Utility/State.h"
20061da546Spatrick
21061da546Spatrick #include <sstream>
22061da546Spatrick
23061da546Spatrick using namespace lldb;
24061da546Spatrick using namespace lldb_private;
25061da546Spatrick using namespace lldb_private::process_openbsd;
26061da546Spatrick
NativeThreadOpenBSD(NativeProcessOpenBSD & process,lldb::tid_t tid)27061da546Spatrick NativeThreadOpenBSD::NativeThreadOpenBSD(NativeProcessOpenBSD &process,
28061da546Spatrick lldb::tid_t tid)
29061da546Spatrick : NativeThreadProtocol(process, tid), m_state(StateType::eStateInvalid),
300f45e296Smortimer m_stop_info(), m_stop_description() {
310f45e296Smortimer m_reg_context_up = NativeRegisterContextOpenBSD::CreateHostNativeRegisterContextOpenBSD(process.GetArchitecture(), *this);
320f45e296Smortimer if (!m_reg_context_up)
330f45e296Smortimer llvm_unreachable("This architecture does not support debugging running processes.");
340f45e296Smortimer }
35061da546Spatrick
SetStoppedBySignal(uint32_t signo,const siginfo_t * info)36061da546Spatrick void NativeThreadOpenBSD::SetStoppedBySignal(uint32_t signo,
37061da546Spatrick const siginfo_t *info) {
38*101d251dSrobert Log *log = GetLog(POSIXLog::Thread);
39061da546Spatrick LLDB_LOG(log, "tid = {0} in called with signal {1}", GetID(), signo);
40061da546Spatrick
41061da546Spatrick SetStopped();
42061da546Spatrick
43061da546Spatrick m_stop_info.reason = StopReason::eStopReasonSignal;
44*101d251dSrobert m_stop_info.signo = signo;
45061da546Spatrick
46061da546Spatrick m_stop_description.clear();
47061da546Spatrick if (info) {
48061da546Spatrick switch (signo) {
49061da546Spatrick case SIGSEGV:
50061da546Spatrick case SIGBUS:
51061da546Spatrick case SIGFPE:
52061da546Spatrick case SIGILL:
53061da546Spatrick const auto reason = GetCrashReason(*info);
54061da546Spatrick m_stop_description = GetCrashReasonString(reason, *info);
55061da546Spatrick break;
56061da546Spatrick }
57061da546Spatrick }
58061da546Spatrick }
59061da546Spatrick
SetStoppedByBreakpoint()60061da546Spatrick void NativeThreadOpenBSD::SetStoppedByBreakpoint() {
61061da546Spatrick SetStopped();
62061da546Spatrick m_stop_info.reason = StopReason::eStopReasonBreakpoint;
63*101d251dSrobert m_stop_info.signo = SIGTRAP;
64061da546Spatrick }
65061da546Spatrick
SetStoppedByTrace()66061da546Spatrick void NativeThreadOpenBSD::SetStoppedByTrace() {
67061da546Spatrick SetStopped();
68061da546Spatrick m_stop_info.reason = StopReason::eStopReasonTrace;
69*101d251dSrobert m_stop_info.signo = SIGTRAP;
70061da546Spatrick }
71061da546Spatrick
SetStoppedByExec()72061da546Spatrick void NativeThreadOpenBSD::SetStoppedByExec() {
73061da546Spatrick SetStopped();
74061da546Spatrick m_stop_info.reason = StopReason::eStopReasonExec;
75*101d251dSrobert m_stop_info.signo = SIGTRAP;
76061da546Spatrick }
77061da546Spatrick
SetStopped()78061da546Spatrick void NativeThreadOpenBSD::SetStopped() {
79061da546Spatrick const StateType new_state = StateType::eStateStopped;
80061da546Spatrick m_state = new_state;
81061da546Spatrick m_stop_description.clear();
82061da546Spatrick }
83061da546Spatrick
SetRunning()84061da546Spatrick void NativeThreadOpenBSD::SetRunning() {
85061da546Spatrick m_state = StateType::eStateRunning;
86061da546Spatrick m_stop_info.reason = StopReason::eStopReasonNone;
87061da546Spatrick }
88061da546Spatrick
SetStepping()89061da546Spatrick void NativeThreadOpenBSD::SetStepping() {
90061da546Spatrick m_state = StateType::eStateStepping;
91061da546Spatrick m_stop_info.reason = StopReason::eStopReasonNone;
92061da546Spatrick }
93061da546Spatrick
GetName()94061da546Spatrick std::string NativeThreadOpenBSD::GetName() { return std::string(""); }
95061da546Spatrick
GetState()96061da546Spatrick lldb::StateType NativeThreadOpenBSD::GetState() { return m_state; }
97061da546Spatrick
GetStopReason(ThreadStopInfo & stop_info,std::string & description)98061da546Spatrick bool NativeThreadOpenBSD::GetStopReason(ThreadStopInfo &stop_info,
99061da546Spatrick std::string &description) {
100*101d251dSrobert Log *log = GetLog(POSIXLog::Thread);
101061da546Spatrick
102061da546Spatrick description.clear();
103061da546Spatrick
104061da546Spatrick switch (m_state) {
105061da546Spatrick case eStateStopped:
106061da546Spatrick case eStateCrashed:
107061da546Spatrick case eStateExited:
108061da546Spatrick case eStateSuspended:
109061da546Spatrick case eStateUnloaded:
110061da546Spatrick stop_info = m_stop_info;
111061da546Spatrick description = m_stop_description;
112061da546Spatrick
113061da546Spatrick return true;
114061da546Spatrick
115061da546Spatrick case eStateInvalid:
116061da546Spatrick case eStateConnected:
117061da546Spatrick case eStateAttaching:
118061da546Spatrick case eStateLaunching:
119061da546Spatrick case eStateRunning:
120061da546Spatrick case eStateStepping:
121061da546Spatrick case eStateDetached:
122061da546Spatrick LLDB_LOG(log, "tid = {0} in state {1} cannot answer stop reason", GetID(),
123061da546Spatrick StateAsCString(m_state));
124061da546Spatrick return false;
125061da546Spatrick }
126061da546Spatrick llvm_unreachable("unhandled StateType!");
127061da546Spatrick }
128061da546Spatrick
GetRegisterContext()129061da546Spatrick NativeRegisterContext& NativeThreadOpenBSD::GetRegisterContext() {
130061da546Spatrick assert(m_reg_context_up);
131061da546Spatrick return *m_reg_context_up;
132061da546Spatrick }
133061da546Spatrick
SetWatchpoint(lldb::addr_t addr,size_t size,uint32_t watch_flags,bool hardware)134061da546Spatrick Status NativeThreadOpenBSD::SetWatchpoint(lldb::addr_t addr, size_t size,
135061da546Spatrick uint32_t watch_flags, bool hardware) {
136a119297bSmortimer if (hardware)
137a119297bSmortimer return Status("Not Aailable");
138a119297bSmortimer return Status("Software watchpoints not implemented");
139061da546Spatrick }
140061da546Spatrick
RemoveWatchpoint(lldb::addr_t addr)141061da546Spatrick Status NativeThreadOpenBSD::RemoveWatchpoint(lldb::addr_t addr) {
142a119297bSmortimer return Status("Software watchpoints not implemented");
143061da546Spatrick }
144061da546Spatrick
SetHardwareBreakpoint(lldb::addr_t addr,size_t size)145061da546Spatrick Status NativeThreadOpenBSD::SetHardwareBreakpoint(lldb::addr_t addr,
146061da546Spatrick size_t size) {
147a119297bSmortimer return Status("Not Available");
148061da546Spatrick }
149061da546Spatrick
RemoveHardwareBreakpoint(lldb::addr_t addr)150061da546Spatrick Status NativeThreadOpenBSD::RemoveHardwareBreakpoint(lldb::addr_t addr) {
151a119297bSmortimer return Status("Not Available");
152061da546Spatrick }
153