Path: blob/main/contrib/llvm-project/lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.h
96381 views
//===-- GDBRemoteRegisterContext.h ------------------------------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#ifndef LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTEREGISTERCONTEXT_H9#define LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTEREGISTERCONTEXT_H1011#include <vector>1213#include "lldb/Target/DynamicRegisterInfo.h"14#include "lldb/Target/RegisterContext.h"15#include "lldb/Utility/ConstString.h"16#include "lldb/Utility/DataExtractor.h"17#include "lldb/lldb-enumerations.h"18#include "lldb/lldb-private.h"1920#include "GDBRemoteCommunicationClient.h"2122class StringExtractor;2324namespace lldb_private {25namespace process_gdb_remote {2627class ThreadGDBRemote;28class ProcessGDBRemote;29class GDBRemoteDynamicRegisterInfo;3031typedef std::shared_ptr<GDBRemoteDynamicRegisterInfo>32GDBRemoteDynamicRegisterInfoSP;3334class GDBRemoteDynamicRegisterInfo final : public DynamicRegisterInfo {35public:36GDBRemoteDynamicRegisterInfo() : DynamicRegisterInfo() {}3738~GDBRemoteDynamicRegisterInfo() override = default;3940void UpdateARM64SVERegistersInfos(uint64_t vg);41void UpdateARM64SMERegistersInfos(uint64_t svg);42};4344class GDBRemoteRegisterContext : public RegisterContext {45public:46GDBRemoteRegisterContext(ThreadGDBRemote &thread, uint32_t concrete_frame_idx,47GDBRemoteDynamicRegisterInfoSP reg_info_sp,48bool read_all_at_once, bool write_all_at_once);4950~GDBRemoteRegisterContext() override;5152void InvalidateAllRegisters() override;5354size_t GetRegisterCount() override;5556const RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override;5758size_t GetRegisterSetCount() override;5960const RegisterSet *GetRegisterSet(size_t reg_set) override;6162bool ReadRegister(const RegisterInfo *reg_info,63RegisterValue &value) override;6465bool WriteRegister(const RegisterInfo *reg_info,66const RegisterValue &value) override;6768bool ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override;6970bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;7172bool ReadAllRegisterValues(RegisterCheckpoint ®_checkpoint) override;7374bool75WriteAllRegisterValues(const RegisterCheckpoint ®_checkpoint) override;7677uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,78uint32_t num) override;7980bool RegisterWriteCausesReconfigure(const llvm::StringRef name) override;8182bool ReconfigureRegisterInfo() override;8384protected:85friend class ThreadGDBRemote;8687bool ReadRegisterBytes(const RegisterInfo *reg_info);8889bool WriteRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data,90uint32_t data_offset);9192bool PrivateSetRegisterValue(uint32_t reg, llvm::ArrayRef<uint8_t> data);9394bool PrivateSetRegisterValue(uint32_t reg, uint64_t val);9596void SetAllRegisterValid(bool b);9798bool GetRegisterIsValid(uint32_t reg) const {99assert(reg < m_reg_valid.size());100if (reg < m_reg_valid.size())101return m_reg_valid[reg];102return false;103}104105void SetRegisterIsValid(const RegisterInfo *reg_info, bool valid) {106if (reg_info)107return SetRegisterIsValid(reg_info->kinds[lldb::eRegisterKindLLDB],108valid);109}110111void SetRegisterIsValid(uint32_t reg, bool valid) {112assert(reg < m_reg_valid.size());113if (reg < m_reg_valid.size())114m_reg_valid[reg] = valid;115}116117GDBRemoteDynamicRegisterInfoSP m_reg_info_sp;118std::vector<bool> m_reg_valid;119DataExtractor m_reg_data;120bool m_read_all_at_once;121bool m_write_all_at_once;122bool m_gpacket_cached;123124private:125// Helper function for ReadRegisterBytes().126bool GetPrimordialRegister(const RegisterInfo *reg_info,127GDBRemoteCommunicationClient &gdb_comm);128// Helper function for WriteRegisterBytes().129bool SetPrimordialRegister(const RegisterInfo *reg_info,130GDBRemoteCommunicationClient &gdb_comm);131132GDBRemoteRegisterContext(const GDBRemoteRegisterContext &) = delete;133const GDBRemoteRegisterContext &134operator=(const GDBRemoteRegisterContext &) = delete;135};136137} // namespace process_gdb_remote138} // namespace lldb_private139140#endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTEREGISTERCONTEXT_H141142143