//===-- RegisterContextFreeBSDKernel_x86_64.cpp ---------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "RegisterContextFreeBSDKernel_x86_64.h" #include "lldb/Target/Process.h" #include "lldb/Target/Thread.h" #include "lldb/Utility/RegisterValue.h" #include "llvm/Support/Endian.h" using namespace lldb; using namespace lldb_private; RegisterContextFreeBSDKernel_x86_64::RegisterContextFreeBSDKernel_x86_64( Thread &thread, RegisterInfoInterface *register_info, lldb::addr_t pcb_addr) : RegisterContextPOSIX_x86(thread, 0, register_info), m_pcb_addr(pcb_addr) { } bool RegisterContextFreeBSDKernel_x86_64::ReadGPR() { return true; } bool RegisterContextFreeBSDKernel_x86_64::ReadFPR() { return true; } bool RegisterContextFreeBSDKernel_x86_64::WriteGPR() { assert(0); return false; } bool RegisterContextFreeBSDKernel_x86_64::WriteFPR() { assert(0); return false; } bool RegisterContextFreeBSDKernel_x86_64::ReadRegister( const RegisterInfo *reg_info, RegisterValue &value) { if (m_pcb_addr == LLDB_INVALID_ADDRESS) return false; struct { llvm::support::ulittle64_t r15; llvm::support::ulittle64_t r14; llvm::support::ulittle64_t r13; llvm::support::ulittle64_t r12; llvm::support::ulittle64_t rbp; llvm::support::ulittle64_t rsp; llvm::support::ulittle64_t rbx; llvm::support::ulittle64_t rip; } pcb; Status error; size_t rd = m_thread.GetProcess()->ReadMemory(m_pcb_addr, &pcb, sizeof(pcb), error); if (rd != sizeof(pcb)) return false; uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB]; switch (reg) { #define REG(x) \ case lldb_##x##_x86_64: \ value = pcb.x; \ break; REG(r15); REG(r14); REG(r13); REG(r12); REG(rbp); REG(rsp); REG(rbx); REG(rip); #undef REG default: return false; } return true; } bool RegisterContextFreeBSDKernel_x86_64::WriteRegister( const RegisterInfo *reg_info, const RegisterValue &value) { return false; }