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