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