1061da546Spatrick //===-- GDBRemoteRegisterContext.h ------------------------------*- C++ -*-===// 2061da546Spatrick // 3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information. 5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6061da546Spatrick // 7061da546Spatrick //===----------------------------------------------------------------------===// 8061da546Spatrick 9dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTEREGISTERCONTEXT_H 10dda28197Spatrick #define LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTEREGISTERCONTEXT_H 11061da546Spatrick 12061da546Spatrick #include <vector> 13061da546Spatrick 14*f6aab3d8Srobert #include "lldb/Target/DynamicRegisterInfo.h" 15061da546Spatrick #include "lldb/Target/RegisterContext.h" 16061da546Spatrick #include "lldb/Utility/ConstString.h" 17061da546Spatrick #include "lldb/Utility/DataExtractor.h" 18061da546Spatrick #include "lldb/lldb-enumerations.h" 19061da546Spatrick #include "lldb/lldb-private.h" 20061da546Spatrick 21061da546Spatrick #include "GDBRemoteCommunicationClient.h" 22061da546Spatrick 23061da546Spatrick class StringExtractor; 24061da546Spatrick 25061da546Spatrick namespace lldb_private { 26061da546Spatrick namespace process_gdb_remote { 27061da546Spatrick 28061da546Spatrick class ThreadGDBRemote; 29061da546Spatrick class ProcessGDBRemote; 30be691f3bSpatrick class GDBRemoteDynamicRegisterInfo; 31061da546Spatrick 32be691f3bSpatrick typedef std::shared_ptr<GDBRemoteDynamicRegisterInfo> 33be691f3bSpatrick GDBRemoteDynamicRegisterInfoSP; 34be691f3bSpatrick 35be691f3bSpatrick class GDBRemoteDynamicRegisterInfo final : public DynamicRegisterInfo { 36061da546Spatrick public: GDBRemoteDynamicRegisterInfo()37061da546Spatrick GDBRemoteDynamicRegisterInfo() : DynamicRegisterInfo() {} 38061da546Spatrick 39061da546Spatrick ~GDBRemoteDynamicRegisterInfo() override = default; 40061da546Spatrick 41be691f3bSpatrick bool UpdateARM64SVERegistersInfos(uint64_t vg); 42061da546Spatrick }; 43061da546Spatrick 44061da546Spatrick class GDBRemoteRegisterContext : public RegisterContext { 45061da546Spatrick public: 46061da546Spatrick GDBRemoteRegisterContext(ThreadGDBRemote &thread, uint32_t concrete_frame_idx, 47be691f3bSpatrick GDBRemoteDynamicRegisterInfoSP reg_info_sp, 48061da546Spatrick bool read_all_at_once, bool write_all_at_once); 49061da546Spatrick 50061da546Spatrick ~GDBRemoteRegisterContext() override; 51061da546Spatrick 52061da546Spatrick void InvalidateAllRegisters() override; 53061da546Spatrick 54061da546Spatrick size_t GetRegisterCount() override; 55061da546Spatrick 56061da546Spatrick const RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override; 57061da546Spatrick 58061da546Spatrick size_t GetRegisterSetCount() override; 59061da546Spatrick 60061da546Spatrick const RegisterSet *GetRegisterSet(size_t reg_set) override; 61061da546Spatrick 62061da546Spatrick bool ReadRegister(const RegisterInfo *reg_info, 63061da546Spatrick RegisterValue &value) override; 64061da546Spatrick 65061da546Spatrick bool WriteRegister(const RegisterInfo *reg_info, 66061da546Spatrick const RegisterValue &value) override; 67061da546Spatrick 68*f6aab3d8Srobert bool ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override; 69061da546Spatrick 70061da546Spatrick bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override; 71061da546Spatrick 72061da546Spatrick bool ReadAllRegisterValues(RegisterCheckpoint ®_checkpoint) override; 73061da546Spatrick 74061da546Spatrick bool 75061da546Spatrick WriteAllRegisterValues(const RegisterCheckpoint ®_checkpoint) override; 76061da546Spatrick 77061da546Spatrick uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind, 78061da546Spatrick uint32_t num) override; 79061da546Spatrick 80be691f3bSpatrick bool AArch64SVEReconfigure(); 81be691f3bSpatrick 82061da546Spatrick protected: 83061da546Spatrick friend class ThreadGDBRemote; 84061da546Spatrick 85*f6aab3d8Srobert bool ReadRegisterBytes(const RegisterInfo *reg_info); 86061da546Spatrick 87061da546Spatrick bool WriteRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data, 88061da546Spatrick uint32_t data_offset); 89061da546Spatrick 90061da546Spatrick bool PrivateSetRegisterValue(uint32_t reg, llvm::ArrayRef<uint8_t> data); 91061da546Spatrick 92061da546Spatrick bool PrivateSetRegisterValue(uint32_t reg, uint64_t val); 93061da546Spatrick 94061da546Spatrick void SetAllRegisterValid(bool b); 95061da546Spatrick GetRegisterIsValid(uint32_t reg)96061da546Spatrick bool GetRegisterIsValid(uint32_t reg) const { 97061da546Spatrick assert(reg < m_reg_valid.size()); 98061da546Spatrick if (reg < m_reg_valid.size()) 99061da546Spatrick return m_reg_valid[reg]; 100061da546Spatrick return false; 101061da546Spatrick } 102061da546Spatrick SetRegisterIsValid(const RegisterInfo * reg_info,bool valid)103061da546Spatrick void SetRegisterIsValid(const RegisterInfo *reg_info, bool valid) { 104061da546Spatrick if (reg_info) 105061da546Spatrick return SetRegisterIsValid(reg_info->kinds[lldb::eRegisterKindLLDB], 106061da546Spatrick valid); 107061da546Spatrick } 108061da546Spatrick SetRegisterIsValid(uint32_t reg,bool valid)109061da546Spatrick void SetRegisterIsValid(uint32_t reg, bool valid) { 110061da546Spatrick assert(reg < m_reg_valid.size()); 111061da546Spatrick if (reg < m_reg_valid.size()) 112061da546Spatrick m_reg_valid[reg] = valid; 113061da546Spatrick } 114061da546Spatrick 115be691f3bSpatrick GDBRemoteDynamicRegisterInfoSP m_reg_info_sp; 116061da546Spatrick std::vector<bool> m_reg_valid; 117061da546Spatrick DataExtractor m_reg_data; 118061da546Spatrick bool m_read_all_at_once; 119061da546Spatrick bool m_write_all_at_once; 120be691f3bSpatrick bool m_gpacket_cached; 121061da546Spatrick 122061da546Spatrick private: 123061da546Spatrick // Helper function for ReadRegisterBytes(). 124061da546Spatrick bool GetPrimordialRegister(const RegisterInfo *reg_info, 125061da546Spatrick GDBRemoteCommunicationClient &gdb_comm); 126061da546Spatrick // Helper function for WriteRegisterBytes(). 127061da546Spatrick bool SetPrimordialRegister(const RegisterInfo *reg_info, 128061da546Spatrick GDBRemoteCommunicationClient &gdb_comm); 129061da546Spatrick 130dda28197Spatrick GDBRemoteRegisterContext(const GDBRemoteRegisterContext &) = delete; 131dda28197Spatrick const GDBRemoteRegisterContext & 132dda28197Spatrick operator=(const GDBRemoteRegisterContext &) = delete; 133061da546Spatrick }; 134061da546Spatrick 135061da546Spatrick } // namespace process_gdb_remote 136061da546Spatrick } // namespace lldb_private 137061da546Spatrick 138dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTEREGISTERCONTEXT_H 139