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 &reg_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 &reg_checkpoint) override;
74 
75   bool
76   WriteAllRegisterValues(const RegisterCheckpoint &reg_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