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 #include <vector> 14 15 #include "Plugins/Process/Utility/DynamicRegisterInfo.h" 16 #include "lldb/Target/RegisterContext.h" 17 #include "lldb/Utility/ConstString.h" 18 #include "lldb/Utility/DataExtractor.h" 19 #include "lldb/lldb-enumerations.h" 20 #include "lldb/lldb-private.h" 21 22 #include "GDBRemoteCommunicationClient.h" 23 24 class StringExtractor; 25 26 namespace lldb_private { 27 namespace process_gdb_remote { 28 29 class ThreadGDBRemote; 30 class ProcessGDBRemote; 31 32 class GDBRemoteDynamicRegisterInfo : public DynamicRegisterInfo { 33 public: GDBRemoteDynamicRegisterInfo()34 GDBRemoteDynamicRegisterInfo() : DynamicRegisterInfo() {} 35 36 ~GDBRemoteDynamicRegisterInfo() override = default; 37 38 void HardcodeARMRegisters(bool from_scratch); 39 }; 40 41 class GDBRemoteRegisterContext : public RegisterContext { 42 public: 43 GDBRemoteRegisterContext(ThreadGDBRemote &thread, uint32_t concrete_frame_idx, 44 GDBRemoteDynamicRegisterInfo ®_info, 45 bool read_all_at_once); 46 47 ~GDBRemoteRegisterContext() override; 48 49 void InvalidateAllRegisters() override; 50 51 size_t GetRegisterCount() override; 52 53 const RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override; 54 55 size_t GetRegisterSetCount() override; 56 57 const RegisterSet *GetRegisterSet(size_t reg_set) override; 58 59 bool ReadRegister(const RegisterInfo *reg_info, 60 RegisterValue &value) override; 61 62 bool WriteRegister(const RegisterInfo *reg_info, 63 const RegisterValue &value) override; 64 65 bool ReadAllRegisterValues(lldb::DataBufferSP &data_sp) override; 66 67 bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override; 68 69 bool ReadAllRegisterValues(RegisterCheckpoint ®_checkpoint) override; 70 71 bool 72 WriteAllRegisterValues(const RegisterCheckpoint ®_checkpoint) override; 73 74 uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind, 75 uint32_t num) override; 76 77 protected: 78 friend class ThreadGDBRemote; 79 80 bool ReadRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data); 81 82 bool WriteRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data, 83 uint32_t data_offset); 84 85 bool PrivateSetRegisterValue(uint32_t reg, llvm::ArrayRef<uint8_t> data); 86 87 bool PrivateSetRegisterValue(uint32_t reg, uint64_t val); 88 89 void SetAllRegisterValid(bool b); 90 GetRegisterIsValid(uint32_t reg)91 bool GetRegisterIsValid(uint32_t reg) const { 92 #if defined(LLDB_CONFIGURATION_DEBUG) 93 assert(reg < m_reg_valid.size()); 94 #endif 95 if (reg < m_reg_valid.size()) 96 return m_reg_valid[reg]; 97 return false; 98 } 99 SetRegisterIsValid(const RegisterInfo * reg_info,bool valid)100 void SetRegisterIsValid(const RegisterInfo *reg_info, bool valid) { 101 if (reg_info) 102 return SetRegisterIsValid(reg_info->kinds[lldb::eRegisterKindLLDB], 103 valid); 104 } 105 SetRegisterIsValid(uint32_t reg,bool valid)106 void SetRegisterIsValid(uint32_t reg, bool valid) { 107 #if defined(LLDB_CONFIGURATION_DEBUG) 108 assert(reg < m_reg_valid.size()); 109 #endif 110 if (reg < m_reg_valid.size()) 111 m_reg_valid[reg] = valid; 112 } 113 114 GDBRemoteDynamicRegisterInfo &m_reg_info; 115 std::vector<bool> m_reg_valid; 116 DataExtractor m_reg_data; 117 bool m_read_all_at_once; 118 119 private: 120 // Helper function for ReadRegisterBytes(). 121 bool GetPrimordialRegister(const RegisterInfo *reg_info, 122 GDBRemoteCommunicationClient &gdb_comm); 123 // Helper function for WriteRegisterBytes(). 124 bool SetPrimordialRegister(const RegisterInfo *reg_info, 125 GDBRemoteCommunicationClient &gdb_comm); 126 127 DISALLOW_COPY_AND_ASSIGN(GDBRemoteRegisterContext); 128 }; 129 130 } // namespace process_gdb_remote 131 } // namespace lldb_private 132 133 #endif // lldb_GDBRemoteRegisterContext_h_ 134