1 //===-- ThreadFreeBSDKernel.cpp -------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "ThreadFreeBSDKernel.h" 10 11 #include "lldb/Target/Unwind.h" 12 #include "lldb/Utility/Log.h" 13 14 #include "Plugins/Process/Utility/RegisterContextFreeBSD_i386.h" 15 #include "Plugins/Process/Utility/RegisterContextFreeBSD_x86_64.h" 16 #include "Plugins/Process/Utility/RegisterInfoPOSIX_arm64.h" 17 #include "ProcessFreeBSDKernel.h" 18 #include "RegisterContextFreeBSDKernel_arm64.h" 19 #include "RegisterContextFreeBSDKernel_i386.h" 20 #include "RegisterContextFreeBSDKernel_x86_64.h" 21 #include "ThreadFreeBSDKernel.h" 22 23 using namespace lldb; 24 using namespace lldb_private; 25 26 ThreadFreeBSDKernel::ThreadFreeBSDKernel(Process &process, lldb::tid_t tid, 27 lldb::addr_t pcb_addr) 28 : Thread(process, tid), m_pcb_addr(pcb_addr) {} 29 30 ThreadFreeBSDKernel::~ThreadFreeBSDKernel() {} 31 32 void ThreadFreeBSDKernel::RefreshStateAfterStop() {} 33 34 lldb::RegisterContextSP ThreadFreeBSDKernel::GetRegisterContext() { 35 if (!m_reg_context_sp) 36 m_reg_context_sp = CreateRegisterContextForFrame(nullptr); 37 return m_reg_context_sp; 38 } 39 40 lldb::RegisterContextSP 41 ThreadFreeBSDKernel::CreateRegisterContextForFrame(StackFrame *frame) { 42 RegisterContextSP reg_ctx_sp; 43 uint32_t concrete_frame_idx = 0; 44 45 if (frame) 46 concrete_frame_idx = frame->GetConcreteFrameIndex(); 47 48 if (concrete_frame_idx == 0) { 49 if (m_thread_reg_ctx_sp) 50 return m_thread_reg_ctx_sp; 51 52 ProcessFreeBSDKernel *process = 53 static_cast<ProcessFreeBSDKernel *>(GetProcess().get()); 54 ArchSpec arch = process->GetTarget().GetArchitecture(); 55 56 switch (arch.GetMachine()) { 57 case llvm::Triple::aarch64: 58 m_thread_reg_ctx_sp = 59 std::make_shared<RegisterContextFreeBSDKernel_arm64>( 60 *this, std::make_unique<RegisterInfoPOSIX_arm64>(arch, 0), 61 m_pcb_addr); 62 break; 63 case llvm::Triple::x86: 64 m_thread_reg_ctx_sp = 65 std::make_shared<RegisterContextFreeBSDKernel_i386>( 66 *this, new RegisterContextFreeBSD_i386(arch), m_pcb_addr); 67 break; 68 case llvm::Triple::x86_64: 69 m_thread_reg_ctx_sp = 70 std::make_shared<RegisterContextFreeBSDKernel_x86_64>( 71 *this, new RegisterContextFreeBSD_x86_64(arch), m_pcb_addr); 72 break; 73 default: 74 assert(false && "Unsupported architecture passed to ThreadFreeBSDKernel"); 75 break; 76 } 77 78 reg_ctx_sp = m_thread_reg_ctx_sp; 79 } else { 80 reg_ctx_sp = GetUnwinder().CreateRegisterContextForFrame(frame); 81 } 82 return reg_ctx_sp; 83 } 84 85 bool ThreadFreeBSDKernel::CalculateStopInfo() { return false; } 86