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_
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"
22 #include "GDBRemoteCommunicationClient.h"
24 class StringExtractor;
26 namespace lldb_private {
27 namespace process_gdb_remote {
29 class ThreadGDBRemote;
30 class ProcessGDBRemote;
32 class GDBRemoteDynamicRegisterInfo : public DynamicRegisterInfo {
34 GDBRemoteDynamicRegisterInfo() : DynamicRegisterInfo() {}
36 ~GDBRemoteDynamicRegisterInfo() override = default;
38 void HardcodeARMRegisters(bool from_scratch);
41 class GDBRemoteRegisterContext : public RegisterContext {
43 GDBRemoteRegisterContext(ThreadGDBRemote &thread, uint32_t concrete_frame_idx,
44 GDBRemoteDynamicRegisterInfo ®_info,
45 bool read_all_at_once);
47 ~GDBRemoteRegisterContext() override;
49 void InvalidateAllRegisters() override;
51 size_t GetRegisterCount() override;
53 const RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override;
55 size_t GetRegisterSetCount() override;
57 const RegisterSet *GetRegisterSet(size_t reg_set) override;
59 bool ReadRegister(const RegisterInfo *reg_info,
60 RegisterValue &value) override;
62 bool WriteRegister(const RegisterInfo *reg_info,
63 const RegisterValue &value) override;
65 bool ReadAllRegisterValues(lldb::DataBufferSP &data_sp) override;
67 bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;
69 bool ReadAllRegisterValues(RegisterCheckpoint ®_checkpoint) override;
72 WriteAllRegisterValues(const RegisterCheckpoint ®_checkpoint) override;
74 uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,
75 uint32_t num) override;
78 friend class ThreadGDBRemote;
80 bool ReadRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data);
82 bool WriteRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data,
83 uint32_t data_offset);
85 bool PrivateSetRegisterValue(uint32_t reg, llvm::ArrayRef<uint8_t> data);
87 bool PrivateSetRegisterValue(uint32_t reg, uint64_t val);
89 void SetAllRegisterValid(bool b);
91 bool GetRegisterIsValid(uint32_t reg) const {
92 #if defined(LLDB_CONFIGURATION_DEBUG)
93 assert(reg < m_reg_valid.size());
95 if (reg < m_reg_valid.size())
96 return m_reg_valid[reg];
100 void SetRegisterIsValid(const RegisterInfo *reg_info, bool valid) {
102 return SetRegisterIsValid(reg_info->kinds[lldb::eRegisterKindLLDB],
106 void SetRegisterIsValid(uint32_t reg, bool valid) {
107 #if defined(LLDB_CONFIGURATION_DEBUG)
108 assert(reg < m_reg_valid.size());
110 if (reg < m_reg_valid.size())
111 m_reg_valid[reg] = valid;
114 GDBRemoteDynamicRegisterInfo &m_reg_info;
115 std::vector<bool> m_reg_valid;
116 DataExtractor m_reg_data;
117 bool m_read_all_at_once;
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);
127 DISALLOW_COPY_AND_ASSIGN(GDBRemoteRegisterContext);
130 } // namespace process_gdb_remote
131 } // namespace lldb_private
133 #endif // lldb_GDBRemoteRegisterContext_h_