11a3d19ddSKamil Rytarowski //===-- NativeThreadNetBSD.cpp -------------------------------- -*- C++ -*-===//
21a3d19ddSKamil Rytarowski //
31a3d19ddSKamil Rytarowski //                     The LLVM Compiler Infrastructure
41a3d19ddSKamil Rytarowski //
51a3d19ddSKamil Rytarowski // This file is distributed under the University of Illinois Open Source
61a3d19ddSKamil Rytarowski // License. See LICENSE.TXT for details.
71a3d19ddSKamil Rytarowski //
81a3d19ddSKamil Rytarowski //===----------------------------------------------------------------------===//
91a3d19ddSKamil Rytarowski 
101a3d19ddSKamil Rytarowski #include "NativeThreadNetBSD.h"
111a3d19ddSKamil Rytarowski #include "NativeRegisterContextNetBSD.h"
121a3d19ddSKamil Rytarowski 
131a3d19ddSKamil Rytarowski #include "NativeProcessNetBSD.h"
141a3d19ddSKamil Rytarowski 
15f07a9995SKamil Rytarowski #include "Plugins/Process/POSIX/CrashReason.h"
16f07a9995SKamil Rytarowski #include "Plugins/Process/POSIX/ProcessPOSIXLog.h"
17f07a9995SKamil Rytarowski #include "lldb/Core/RegisterValue.h"
18f07a9995SKamil Rytarowski #include "lldb/Core/State.h"
19f07a9995SKamil Rytarowski 
201a3d19ddSKamil Rytarowski using namespace lldb;
211a3d19ddSKamil Rytarowski using namespace lldb_private;
221a3d19ddSKamil Rytarowski using namespace lldb_private::process_netbsd;
231a3d19ddSKamil Rytarowski 
241a3d19ddSKamil Rytarowski NativeThreadNetBSD::NativeThreadNetBSD(NativeProcessNetBSD *process,
251a3d19ddSKamil Rytarowski                                        lldb::tid_t tid)
26f07a9995SKamil Rytarowski     : NativeThreadProtocol(process, tid), m_state(StateType::eStateInvalid),
27f07a9995SKamil Rytarowski       m_stop_info(), m_reg_context_sp(), m_stop_description() {}
28f07a9995SKamil Rytarowski 
29f07a9995SKamil Rytarowski void NativeThreadNetBSD::SetStoppedBySignal(uint32_t signo,
30f07a9995SKamil Rytarowski                                             const siginfo_t *info) {
31f07a9995SKamil Rytarowski   Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_THREAD));
32f07a9995SKamil Rytarowski   LLDB_LOG(log, "tid = {0} in called with signal {1}", GetID(), signo);
33f07a9995SKamil Rytarowski 
34f07a9995SKamil Rytarowski   SetStopped();
35f07a9995SKamil Rytarowski 
36f07a9995SKamil Rytarowski   m_stop_info.reason = StopReason::eStopReasonSignal;
37f07a9995SKamil Rytarowski   m_stop_info.details.signal.signo = signo;
38f07a9995SKamil Rytarowski 
39f07a9995SKamil Rytarowski   m_stop_description.clear();
40f07a9995SKamil Rytarowski   if (info) {
41f07a9995SKamil Rytarowski     switch (signo) {
42f07a9995SKamil Rytarowski     case SIGSEGV:
43f07a9995SKamil Rytarowski     case SIGBUS:
44f07a9995SKamil Rytarowski     case SIGFPE:
45f07a9995SKamil Rytarowski     case SIGILL:
46f07a9995SKamil Rytarowski       const auto reason = GetCrashReason(*info);
47f07a9995SKamil Rytarowski       m_stop_description = GetCrashReasonString(reason, *info);
48f07a9995SKamil Rytarowski       break;
49f07a9995SKamil Rytarowski     }
50f07a9995SKamil Rytarowski   }
51f07a9995SKamil Rytarowski }
52f07a9995SKamil Rytarowski 
53f07a9995SKamil Rytarowski void NativeThreadNetBSD::SetStoppedByBreakpoint() {
54f07a9995SKamil Rytarowski   SetStopped();
55f07a9995SKamil Rytarowski   m_stop_info.reason = StopReason::eStopReasonBreakpoint;
56f07a9995SKamil Rytarowski   m_stop_info.details.signal.signo = SIGTRAP;
57f07a9995SKamil Rytarowski }
58f07a9995SKamil Rytarowski 
59*3eef2b5eSKamil Rytarowski void NativeThreadNetBSD::SetStoppedByTrace() {
60*3eef2b5eSKamil Rytarowski   SetStopped();
61*3eef2b5eSKamil Rytarowski   m_stop_info.reason = StopReason::eStopReasonTrace;
62*3eef2b5eSKamil Rytarowski   m_stop_info.details.signal.signo = SIGTRAP;
63*3eef2b5eSKamil Rytarowski }
64*3eef2b5eSKamil Rytarowski 
65*3eef2b5eSKamil Rytarowski void NativeThreadNetBSD::SetStoppedByExec() {
66*3eef2b5eSKamil Rytarowski   SetStopped();
67*3eef2b5eSKamil Rytarowski   m_stop_info.reason = StopReason::eStopReasonExec;
68*3eef2b5eSKamil Rytarowski   m_stop_info.details.signal.signo = SIGTRAP;
69*3eef2b5eSKamil Rytarowski }
70*3eef2b5eSKamil Rytarowski 
71f07a9995SKamil Rytarowski void NativeThreadNetBSD::SetStopped() {
72f07a9995SKamil Rytarowski   const StateType new_state = StateType::eStateStopped;
73f07a9995SKamil Rytarowski   m_state = new_state;
74f07a9995SKamil Rytarowski   m_stop_description.clear();
75f07a9995SKamil Rytarowski }
76f07a9995SKamil Rytarowski 
77f07a9995SKamil Rytarowski void NativeThreadNetBSD::SetRunning() {
78f07a9995SKamil Rytarowski   m_state = StateType::eStateRunning;
79f07a9995SKamil Rytarowski   m_stop_info.reason = StopReason::eStopReasonNone;
80f07a9995SKamil Rytarowski }
81f07a9995SKamil Rytarowski 
82*3eef2b5eSKamil Rytarowski void NativeThreadNetBSD::SetStepping() {
83*3eef2b5eSKamil Rytarowski   m_state = StateType::eStateStepping;
84*3eef2b5eSKamil Rytarowski   m_stop_info.reason = StopReason::eStopReasonNone;
85*3eef2b5eSKamil Rytarowski }
86*3eef2b5eSKamil Rytarowski 
87f07a9995SKamil Rytarowski std::string NativeThreadNetBSD::GetName() { return std::string(""); }
88f07a9995SKamil Rytarowski 
89f07a9995SKamil Rytarowski lldb::StateType NativeThreadNetBSD::GetState() { return m_state; }
90f07a9995SKamil Rytarowski 
91f07a9995SKamil Rytarowski bool NativeThreadNetBSD::GetStopReason(ThreadStopInfo &stop_info,
92f07a9995SKamil Rytarowski                                        std::string &description) {
93f07a9995SKamil Rytarowski   Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_THREAD));
94f07a9995SKamil Rytarowski 
95f07a9995SKamil Rytarowski   description.clear();
96f07a9995SKamil Rytarowski 
97f07a9995SKamil Rytarowski   switch (m_state) {
98f07a9995SKamil Rytarowski   case eStateStopped:
99f07a9995SKamil Rytarowski   case eStateCrashed:
100f07a9995SKamil Rytarowski   case eStateExited:
101f07a9995SKamil Rytarowski   case eStateSuspended:
102f07a9995SKamil Rytarowski   case eStateUnloaded:
103f07a9995SKamil Rytarowski     stop_info = m_stop_info;
104f07a9995SKamil Rytarowski     description = m_stop_description;
105f07a9995SKamil Rytarowski 
106f07a9995SKamil Rytarowski     return true;
107f07a9995SKamil Rytarowski 
108f07a9995SKamil Rytarowski   case eStateInvalid:
109f07a9995SKamil Rytarowski   case eStateConnected:
110f07a9995SKamil Rytarowski   case eStateAttaching:
111f07a9995SKamil Rytarowski   case eStateLaunching:
112f07a9995SKamil Rytarowski   case eStateRunning:
113f07a9995SKamil Rytarowski   case eStateStepping:
114f07a9995SKamil Rytarowski   case eStateDetached:
115f07a9995SKamil Rytarowski     LLDB_LOG(log, "tid = {0} in state {1} cannot answer stop reason", GetID(),
116f07a9995SKamil Rytarowski              StateAsCString(m_state));
117f07a9995SKamil Rytarowski     return false;
118f07a9995SKamil Rytarowski   }
119f07a9995SKamil Rytarowski   llvm_unreachable("unhandled StateType!");
120f07a9995SKamil Rytarowski }
121f07a9995SKamil Rytarowski 
122f07a9995SKamil Rytarowski NativeRegisterContextSP NativeThreadNetBSD::GetRegisterContext() {
123f07a9995SKamil Rytarowski   // Return the register context if we already created it.
124f07a9995SKamil Rytarowski   if (m_reg_context_sp)
125f07a9995SKamil Rytarowski     return m_reg_context_sp;
126f07a9995SKamil Rytarowski 
127f07a9995SKamil Rytarowski   NativeProcessProtocolSP m_process_sp = m_process_wp.lock();
128f07a9995SKamil Rytarowski   if (!m_process_sp)
129f07a9995SKamil Rytarowski     return NativeRegisterContextSP();
130f07a9995SKamil Rytarowski 
131f07a9995SKamil Rytarowski   ArchSpec target_arch;
132f07a9995SKamil Rytarowski   if (!m_process_sp->GetArchitecture(target_arch))
133f07a9995SKamil Rytarowski     return NativeRegisterContextSP();
134f07a9995SKamil Rytarowski 
135f07a9995SKamil Rytarowski   const uint32_t concrete_frame_idx = 0;
136f07a9995SKamil Rytarowski   m_reg_context_sp.reset(
137f07a9995SKamil Rytarowski       NativeRegisterContextNetBSD::CreateHostNativeRegisterContextNetBSD(
138f07a9995SKamil Rytarowski           target_arch, *this, concrete_frame_idx));
139f07a9995SKamil Rytarowski 
140f07a9995SKamil Rytarowski   return m_reg_context_sp;
141f07a9995SKamil Rytarowski }
142f07a9995SKamil Rytarowski 
143f07a9995SKamil Rytarowski Error NativeThreadNetBSD::SetWatchpoint(lldb::addr_t addr, size_t size,
144f07a9995SKamil Rytarowski                                         uint32_t watch_flags, bool hardware) {
145f07a9995SKamil Rytarowski   return Error("Unimplemented");
146f07a9995SKamil Rytarowski }
147f07a9995SKamil Rytarowski 
148f07a9995SKamil Rytarowski Error NativeThreadNetBSD::RemoveWatchpoint(lldb::addr_t addr) {
149f07a9995SKamil Rytarowski   return Error("Unimplemented");
150f07a9995SKamil Rytarowski }
151f07a9995SKamil Rytarowski 
152f07a9995SKamil Rytarowski Error NativeThreadNetBSD::SetHardwareBreakpoint(lldb::addr_t addr,
153f07a9995SKamil Rytarowski                                                 size_t size) {
154f07a9995SKamil Rytarowski   return Error("Unimplemented");
155f07a9995SKamil Rytarowski }
156f07a9995SKamil Rytarowski 
157f07a9995SKamil Rytarowski Error NativeThreadNetBSD::RemoveHardwareBreakpoint(lldb::addr_t addr) {
158f07a9995SKamil Rytarowski   return Error("Unimplemented");
159f07a9995SKamil Rytarowski }
160