1*061da546Spatrick //===-- GDBRemoteRegisterContext.h ------------------------------*- C++ -*-===// 2*061da546Spatrick // 3*061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*061da546Spatrick // See https://llvm.org/LICENSE.txt for license information. 5*061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*061da546Spatrick // 7*061da546Spatrick //===----------------------------------------------------------------------===// 8*061da546Spatrick 9*061da546Spatrick #ifndef lldb_GDBRemoteRegisterContext_h_ 10*061da546Spatrick #define lldb_GDBRemoteRegisterContext_h_ 11*061da546Spatrick 12*061da546Spatrick #include <vector> 13*061da546Spatrick 14*061da546Spatrick #include "Plugins/Process/Utility/DynamicRegisterInfo.h" 15*061da546Spatrick #include "lldb/Target/RegisterContext.h" 16*061da546Spatrick #include "lldb/Utility/ConstString.h" 17*061da546Spatrick #include "lldb/Utility/DataExtractor.h" 18*061da546Spatrick #include "lldb/lldb-enumerations.h" 19*061da546Spatrick #include "lldb/lldb-private.h" 20*061da546Spatrick 21*061da546Spatrick #include "GDBRemoteCommunicationClient.h" 22*061da546Spatrick 23*061da546Spatrick class StringExtractor; 24*061da546Spatrick 25*061da546Spatrick namespace lldb_private { 26*061da546Spatrick namespace process_gdb_remote { 27*061da546Spatrick 28*061da546Spatrick class ThreadGDBRemote; 29*061da546Spatrick class ProcessGDBRemote; 30*061da546Spatrick 31*061da546Spatrick class GDBRemoteDynamicRegisterInfo : public DynamicRegisterInfo { 32*061da546Spatrick public: 33*061da546Spatrick GDBRemoteDynamicRegisterInfo() : DynamicRegisterInfo() {} 34*061da546Spatrick 35*061da546Spatrick ~GDBRemoteDynamicRegisterInfo() override = default; 36*061da546Spatrick 37*061da546Spatrick void HardcodeARMRegisters(bool from_scratch); 38*061da546Spatrick }; 39*061da546Spatrick 40*061da546Spatrick class GDBRemoteRegisterContext : public RegisterContext { 41*061da546Spatrick public: 42*061da546Spatrick GDBRemoteRegisterContext(ThreadGDBRemote &thread, uint32_t concrete_frame_idx, 43*061da546Spatrick GDBRemoteDynamicRegisterInfo ®_info, 44*061da546Spatrick bool read_all_at_once, bool write_all_at_once); 45*061da546Spatrick 46*061da546Spatrick ~GDBRemoteRegisterContext() override; 47*061da546Spatrick 48*061da546Spatrick void InvalidateAllRegisters() override; 49*061da546Spatrick 50*061da546Spatrick size_t GetRegisterCount() override; 51*061da546Spatrick 52*061da546Spatrick const RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override; 53*061da546Spatrick 54*061da546Spatrick size_t GetRegisterSetCount() override; 55*061da546Spatrick 56*061da546Spatrick const RegisterSet *GetRegisterSet(size_t reg_set) override; 57*061da546Spatrick 58*061da546Spatrick bool ReadRegister(const RegisterInfo *reg_info, 59*061da546Spatrick RegisterValue &value) override; 60*061da546Spatrick 61*061da546Spatrick bool WriteRegister(const RegisterInfo *reg_info, 62*061da546Spatrick const RegisterValue &value) override; 63*061da546Spatrick 64*061da546Spatrick bool ReadAllRegisterValues(lldb::DataBufferSP &data_sp) override; 65*061da546Spatrick 66*061da546Spatrick bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override; 67*061da546Spatrick 68*061da546Spatrick bool ReadAllRegisterValues(RegisterCheckpoint ®_checkpoint) override; 69*061da546Spatrick 70*061da546Spatrick bool 71*061da546Spatrick WriteAllRegisterValues(const RegisterCheckpoint ®_checkpoint) override; 72*061da546Spatrick 73*061da546Spatrick uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind, 74*061da546Spatrick uint32_t num) override; 75*061da546Spatrick 76*061da546Spatrick protected: 77*061da546Spatrick friend class ThreadGDBRemote; 78*061da546Spatrick 79*061da546Spatrick bool ReadRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data); 80*061da546Spatrick 81*061da546Spatrick bool WriteRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data, 82*061da546Spatrick uint32_t data_offset); 83*061da546Spatrick 84*061da546Spatrick bool PrivateSetRegisterValue(uint32_t reg, llvm::ArrayRef<uint8_t> data); 85*061da546Spatrick 86*061da546Spatrick bool PrivateSetRegisterValue(uint32_t reg, uint64_t val); 87*061da546Spatrick 88*061da546Spatrick void SetAllRegisterValid(bool b); 89*061da546Spatrick 90*061da546Spatrick bool GetRegisterIsValid(uint32_t reg) const { 91*061da546Spatrick #if defined(LLDB_CONFIGURATION_DEBUG) 92*061da546Spatrick assert(reg < m_reg_valid.size()); 93*061da546Spatrick #endif 94*061da546Spatrick if (reg < m_reg_valid.size()) 95*061da546Spatrick return m_reg_valid[reg]; 96*061da546Spatrick return false; 97*061da546Spatrick } 98*061da546Spatrick 99*061da546Spatrick void SetRegisterIsValid(const RegisterInfo *reg_info, bool valid) { 100*061da546Spatrick if (reg_info) 101*061da546Spatrick return SetRegisterIsValid(reg_info->kinds[lldb::eRegisterKindLLDB], 102*061da546Spatrick valid); 103*061da546Spatrick } 104*061da546Spatrick 105*061da546Spatrick void SetRegisterIsValid(uint32_t reg, bool valid) { 106*061da546Spatrick #if defined(LLDB_CONFIGURATION_DEBUG) 107*061da546Spatrick assert(reg < m_reg_valid.size()); 108*061da546Spatrick #endif 109*061da546Spatrick if (reg < m_reg_valid.size()) 110*061da546Spatrick m_reg_valid[reg] = valid; 111*061da546Spatrick } 112*061da546Spatrick 113*061da546Spatrick GDBRemoteDynamicRegisterInfo &m_reg_info; 114*061da546Spatrick std::vector<bool> m_reg_valid; 115*061da546Spatrick DataExtractor m_reg_data; 116*061da546Spatrick bool m_read_all_at_once; 117*061da546Spatrick bool m_write_all_at_once; 118*061da546Spatrick 119*061da546Spatrick private: 120*061da546Spatrick // Helper function for ReadRegisterBytes(). 121*061da546Spatrick bool GetPrimordialRegister(const RegisterInfo *reg_info, 122*061da546Spatrick GDBRemoteCommunicationClient &gdb_comm); 123*061da546Spatrick // Helper function for WriteRegisterBytes(). 124*061da546Spatrick bool SetPrimordialRegister(const RegisterInfo *reg_info, 125*061da546Spatrick GDBRemoteCommunicationClient &gdb_comm); 126*061da546Spatrick 127*061da546Spatrick DISALLOW_COPY_AND_ASSIGN(GDBRemoteRegisterContext); 128*061da546Spatrick }; 129*061da546Spatrick 130*061da546Spatrick } // namespace process_gdb_remote 131*061da546Spatrick } // namespace lldb_private 132*061da546Spatrick 133*061da546Spatrick #endif // lldb_GDBRemoteRegisterContext_h_ 134