142 lines · c
1//===-- GDBRemoteRegisterContext.h ------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTEREGISTERCONTEXT_H10#define LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTEREGISTERCONTEXT_H11 12#include <vector>13 14#include "lldb/Target/DynamicRegisterInfo.h"15#include "lldb/Target/RegisterContext.h"16#include "lldb/Utility/ConstString.h"17#include "lldb/Utility/DataExtractor.h"18#include "lldb/lldb-enumerations.h"19#include "lldb/lldb-private.h"20 21#include "GDBRemoteCommunicationClient.h"22 23class StringExtractor;24 25namespace lldb_private {26namespace process_gdb_remote {27 28class ThreadGDBRemote;29class ProcessGDBRemote;30class GDBRemoteDynamicRegisterInfo;31 32typedef std::shared_ptr<GDBRemoteDynamicRegisterInfo>33 GDBRemoteDynamicRegisterInfoSP;34 35class GDBRemoteDynamicRegisterInfo final : public DynamicRegisterInfo {36public:37 GDBRemoteDynamicRegisterInfo() : DynamicRegisterInfo() {}38 39 ~GDBRemoteDynamicRegisterInfo() override = default;40 41 void UpdateARM64SVERegistersInfos(uint64_t vg);42 void UpdateARM64SMERegistersInfos(uint64_t svg);43};44 45class GDBRemoteRegisterContext : public RegisterContext {46public:47 GDBRemoteRegisterContext(ThreadGDBRemote &thread, uint32_t concrete_frame_idx,48 GDBRemoteDynamicRegisterInfoSP reg_info_sp,49 bool read_all_at_once, bool write_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::WritableDataBufferSP &data_sp) override;70 71 bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;72 73 bool ReadAllRegisterValues(RegisterCheckpoint ®_checkpoint) override;74 75 bool76 WriteAllRegisterValues(const RegisterCheckpoint ®_checkpoint) override;77 78 uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,79 uint32_t num) override;80 81 bool RegisterWriteCausesReconfigure(const llvm::StringRef name) override;82 83 bool ReconfigureRegisterInfo() override;84 85protected:86 friend class ThreadGDBRemote;87 88 bool ReadRegisterBytes(const RegisterInfo *reg_info);89 90 bool WriteRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data,91 uint32_t data_offset);92 93 bool PrivateSetRegisterValue(uint32_t reg, llvm::ArrayRef<uint8_t> data);94 95 bool PrivateSetRegisterValue(uint32_t reg, uint64_t val);96 97 void SetAllRegisterValid(bool b);98 99 bool GetRegisterIsValid(uint32_t reg) const {100 assert(reg < m_reg_valid.size());101 if (reg < m_reg_valid.size())102 return m_reg_valid[reg];103 return false;104 }105 106 void SetRegisterIsValid(const RegisterInfo *reg_info, bool valid) {107 if (reg_info)108 return SetRegisterIsValid(reg_info->kinds[lldb::eRegisterKindLLDB],109 valid);110 }111 112 void SetRegisterIsValid(uint32_t reg, bool valid) {113 assert(reg < m_reg_valid.size());114 if (reg < m_reg_valid.size())115 m_reg_valid[reg] = valid;116 }117 118 GDBRemoteDynamicRegisterInfoSP m_reg_info_sp;119 std::vector<bool> m_reg_valid;120 DataExtractor m_reg_data;121 bool m_read_all_at_once;122 bool m_write_all_at_once;123 bool m_gpacket_cached;124 125private:126 // Helper function for ReadRegisterBytes().127 bool GetPrimordialRegister(const RegisterInfo *reg_info,128 GDBRemoteCommunicationClient &gdb_comm);129 // Helper function for WriteRegisterBytes().130 bool SetPrimordialRegister(const RegisterInfo *reg_info,131 GDBRemoteCommunicationClient &gdb_comm);132 133 GDBRemoteRegisterContext(const GDBRemoteRegisterContext &) = delete;134 const GDBRemoteRegisterContext &135 operator=(const GDBRemoteRegisterContext &) = delete;136};137 138} // namespace process_gdb_remote139} // namespace lldb_private140 141#endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTEREGISTERCONTEXT_H142