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