1254721Semaste//===-- GDBRemoteRegisterContext.h ------------------------------*- C++ -*-===//
2254721Semaste//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6254721Semaste//
7254721Semaste//===----------------------------------------------------------------------===//
8254721Semaste
9254721Semaste#ifndef lldb_GDBRemoteRegisterContext_h_
10254721Semaste#define lldb_GDBRemoteRegisterContext_h_
11254721Semaste
12254721Semaste#include <vector>
13254721Semaste
14314564Sdim#include "Plugins/Process/Utility/DynamicRegisterInfo.h"
15254721Semaste#include "lldb/Target/RegisterContext.h"
16321369Sdim#include "lldb/Utility/ConstString.h"
17321369Sdim#include "lldb/Utility/DataExtractor.h"
18314564Sdim#include "lldb/lldb-enumerations.h"
19314564Sdim#include "lldb/lldb-private.h"
20258054Semaste
21254721Semaste#include "GDBRemoteCommunicationClient.h"
22254721Semaste
23288943Sdimclass StringExtractor;
24288943Sdim
25288943Sdimnamespace lldb_private {
26288943Sdimnamespace process_gdb_remote {
27288943Sdim
28254721Semasteclass ThreadGDBRemote;
29254721Semasteclass ProcessGDBRemote;
30254721Semaste
31314564Sdimclass GDBRemoteDynamicRegisterInfo : public DynamicRegisterInfo {
32254721Semastepublic:
33314564Sdim  GDBRemoteDynamicRegisterInfo() : DynamicRegisterInfo() {}
34254721Semaste
35314564Sdim  ~GDBRemoteDynamicRegisterInfo() override = default;
36254721Semaste
37314564Sdim  void HardcodeARMRegisters(bool from_scratch);
38254721Semaste};
39254721Semaste
40314564Sdimclass GDBRemoteRegisterContext : public RegisterContext {
41254721Semastepublic:
42314564Sdim  GDBRemoteRegisterContext(ThreadGDBRemote &thread, uint32_t concrete_frame_idx,
43314564Sdim                           GDBRemoteDynamicRegisterInfo &reg_info,
44360784Sdim                           bool read_all_at_once, bool write_all_at_once);
45254721Semaste
46314564Sdim  ~GDBRemoteRegisterContext() override;
47254721Semaste
48314564Sdim  void InvalidateAllRegisters() override;
49254721Semaste
50314564Sdim  size_t GetRegisterCount() override;
51254721Semaste
52314564Sdim  const RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override;
53254721Semaste
54314564Sdim  size_t GetRegisterSetCount() override;
55254721Semaste
56314564Sdim  const RegisterSet *GetRegisterSet(size_t reg_set) override;
57254721Semaste
58314564Sdim  bool ReadRegister(const RegisterInfo *reg_info,
59314564Sdim                    RegisterValue &value) override;
60254721Semaste
61314564Sdim  bool WriteRegister(const RegisterInfo *reg_info,
62314564Sdim                     const RegisterValue &value) override;
63254721Semaste
64314564Sdim  bool ReadAllRegisterValues(lldb::DataBufferSP &data_sp) override;
65254721Semaste
66314564Sdim  bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;
67258884Semaste
68314564Sdim  bool ReadAllRegisterValues(RegisterCheckpoint &reg_checkpoint) override;
69258884Semaste
70314564Sdim  bool
71314564Sdim  WriteAllRegisterValues(const RegisterCheckpoint &reg_checkpoint) override;
72254721Semaste
73314564Sdim  uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,
74314564Sdim                                               uint32_t num) override;
75314564Sdim
76254721Semasteprotected:
77314564Sdim  friend class ThreadGDBRemote;
78254721Semaste
79314564Sdim  bool ReadRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data);
80254721Semaste
81314564Sdim  bool WriteRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data,
82314564Sdim                          uint32_t data_offset);
83254721Semaste
84314564Sdim  bool PrivateSetRegisterValue(uint32_t reg, llvm::ArrayRef<uint8_t> data);
85296417Sdim
86314564Sdim  bool PrivateSetRegisterValue(uint32_t reg, uint64_t val);
87254721Semaste
88314564Sdim  void SetAllRegisterValid(bool b);
89314564Sdim
90314564Sdim  bool GetRegisterIsValid(uint32_t reg) const {
91314564Sdim#if defined(LLDB_CONFIGURATION_DEBUG)
92314564Sdim    assert(reg < m_reg_valid.size());
93254721Semaste#endif
94314564Sdim    if (reg < m_reg_valid.size())
95314564Sdim      return m_reg_valid[reg];
96314564Sdim    return false;
97314564Sdim  }
98254721Semaste
99314564Sdim  void SetRegisterIsValid(const RegisterInfo *reg_info, bool valid) {
100314564Sdim    if (reg_info)
101314564Sdim      return SetRegisterIsValid(reg_info->kinds[lldb::eRegisterKindLLDB],
102314564Sdim                                valid);
103314564Sdim  }
104254721Semaste
105314564Sdim  void SetRegisterIsValid(uint32_t reg, bool valid) {
106314564Sdim#if defined(LLDB_CONFIGURATION_DEBUG)
107314564Sdim    assert(reg < m_reg_valid.size());
108254721Semaste#endif
109314564Sdim    if (reg < m_reg_valid.size())
110314564Sdim      m_reg_valid[reg] = valid;
111314564Sdim  }
112254721Semaste
113314564Sdim  GDBRemoteDynamicRegisterInfo &m_reg_info;
114314564Sdim  std::vector<bool> m_reg_valid;
115314564Sdim  DataExtractor m_reg_data;
116314564Sdim  bool m_read_all_at_once;
117360784Sdim  bool m_write_all_at_once;
118254721Semaste
119254721Semasteprivate:
120314564Sdim  // Helper function for ReadRegisterBytes().
121314564Sdim  bool GetPrimordialRegister(const RegisterInfo *reg_info,
122314564Sdim                             GDBRemoteCommunicationClient &gdb_comm);
123314564Sdim  // Helper function for WriteRegisterBytes().
124314564Sdim  bool SetPrimordialRegister(const RegisterInfo *reg_info,
125314564Sdim                             GDBRemoteCommunicationClient &gdb_comm);
126254721Semaste
127314564Sdim  DISALLOW_COPY_AND_ASSIGN(GDBRemoteRegisterContext);
128254721Semaste};
129254721Semaste
130288943Sdim} // namespace process_gdb_remote
131288943Sdim} // namespace lldb_private
132288943Sdim
133296417Sdim#endif // lldb_GDBRemoteRegisterContext_h_
134