1 //===-- GDBRemoteRegisterContext.h ------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef lldb_GDBRemoteRegisterContext_h_ 11 #define lldb_GDBRemoteRegisterContext_h_ 12 13 // C Includes 14 // C++ Includes 15 #include <vector> 16 17 // Other libraries and framework includes 18 // Project includes 19 #include "Plugins/Process/Utility/DynamicRegisterInfo.h" 20 #include "lldb/Core/ConstString.h" 21 #include "lldb/Core/DataExtractor.h" 22 #include "lldb/Target/RegisterContext.h" 23 #include "lldb/lldb-enumerations.h" 24 #include "lldb/lldb-private.h" 25 26 #include "GDBRemoteCommunicationClient.h" 27 28 class StringExtractor; 29 30 namespace lldb_private { 31 namespace process_gdb_remote { 32 33 class ThreadGDBRemote; 34 class ProcessGDBRemote; 35 36 class GDBRemoteDynamicRegisterInfo : public DynamicRegisterInfo { 37 public: 38 GDBRemoteDynamicRegisterInfo() : DynamicRegisterInfo() {} 39 40 ~GDBRemoteDynamicRegisterInfo() override = default; 41 42 void HardcodeARMRegisters(bool from_scratch); 43 }; 44 45 class GDBRemoteRegisterContext : public RegisterContext { 46 public: 47 GDBRemoteRegisterContext(ThreadGDBRemote &thread, uint32_t concrete_frame_idx, 48 GDBRemoteDynamicRegisterInfo ®_info, 49 bool read_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 protected: 82 friend class ThreadGDBRemote; 83 84 bool ReadRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data); 85 86 bool WriteRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data, 87 uint32_t data_offset); 88 89 bool PrivateSetRegisterValue(uint32_t reg, llvm::ArrayRef<uint8_t> data); 90 91 bool PrivateSetRegisterValue(uint32_t reg, uint64_t val); 92 93 void SetAllRegisterValid(bool b); 94 95 bool GetRegisterIsValid(uint32_t reg) const { 96 #if defined(LLDB_CONFIGURATION_DEBUG) 97 assert(reg < m_reg_valid.size()); 98 #endif 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 #if defined(LLDB_CONFIGURATION_DEBUG) 112 assert(reg < m_reg_valid.size()); 113 #endif 114 if (reg < m_reg_valid.size()) 115 m_reg_valid[reg] = valid; 116 } 117 118 GDBRemoteDynamicRegisterInfo &m_reg_info; 119 std::vector<bool> m_reg_valid; 120 DataExtractor m_reg_data; 121 bool m_read_all_at_once; 122 123 private: 124 // Helper function for ReadRegisterBytes(). 125 bool GetPrimordialRegister(const RegisterInfo *reg_info, 126 GDBRemoteCommunicationClient &gdb_comm); 127 // Helper function for WriteRegisterBytes(). 128 bool SetPrimordialRegister(const RegisterInfo *reg_info, 129 GDBRemoteCommunicationClient &gdb_comm); 130 131 DISALLOW_COPY_AND_ASSIGN(GDBRemoteRegisterContext); 132 }; 133 134 } // namespace process_gdb_remote 135 } // namespace lldb_private 136 137 #endif // lldb_GDBRemoteRegisterContext_h_ 138