19c7fbc3fSMichał Górny //===-- ThreadFreeBSDKernel.cpp -------------------------------------------===//
29c7fbc3fSMichał Górny //
39c7fbc3fSMichał Górny // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
49c7fbc3fSMichał Górny // See https://llvm.org/LICENSE.txt for license information.
59c7fbc3fSMichał Górny // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
69c7fbc3fSMichał Górny //
79c7fbc3fSMichał Górny //===----------------------------------------------------------------------===//
89c7fbc3fSMichał Górny 
99c7fbc3fSMichał Górny #include "ThreadFreeBSDKernel.h"
109c7fbc3fSMichał Górny 
119c7fbc3fSMichał Górny #include "lldb/Target/Unwind.h"
129c7fbc3fSMichał Górny #include "lldb/Utility/Log.h"
139c7fbc3fSMichał Górny 
149c7fbc3fSMichał Górny #include "Plugins/Process/Utility/RegisterContextFreeBSD_i386.h"
159c7fbc3fSMichał Górny #include "Plugins/Process/Utility/RegisterContextFreeBSD_x86_64.h"
169c7fbc3fSMichał Górny #include "Plugins/Process/Utility/RegisterInfoPOSIX_arm64.h"
179c7fbc3fSMichał Górny #include "ProcessFreeBSDKernel.h"
189c7fbc3fSMichał Górny #include "RegisterContextFreeBSDKernel_arm64.h"
199c7fbc3fSMichał Górny #include "RegisterContextFreeBSDKernel_i386.h"
209c7fbc3fSMichał Górny #include "RegisterContextFreeBSDKernel_x86_64.h"
219c7fbc3fSMichał Górny #include "ThreadFreeBSDKernel.h"
229c7fbc3fSMichał Górny 
239c7fbc3fSMichał Górny using namespace lldb;
249c7fbc3fSMichał Górny using namespace lldb_private;
259c7fbc3fSMichał Górny 
ThreadFreeBSDKernel(Process & process,lldb::tid_t tid,lldb::addr_t pcb_addr,std::string thread_name)269c7fbc3fSMichał Górny ThreadFreeBSDKernel::ThreadFreeBSDKernel(Process &process, lldb::tid_t tid,
27*9b1d27b2SMichał Górny                                          lldb::addr_t pcb_addr,
28*9b1d27b2SMichał Górny                                          std::string thread_name)
29*9b1d27b2SMichał Górny     : Thread(process, tid), m_thread_name(std::move(thread_name)),
30*9b1d27b2SMichał Górny       m_pcb_addr(pcb_addr) {}
319c7fbc3fSMichał Górny 
~ThreadFreeBSDKernel()329c7fbc3fSMichał Górny ThreadFreeBSDKernel::~ThreadFreeBSDKernel() {}
339c7fbc3fSMichał Górny 
RefreshStateAfterStop()349c7fbc3fSMichał Górny void ThreadFreeBSDKernel::RefreshStateAfterStop() {}
359c7fbc3fSMichał Górny 
GetRegisterContext()369c7fbc3fSMichał Górny lldb::RegisterContextSP ThreadFreeBSDKernel::GetRegisterContext() {
379c7fbc3fSMichał Górny   if (!m_reg_context_sp)
389c7fbc3fSMichał Górny     m_reg_context_sp = CreateRegisterContextForFrame(nullptr);
399c7fbc3fSMichał Górny   return m_reg_context_sp;
409c7fbc3fSMichał Górny }
419c7fbc3fSMichał Górny 
429c7fbc3fSMichał Górny lldb::RegisterContextSP
CreateRegisterContextForFrame(StackFrame * frame)439c7fbc3fSMichał Górny ThreadFreeBSDKernel::CreateRegisterContextForFrame(StackFrame *frame) {
449c7fbc3fSMichał Górny   RegisterContextSP reg_ctx_sp;
459c7fbc3fSMichał Górny   uint32_t concrete_frame_idx = 0;
469c7fbc3fSMichał Górny 
479c7fbc3fSMichał Górny   if (frame)
489c7fbc3fSMichał Górny     concrete_frame_idx = frame->GetConcreteFrameIndex();
499c7fbc3fSMichał Górny 
509c7fbc3fSMichał Górny   if (concrete_frame_idx == 0) {
519c7fbc3fSMichał Górny     if (m_thread_reg_ctx_sp)
529c7fbc3fSMichał Górny       return m_thread_reg_ctx_sp;
539c7fbc3fSMichał Górny 
549c7fbc3fSMichał Górny     ProcessFreeBSDKernel *process =
559c7fbc3fSMichał Górny         static_cast<ProcessFreeBSDKernel *>(GetProcess().get());
569c7fbc3fSMichał Górny     ArchSpec arch = process->GetTarget().GetArchitecture();
579c7fbc3fSMichał Górny 
589c7fbc3fSMichał Górny     switch (arch.GetMachine()) {
599c7fbc3fSMichał Górny     case llvm::Triple::aarch64:
609c7fbc3fSMichał Górny       m_thread_reg_ctx_sp =
619c7fbc3fSMichał Górny           std::make_shared<RegisterContextFreeBSDKernel_arm64>(
629c7fbc3fSMichał Górny               *this, std::make_unique<RegisterInfoPOSIX_arm64>(arch, 0),
639c7fbc3fSMichał Górny               m_pcb_addr);
649c7fbc3fSMichał Górny       break;
659c7fbc3fSMichał Górny     case llvm::Triple::x86:
66*9b1d27b2SMichał Górny       m_thread_reg_ctx_sp = std::make_shared<RegisterContextFreeBSDKernel_i386>(
679c7fbc3fSMichał Górny           *this, new RegisterContextFreeBSD_i386(arch), m_pcb_addr);
689c7fbc3fSMichał Górny       break;
699c7fbc3fSMichał Górny     case llvm::Triple::x86_64:
709c7fbc3fSMichał Górny       m_thread_reg_ctx_sp =
719c7fbc3fSMichał Górny           std::make_shared<RegisterContextFreeBSDKernel_x86_64>(
729c7fbc3fSMichał Górny               *this, new RegisterContextFreeBSD_x86_64(arch), m_pcb_addr);
739c7fbc3fSMichał Górny       break;
749c7fbc3fSMichał Górny     default:
759c7fbc3fSMichał Górny       assert(false && "Unsupported architecture passed to ThreadFreeBSDKernel");
769c7fbc3fSMichał Górny       break;
779c7fbc3fSMichał Górny     }
789c7fbc3fSMichał Górny 
799c7fbc3fSMichał Górny     reg_ctx_sp = m_thread_reg_ctx_sp;
809c7fbc3fSMichał Górny   } else {
819c7fbc3fSMichał Górny     reg_ctx_sp = GetUnwinder().CreateRegisterContextForFrame(frame);
829c7fbc3fSMichał Górny   }
839c7fbc3fSMichał Górny   return reg_ctx_sp;
849c7fbc3fSMichał Górny }
859c7fbc3fSMichał Górny 
CalculateStopInfo()869c7fbc3fSMichał Górny bool ThreadFreeBSDKernel::CalculateStopInfo() { return false; }
87