xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.h (revision 061da546b983eb767bad15e67af1174fb0bcf31c)
1*061da546Spatrick //===-- GDBRemoteRegisterContext.h ------------------------------*- C++ -*-===//
2*061da546Spatrick //
3*061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5*061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*061da546Spatrick //
7*061da546Spatrick //===----------------------------------------------------------------------===//
8*061da546Spatrick 
9*061da546Spatrick #ifndef lldb_GDBRemoteRegisterContext_h_
10*061da546Spatrick #define lldb_GDBRemoteRegisterContext_h_
11*061da546Spatrick 
12*061da546Spatrick #include <vector>
13*061da546Spatrick 
14*061da546Spatrick #include "Plugins/Process/Utility/DynamicRegisterInfo.h"
15*061da546Spatrick #include "lldb/Target/RegisterContext.h"
16*061da546Spatrick #include "lldb/Utility/ConstString.h"
17*061da546Spatrick #include "lldb/Utility/DataExtractor.h"
18*061da546Spatrick #include "lldb/lldb-enumerations.h"
19*061da546Spatrick #include "lldb/lldb-private.h"
20*061da546Spatrick 
21*061da546Spatrick #include "GDBRemoteCommunicationClient.h"
22*061da546Spatrick 
23*061da546Spatrick class StringExtractor;
24*061da546Spatrick 
25*061da546Spatrick namespace lldb_private {
26*061da546Spatrick namespace process_gdb_remote {
27*061da546Spatrick 
28*061da546Spatrick class ThreadGDBRemote;
29*061da546Spatrick class ProcessGDBRemote;
30*061da546Spatrick 
31*061da546Spatrick class GDBRemoteDynamicRegisterInfo : public DynamicRegisterInfo {
32*061da546Spatrick public:
33*061da546Spatrick   GDBRemoteDynamicRegisterInfo() : DynamicRegisterInfo() {}
34*061da546Spatrick 
35*061da546Spatrick   ~GDBRemoteDynamicRegisterInfo() override = default;
36*061da546Spatrick 
37*061da546Spatrick   void HardcodeARMRegisters(bool from_scratch);
38*061da546Spatrick };
39*061da546Spatrick 
40*061da546Spatrick class GDBRemoteRegisterContext : public RegisterContext {
41*061da546Spatrick public:
42*061da546Spatrick   GDBRemoteRegisterContext(ThreadGDBRemote &thread, uint32_t concrete_frame_idx,
43*061da546Spatrick                            GDBRemoteDynamicRegisterInfo &reg_info,
44*061da546Spatrick                            bool read_all_at_once, bool write_all_at_once);
45*061da546Spatrick 
46*061da546Spatrick   ~GDBRemoteRegisterContext() override;
47*061da546Spatrick 
48*061da546Spatrick   void InvalidateAllRegisters() override;
49*061da546Spatrick 
50*061da546Spatrick   size_t GetRegisterCount() override;
51*061da546Spatrick 
52*061da546Spatrick   const RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override;
53*061da546Spatrick 
54*061da546Spatrick   size_t GetRegisterSetCount() override;
55*061da546Spatrick 
56*061da546Spatrick   const RegisterSet *GetRegisterSet(size_t reg_set) override;
57*061da546Spatrick 
58*061da546Spatrick   bool ReadRegister(const RegisterInfo *reg_info,
59*061da546Spatrick                     RegisterValue &value) override;
60*061da546Spatrick 
61*061da546Spatrick   bool WriteRegister(const RegisterInfo *reg_info,
62*061da546Spatrick                      const RegisterValue &value) override;
63*061da546Spatrick 
64*061da546Spatrick   bool ReadAllRegisterValues(lldb::DataBufferSP &data_sp) override;
65*061da546Spatrick 
66*061da546Spatrick   bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;
67*061da546Spatrick 
68*061da546Spatrick   bool ReadAllRegisterValues(RegisterCheckpoint &reg_checkpoint) override;
69*061da546Spatrick 
70*061da546Spatrick   bool
71*061da546Spatrick   WriteAllRegisterValues(const RegisterCheckpoint &reg_checkpoint) override;
72*061da546Spatrick 
73*061da546Spatrick   uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,
74*061da546Spatrick                                                uint32_t num) override;
75*061da546Spatrick 
76*061da546Spatrick protected:
77*061da546Spatrick   friend class ThreadGDBRemote;
78*061da546Spatrick 
79*061da546Spatrick   bool ReadRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data);
80*061da546Spatrick 
81*061da546Spatrick   bool WriteRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data,
82*061da546Spatrick                           uint32_t data_offset);
83*061da546Spatrick 
84*061da546Spatrick   bool PrivateSetRegisterValue(uint32_t reg, llvm::ArrayRef<uint8_t> data);
85*061da546Spatrick 
86*061da546Spatrick   bool PrivateSetRegisterValue(uint32_t reg, uint64_t val);
87*061da546Spatrick 
88*061da546Spatrick   void SetAllRegisterValid(bool b);
89*061da546Spatrick 
90*061da546Spatrick   bool GetRegisterIsValid(uint32_t reg) const {
91*061da546Spatrick #if defined(LLDB_CONFIGURATION_DEBUG)
92*061da546Spatrick     assert(reg < m_reg_valid.size());
93*061da546Spatrick #endif
94*061da546Spatrick     if (reg < m_reg_valid.size())
95*061da546Spatrick       return m_reg_valid[reg];
96*061da546Spatrick     return false;
97*061da546Spatrick   }
98*061da546Spatrick 
99*061da546Spatrick   void SetRegisterIsValid(const RegisterInfo *reg_info, bool valid) {
100*061da546Spatrick     if (reg_info)
101*061da546Spatrick       return SetRegisterIsValid(reg_info->kinds[lldb::eRegisterKindLLDB],
102*061da546Spatrick                                 valid);
103*061da546Spatrick   }
104*061da546Spatrick 
105*061da546Spatrick   void SetRegisterIsValid(uint32_t reg, bool valid) {
106*061da546Spatrick #if defined(LLDB_CONFIGURATION_DEBUG)
107*061da546Spatrick     assert(reg < m_reg_valid.size());
108*061da546Spatrick #endif
109*061da546Spatrick     if (reg < m_reg_valid.size())
110*061da546Spatrick       m_reg_valid[reg] = valid;
111*061da546Spatrick   }
112*061da546Spatrick 
113*061da546Spatrick   GDBRemoteDynamicRegisterInfo &m_reg_info;
114*061da546Spatrick   std::vector<bool> m_reg_valid;
115*061da546Spatrick   DataExtractor m_reg_data;
116*061da546Spatrick   bool m_read_all_at_once;
117*061da546Spatrick   bool m_write_all_at_once;
118*061da546Spatrick 
119*061da546Spatrick private:
120*061da546Spatrick   // Helper function for ReadRegisterBytes().
121*061da546Spatrick   bool GetPrimordialRegister(const RegisterInfo *reg_info,
122*061da546Spatrick                              GDBRemoteCommunicationClient &gdb_comm);
123*061da546Spatrick   // Helper function for WriteRegisterBytes().
124*061da546Spatrick   bool SetPrimordialRegister(const RegisterInfo *reg_info,
125*061da546Spatrick                              GDBRemoteCommunicationClient &gdb_comm);
126*061da546Spatrick 
127*061da546Spatrick   DISALLOW_COPY_AND_ASSIGN(GDBRemoteRegisterContext);
128*061da546Spatrick };
129*061da546Spatrick 
130*061da546Spatrick } // namespace process_gdb_remote
131*061da546Spatrick } // namespace lldb_private
132*061da546Spatrick 
133*061da546Spatrick #endif // lldb_GDBRemoteRegisterContext_h_
134