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