xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.h (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
1061da546Spatrick //===-- GDBRemoteRegisterContext.h ------------------------------*- C++ -*-===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick 
9dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTEREGISTERCONTEXT_H
10dda28197Spatrick #define LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTEREGISTERCONTEXT_H
11061da546Spatrick 
12061da546Spatrick #include <vector>
13061da546Spatrick 
14*f6aab3d8Srobert #include "lldb/Target/DynamicRegisterInfo.h"
15061da546Spatrick #include "lldb/Target/RegisterContext.h"
16061da546Spatrick #include "lldb/Utility/ConstString.h"
17061da546Spatrick #include "lldb/Utility/DataExtractor.h"
18061da546Spatrick #include "lldb/lldb-enumerations.h"
19061da546Spatrick #include "lldb/lldb-private.h"
20061da546Spatrick 
21061da546Spatrick #include "GDBRemoteCommunicationClient.h"
22061da546Spatrick 
23061da546Spatrick class StringExtractor;
24061da546Spatrick 
25061da546Spatrick namespace lldb_private {
26061da546Spatrick namespace process_gdb_remote {
27061da546Spatrick 
28061da546Spatrick class ThreadGDBRemote;
29061da546Spatrick class ProcessGDBRemote;
30be691f3bSpatrick class GDBRemoteDynamicRegisterInfo;
31061da546Spatrick 
32be691f3bSpatrick typedef std::shared_ptr<GDBRemoteDynamicRegisterInfo>
33be691f3bSpatrick     GDBRemoteDynamicRegisterInfoSP;
34be691f3bSpatrick 
35be691f3bSpatrick class GDBRemoteDynamicRegisterInfo final : public DynamicRegisterInfo {
36061da546Spatrick public:
GDBRemoteDynamicRegisterInfo()37061da546Spatrick   GDBRemoteDynamicRegisterInfo() : DynamicRegisterInfo() {}
38061da546Spatrick 
39061da546Spatrick   ~GDBRemoteDynamicRegisterInfo() override = default;
40061da546Spatrick 
41be691f3bSpatrick   bool UpdateARM64SVERegistersInfos(uint64_t vg);
42061da546Spatrick };
43061da546Spatrick 
44061da546Spatrick class GDBRemoteRegisterContext : public RegisterContext {
45061da546Spatrick public:
46061da546Spatrick   GDBRemoteRegisterContext(ThreadGDBRemote &thread, uint32_t concrete_frame_idx,
47be691f3bSpatrick                            GDBRemoteDynamicRegisterInfoSP reg_info_sp,
48061da546Spatrick                            bool read_all_at_once, bool write_all_at_once);
49061da546Spatrick 
50061da546Spatrick   ~GDBRemoteRegisterContext() override;
51061da546Spatrick 
52061da546Spatrick   void InvalidateAllRegisters() override;
53061da546Spatrick 
54061da546Spatrick   size_t GetRegisterCount() override;
55061da546Spatrick 
56061da546Spatrick   const RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override;
57061da546Spatrick 
58061da546Spatrick   size_t GetRegisterSetCount() override;
59061da546Spatrick 
60061da546Spatrick   const RegisterSet *GetRegisterSet(size_t reg_set) override;
61061da546Spatrick 
62061da546Spatrick   bool ReadRegister(const RegisterInfo *reg_info,
63061da546Spatrick                     RegisterValue &value) override;
64061da546Spatrick 
65061da546Spatrick   bool WriteRegister(const RegisterInfo *reg_info,
66061da546Spatrick                      const RegisterValue &value) override;
67061da546Spatrick 
68*f6aab3d8Srobert   bool ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override;
69061da546Spatrick 
70061da546Spatrick   bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;
71061da546Spatrick 
72061da546Spatrick   bool ReadAllRegisterValues(RegisterCheckpoint &reg_checkpoint) override;
73061da546Spatrick 
74061da546Spatrick   bool
75061da546Spatrick   WriteAllRegisterValues(const RegisterCheckpoint &reg_checkpoint) override;
76061da546Spatrick 
77061da546Spatrick   uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,
78061da546Spatrick                                                uint32_t num) override;
79061da546Spatrick 
80be691f3bSpatrick   bool AArch64SVEReconfigure();
81be691f3bSpatrick 
82061da546Spatrick protected:
83061da546Spatrick   friend class ThreadGDBRemote;
84061da546Spatrick 
85*f6aab3d8Srobert   bool ReadRegisterBytes(const RegisterInfo *reg_info);
86061da546Spatrick 
87061da546Spatrick   bool WriteRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data,
88061da546Spatrick                           uint32_t data_offset);
89061da546Spatrick 
90061da546Spatrick   bool PrivateSetRegisterValue(uint32_t reg, llvm::ArrayRef<uint8_t> data);
91061da546Spatrick 
92061da546Spatrick   bool PrivateSetRegisterValue(uint32_t reg, uint64_t val);
93061da546Spatrick 
94061da546Spatrick   void SetAllRegisterValid(bool b);
95061da546Spatrick 
GetRegisterIsValid(uint32_t reg)96061da546Spatrick   bool GetRegisterIsValid(uint32_t reg) const {
97061da546Spatrick     assert(reg < m_reg_valid.size());
98061da546Spatrick     if (reg < m_reg_valid.size())
99061da546Spatrick       return m_reg_valid[reg];
100061da546Spatrick     return false;
101061da546Spatrick   }
102061da546Spatrick 
SetRegisterIsValid(const RegisterInfo * reg_info,bool valid)103061da546Spatrick   void SetRegisterIsValid(const RegisterInfo *reg_info, bool valid) {
104061da546Spatrick     if (reg_info)
105061da546Spatrick       return SetRegisterIsValid(reg_info->kinds[lldb::eRegisterKindLLDB],
106061da546Spatrick                                 valid);
107061da546Spatrick   }
108061da546Spatrick 
SetRegisterIsValid(uint32_t reg,bool valid)109061da546Spatrick   void SetRegisterIsValid(uint32_t reg, bool valid) {
110061da546Spatrick     assert(reg < m_reg_valid.size());
111061da546Spatrick     if (reg < m_reg_valid.size())
112061da546Spatrick       m_reg_valid[reg] = valid;
113061da546Spatrick   }
114061da546Spatrick 
115be691f3bSpatrick   GDBRemoteDynamicRegisterInfoSP m_reg_info_sp;
116061da546Spatrick   std::vector<bool> m_reg_valid;
117061da546Spatrick   DataExtractor m_reg_data;
118061da546Spatrick   bool m_read_all_at_once;
119061da546Spatrick   bool m_write_all_at_once;
120be691f3bSpatrick   bool m_gpacket_cached;
121061da546Spatrick 
122061da546Spatrick private:
123061da546Spatrick   // Helper function for ReadRegisterBytes().
124061da546Spatrick   bool GetPrimordialRegister(const RegisterInfo *reg_info,
125061da546Spatrick                              GDBRemoteCommunicationClient &gdb_comm);
126061da546Spatrick   // Helper function for WriteRegisterBytes().
127061da546Spatrick   bool SetPrimordialRegister(const RegisterInfo *reg_info,
128061da546Spatrick                              GDBRemoteCommunicationClient &gdb_comm);
129061da546Spatrick 
130dda28197Spatrick   GDBRemoteRegisterContext(const GDBRemoteRegisterContext &) = delete;
131dda28197Spatrick   const GDBRemoteRegisterContext &
132dda28197Spatrick   operator=(const GDBRemoteRegisterContext &) = delete;
133061da546Spatrick };
134061da546Spatrick 
135061da546Spatrick } // namespace process_gdb_remote
136061da546Spatrick } // namespace lldb_private
137061da546Spatrick 
138dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTEREGISTERCONTEXT_H
139