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