1 //===-- GDBRemoteRegisterContext.h ------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef lldb_GDBRemoteRegisterContext_h_
11 #define lldb_GDBRemoteRegisterContext_h_
17 // Other libraries and framework includes
19 #include "Plugins/Process/Utility/DynamicRegisterInfo.h"
20 #include "lldb/Target/RegisterContext.h"
21 #include "lldb/Utility/ConstString.h"
22 #include "lldb/Utility/DataExtractor.h"
23 #include "lldb/lldb-enumerations.h"
24 #include "lldb/lldb-private.h"
26 #include "GDBRemoteCommunicationClient.h"
28 class StringExtractor;
30 namespace lldb_private {
31 namespace process_gdb_remote {
33 class ThreadGDBRemote;
34 class ProcessGDBRemote;
36 class GDBRemoteDynamicRegisterInfo : public DynamicRegisterInfo {
38 GDBRemoteDynamicRegisterInfo() : DynamicRegisterInfo() {}
40 ~GDBRemoteDynamicRegisterInfo() override = default;
42 void HardcodeARMRegisters(bool from_scratch);
45 class GDBRemoteRegisterContext : public RegisterContext {
47 GDBRemoteRegisterContext(ThreadGDBRemote &thread, uint32_t concrete_frame_idx,
48 GDBRemoteDynamicRegisterInfo ®_info,
49 bool read_all_at_once);
51 ~GDBRemoteRegisterContext() override;
53 void InvalidateAllRegisters() override;
55 size_t GetRegisterCount() override;
57 const RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override;
59 size_t GetRegisterSetCount() override;
61 const RegisterSet *GetRegisterSet(size_t reg_set) override;
63 bool ReadRegister(const RegisterInfo *reg_info,
64 RegisterValue &value) override;
66 bool WriteRegister(const RegisterInfo *reg_info,
67 const RegisterValue &value) override;
69 bool ReadAllRegisterValues(lldb::DataBufferSP &data_sp) override;
71 bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;
73 bool ReadAllRegisterValues(RegisterCheckpoint ®_checkpoint) override;
76 WriteAllRegisterValues(const RegisterCheckpoint ®_checkpoint) override;
78 uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,
79 uint32_t num) override;
82 friend class ThreadGDBRemote;
84 bool ReadRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data);
86 bool WriteRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data,
87 uint32_t data_offset);
89 bool PrivateSetRegisterValue(uint32_t reg, llvm::ArrayRef<uint8_t> data);
91 bool PrivateSetRegisterValue(uint32_t reg, uint64_t val);
93 void SetAllRegisterValid(bool b);
95 bool GetRegisterIsValid(uint32_t reg) const {
96 #if defined(LLDB_CONFIGURATION_DEBUG)
97 assert(reg < m_reg_valid.size());
99 if (reg < m_reg_valid.size())
100 return m_reg_valid[reg];
104 void SetRegisterIsValid(const RegisterInfo *reg_info, bool valid) {
106 return SetRegisterIsValid(reg_info->kinds[lldb::eRegisterKindLLDB],
110 void SetRegisterIsValid(uint32_t reg, bool valid) {
111 #if defined(LLDB_CONFIGURATION_DEBUG)
112 assert(reg < m_reg_valid.size());
114 if (reg < m_reg_valid.size())
115 m_reg_valid[reg] = valid;
118 GDBRemoteDynamicRegisterInfo &m_reg_info;
119 std::vector<bool> m_reg_valid;
120 DataExtractor m_reg_data;
121 bool m_read_all_at_once;
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);
131 DISALLOW_COPY_AND_ASSIGN(GDBRemoteRegisterContext);
134 } // namespace process_gdb_remote
135 } // namespace lldb_private
137 #endif // lldb_GDBRemoteRegisterContext_h_