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: GDBRemoteDynamicRegisterInfo()37 GDBRemoteDynamicRegisterInfo() : DynamicRegisterInfo() {} 38 39 ~GDBRemoteDynamicRegisterInfo() override = default; 40 41 void UpdateARM64SVERegistersInfos(uint64_t vg); 42 void UpdateARM64SMERegistersInfos(uint64_t svg); 43 }; 44 45 class GDBRemoteRegisterContext : public RegisterContext { 46 public: 47 GDBRemoteRegisterContext(ThreadGDBRemote &thread, uint32_t concrete_frame_idx, 48 GDBRemoteDynamicRegisterInfoSP reg_info_sp, 49 bool read_all_at_once, bool write_all_at_once); 50 51 ~GDBRemoteRegisterContext() override; 52 53 void InvalidateAllRegisters() override; 54 55 size_t GetRegisterCount() override; 56 57 const RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override; 58 59 size_t GetRegisterSetCount() override; 60 61 const RegisterSet *GetRegisterSet(size_t reg_set) override; 62 63 bool ReadRegister(const RegisterInfo *reg_info, 64 RegisterValue &value) override; 65 66 bool WriteRegister(const RegisterInfo *reg_info, 67 const RegisterValue &value) override; 68 69 bool ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override; 70 71 bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override; 72 73 bool ReadAllRegisterValues(RegisterCheckpoint ®_checkpoint) override; 74 75 bool 76 WriteAllRegisterValues(const RegisterCheckpoint ®_checkpoint) override; 77 78 uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind, 79 uint32_t num) override; 80 81 bool RegisterWriteCausesReconfigure(const llvm::StringRef name) override; 82 83 bool ReconfigureRegisterInfo() override; 84 85 protected: 86 friend class ThreadGDBRemote; 87 88 bool ReadRegisterBytes(const RegisterInfo *reg_info); 89 90 bool WriteRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data, 91 uint32_t data_offset); 92 93 bool PrivateSetRegisterValue(uint32_t reg, llvm::ArrayRef<uint8_t> data); 94 95 bool PrivateSetRegisterValue(uint32_t reg, uint64_t val); 96 97 void SetAllRegisterValid(bool b); 98 GetRegisterIsValid(uint32_t reg)99 bool GetRegisterIsValid(uint32_t reg) const { 100 assert(reg < m_reg_valid.size()); 101 if (reg < m_reg_valid.size()) 102 return m_reg_valid[reg]; 103 return false; 104 } 105 SetRegisterIsValid(const RegisterInfo * reg_info,bool valid)106 void SetRegisterIsValid(const RegisterInfo *reg_info, bool valid) { 107 if (reg_info) 108 return SetRegisterIsValid(reg_info->kinds[lldb::eRegisterKindLLDB], 109 valid); 110 } 111 SetRegisterIsValid(uint32_t reg,bool valid)112 void SetRegisterIsValid(uint32_t reg, bool valid) { 113 assert(reg < m_reg_valid.size()); 114 if (reg < m_reg_valid.size()) 115 m_reg_valid[reg] = valid; 116 } 117 118 GDBRemoteDynamicRegisterInfoSP m_reg_info_sp; 119 std::vector<bool> m_reg_valid; 120 DataExtractor m_reg_data; 121 bool m_read_all_at_once; 122 bool m_write_all_at_once; 123 bool m_gpacket_cached; 124 125 private: 126 // Helper function for ReadRegisterBytes(). 127 bool GetPrimordialRegister(const RegisterInfo *reg_info, 128 GDBRemoteCommunicationClient &gdb_comm); 129 // Helper function for WriteRegisterBytes(). 130 bool SetPrimordialRegister(const RegisterInfo *reg_info, 131 GDBRemoteCommunicationClient &gdb_comm); 132 133 GDBRemoteRegisterContext(const GDBRemoteRegisterContext &) = delete; 134 const GDBRemoteRegisterContext & 135 operator=(const GDBRemoteRegisterContext &) = delete; 136 }; 137 138 } // namespace process_gdb_remote 139 } // namespace lldb_private 140 141 #endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTEREGISTERCONTEXT_H 142