1254721Semaste//===-- GDBRemoteRegisterContext.h ------------------------------*- C++ -*-===// 2254721Semaste// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6254721Semaste// 7254721Semaste//===----------------------------------------------------------------------===// 8254721Semaste 9254721Semaste#ifndef lldb_GDBRemoteRegisterContext_h_ 10254721Semaste#define lldb_GDBRemoteRegisterContext_h_ 11254721Semaste 12254721Semaste#include <vector> 13254721Semaste 14314564Sdim#include "Plugins/Process/Utility/DynamicRegisterInfo.h" 15254721Semaste#include "lldb/Target/RegisterContext.h" 16321369Sdim#include "lldb/Utility/ConstString.h" 17321369Sdim#include "lldb/Utility/DataExtractor.h" 18314564Sdim#include "lldb/lldb-enumerations.h" 19314564Sdim#include "lldb/lldb-private.h" 20258054Semaste 21254721Semaste#include "GDBRemoteCommunicationClient.h" 22254721Semaste 23288943Sdimclass StringExtractor; 24288943Sdim 25288943Sdimnamespace lldb_private { 26288943Sdimnamespace process_gdb_remote { 27288943Sdim 28254721Semasteclass ThreadGDBRemote; 29254721Semasteclass ProcessGDBRemote; 30254721Semaste 31314564Sdimclass GDBRemoteDynamicRegisterInfo : public DynamicRegisterInfo { 32254721Semastepublic: 33314564Sdim GDBRemoteDynamicRegisterInfo() : DynamicRegisterInfo() {} 34254721Semaste 35314564Sdim ~GDBRemoteDynamicRegisterInfo() override = default; 36254721Semaste 37314564Sdim void HardcodeARMRegisters(bool from_scratch); 38254721Semaste}; 39254721Semaste 40314564Sdimclass GDBRemoteRegisterContext : public RegisterContext { 41254721Semastepublic: 42314564Sdim GDBRemoteRegisterContext(ThreadGDBRemote &thread, uint32_t concrete_frame_idx, 43314564Sdim GDBRemoteDynamicRegisterInfo ®_info, 44360784Sdim bool read_all_at_once, bool write_all_at_once); 45254721Semaste 46314564Sdim ~GDBRemoteRegisterContext() override; 47254721Semaste 48314564Sdim void InvalidateAllRegisters() override; 49254721Semaste 50314564Sdim size_t GetRegisterCount() override; 51254721Semaste 52314564Sdim const RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override; 53254721Semaste 54314564Sdim size_t GetRegisterSetCount() override; 55254721Semaste 56314564Sdim const RegisterSet *GetRegisterSet(size_t reg_set) override; 57254721Semaste 58314564Sdim bool ReadRegister(const RegisterInfo *reg_info, 59314564Sdim RegisterValue &value) override; 60254721Semaste 61314564Sdim bool WriteRegister(const RegisterInfo *reg_info, 62314564Sdim const RegisterValue &value) override; 63254721Semaste 64314564Sdim bool ReadAllRegisterValues(lldb::DataBufferSP &data_sp) override; 65254721Semaste 66314564Sdim bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override; 67258884Semaste 68314564Sdim bool ReadAllRegisterValues(RegisterCheckpoint ®_checkpoint) override; 69258884Semaste 70314564Sdim bool 71314564Sdim WriteAllRegisterValues(const RegisterCheckpoint ®_checkpoint) override; 72254721Semaste 73314564Sdim uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind, 74314564Sdim uint32_t num) override; 75314564Sdim 76254721Semasteprotected: 77314564Sdim friend class ThreadGDBRemote; 78254721Semaste 79314564Sdim bool ReadRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data); 80254721Semaste 81314564Sdim bool WriteRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data, 82314564Sdim uint32_t data_offset); 83254721Semaste 84314564Sdim bool PrivateSetRegisterValue(uint32_t reg, llvm::ArrayRef<uint8_t> data); 85296417Sdim 86314564Sdim bool PrivateSetRegisterValue(uint32_t reg, uint64_t val); 87254721Semaste 88314564Sdim void SetAllRegisterValid(bool b); 89314564Sdim 90314564Sdim bool GetRegisterIsValid(uint32_t reg) const { 91314564Sdim#if defined(LLDB_CONFIGURATION_DEBUG) 92314564Sdim assert(reg < m_reg_valid.size()); 93254721Semaste#endif 94314564Sdim if (reg < m_reg_valid.size()) 95314564Sdim return m_reg_valid[reg]; 96314564Sdim return false; 97314564Sdim } 98254721Semaste 99314564Sdim void SetRegisterIsValid(const RegisterInfo *reg_info, bool valid) { 100314564Sdim if (reg_info) 101314564Sdim return SetRegisterIsValid(reg_info->kinds[lldb::eRegisterKindLLDB], 102314564Sdim valid); 103314564Sdim } 104254721Semaste 105314564Sdim void SetRegisterIsValid(uint32_t reg, bool valid) { 106314564Sdim#if defined(LLDB_CONFIGURATION_DEBUG) 107314564Sdim assert(reg < m_reg_valid.size()); 108254721Semaste#endif 109314564Sdim if (reg < m_reg_valid.size()) 110314564Sdim m_reg_valid[reg] = valid; 111314564Sdim } 112254721Semaste 113314564Sdim GDBRemoteDynamicRegisterInfo &m_reg_info; 114314564Sdim std::vector<bool> m_reg_valid; 115314564Sdim DataExtractor m_reg_data; 116314564Sdim bool m_read_all_at_once; 117360784Sdim bool m_write_all_at_once; 118254721Semaste 119254721Semasteprivate: 120314564Sdim // Helper function for ReadRegisterBytes(). 121314564Sdim bool GetPrimordialRegister(const RegisterInfo *reg_info, 122314564Sdim GDBRemoteCommunicationClient &gdb_comm); 123314564Sdim // Helper function for WriteRegisterBytes(). 124314564Sdim bool SetPrimordialRegister(const RegisterInfo *reg_info, 125314564Sdim GDBRemoteCommunicationClient &gdb_comm); 126254721Semaste 127314564Sdim DISALLOW_COPY_AND_ASSIGN(GDBRemoteRegisterContext); 128254721Semaste}; 129254721Semaste 130288943Sdim} // namespace process_gdb_remote 131288943Sdim} // namespace lldb_private 132288943Sdim 133296417Sdim#endif // lldb_GDBRemoteRegisterContext_h_ 134