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 "Plugins/Process/Utility/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 void HardcodeARMRegisters(bool from_scratch); 42 bool UpdateARM64SVERegistersInfos(uint64_t vg); 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::DataBufferSP &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 AArch64SVEReconfigure(); 82 83 protected: 84 friend class ThreadGDBRemote; 85 86 bool ReadRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data); 87 88 bool WriteRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data, 89 uint32_t data_offset); 90 91 bool PrivateSetRegisterValue(uint32_t reg, llvm::ArrayRef<uint8_t> data); 92 93 bool PrivateSetRegisterValue(uint32_t reg, uint64_t val); 94 95 void SetAllRegisterValid(bool b); 96 97 bool GetRegisterIsValid(uint32_t reg) const { 98 assert(reg < m_reg_valid.size()); 99 if (reg < m_reg_valid.size()) 100 return m_reg_valid[reg]; 101 return false; 102 } 103 104 void SetRegisterIsValid(const RegisterInfo *reg_info, bool valid) { 105 if (reg_info) 106 return SetRegisterIsValid(reg_info->kinds[lldb::eRegisterKindLLDB], 107 valid); 108 } 109 110 void SetRegisterIsValid(uint32_t reg, bool valid) { 111 assert(reg < m_reg_valid.size()); 112 if (reg < m_reg_valid.size()) 113 m_reg_valid[reg] = valid; 114 } 115 116 GDBRemoteDynamicRegisterInfoSP m_reg_info_sp; 117 std::vector<bool> m_reg_valid; 118 DataExtractor m_reg_data; 119 bool m_read_all_at_once; 120 bool m_write_all_at_once; 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