1*f6aab3d8Srobert //===-- NativeRegisterContextLinux_riscv64.h -------------------*- C++ -*-===// 2*f6aab3d8Srobert // 3*f6aab3d8Srobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*f6aab3d8Srobert // See https://llvm.org/LICENSE.txt for license information. 5*f6aab3d8Srobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*f6aab3d8Srobert // 7*f6aab3d8Srobert //===----------------------------------------------------------------------===// 8*f6aab3d8Srobert 9*f6aab3d8Srobert #if defined(__riscv) && __riscv_xlen == 64 10*f6aab3d8Srobert 11*f6aab3d8Srobert #ifndef lldb_NativeRegisterContextLinux_riscv64_h 12*f6aab3d8Srobert #define lldb_NativeRegisterContextLinux_riscv64_h 13*f6aab3d8Srobert 14*f6aab3d8Srobert #include "Plugins/Process/Linux/NativeRegisterContextLinux.h" 15*f6aab3d8Srobert #include "Plugins/Process/Utility/RegisterInfoPOSIX_riscv64.h" 16*f6aab3d8Srobert 17*f6aab3d8Srobert #include <asm/ptrace.h> 18*f6aab3d8Srobert 19*f6aab3d8Srobert namespace lldb_private { 20*f6aab3d8Srobert namespace process_linux { 21*f6aab3d8Srobert 22*f6aab3d8Srobert class NativeProcessLinux; 23*f6aab3d8Srobert 24*f6aab3d8Srobert class NativeRegisterContextLinux_riscv64 : public NativeRegisterContextLinux { 25*f6aab3d8Srobert public: 26*f6aab3d8Srobert NativeRegisterContextLinux_riscv64( 27*f6aab3d8Srobert const ArchSpec &target_arch, NativeThreadProtocol &native_thread, 28*f6aab3d8Srobert std::unique_ptr<RegisterInfoPOSIX_riscv64> register_info_up); 29*f6aab3d8Srobert 30*f6aab3d8Srobert uint32_t GetRegisterSetCount() const override; 31*f6aab3d8Srobert 32*f6aab3d8Srobert uint32_t GetUserRegisterCount() const override; 33*f6aab3d8Srobert 34*f6aab3d8Srobert const RegisterSet *GetRegisterSet(uint32_t set_index) const override; 35*f6aab3d8Srobert 36*f6aab3d8Srobert Status ReadRegister(const RegisterInfo *reg_info, 37*f6aab3d8Srobert RegisterValue ®_value) override; 38*f6aab3d8Srobert 39*f6aab3d8Srobert Status WriteRegister(const RegisterInfo *reg_info, 40*f6aab3d8Srobert const RegisterValue ®_value) override; 41*f6aab3d8Srobert 42*f6aab3d8Srobert Status ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override; 43*f6aab3d8Srobert 44*f6aab3d8Srobert Status WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override; 45*f6aab3d8Srobert 46*f6aab3d8Srobert void InvalidateAllRegisters() override; 47*f6aab3d8Srobert 48*f6aab3d8Srobert std::vector<uint32_t> 49*f6aab3d8Srobert GetExpeditedRegisters(ExpeditedRegs expType) const override; 50*f6aab3d8Srobert RegisterOffsetIsDynamic()51*f6aab3d8Srobert bool RegisterOffsetIsDynamic() const override { return true; } 52*f6aab3d8Srobert 53*f6aab3d8Srobert protected: 54*f6aab3d8Srobert Status ReadGPR() override; 55*f6aab3d8Srobert 56*f6aab3d8Srobert Status WriteGPR() override; 57*f6aab3d8Srobert 58*f6aab3d8Srobert Status ReadFPR() override; 59*f6aab3d8Srobert 60*f6aab3d8Srobert Status WriteFPR() override; 61*f6aab3d8Srobert GetGPRBuffer()62*f6aab3d8Srobert void *GetGPRBuffer() override { return &m_gpr; } 63*f6aab3d8Srobert GetFPRBuffer()64*f6aab3d8Srobert void *GetFPRBuffer() override { return &m_fpr; } 65*f6aab3d8Srobert GetGPRSize()66*f6aab3d8Srobert size_t GetGPRSize() const override { return GetRegisterInfo().GetGPRSize(); } 67*f6aab3d8Srobert GetFPRSize()68*f6aab3d8Srobert size_t GetFPRSize() override { return GetRegisterInfo().GetFPRSize(); } 69*f6aab3d8Srobert 70*f6aab3d8Srobert private: 71*f6aab3d8Srobert bool m_gpr_is_valid; 72*f6aab3d8Srobert bool m_fpu_is_valid; 73*f6aab3d8Srobert 74*f6aab3d8Srobert RegisterInfoPOSIX_riscv64::GPR m_gpr; 75*f6aab3d8Srobert 76*f6aab3d8Srobert RegisterInfoPOSIX_riscv64::FPR m_fpr; 77*f6aab3d8Srobert 78*f6aab3d8Srobert bool IsGPR(unsigned reg) const; 79*f6aab3d8Srobert 80*f6aab3d8Srobert bool IsFPR(unsigned reg) const; 81*f6aab3d8Srobert 82*f6aab3d8Srobert uint32_t CalculateFprOffset(const RegisterInfo *reg_info) const; 83*f6aab3d8Srobert 84*f6aab3d8Srobert const RegisterInfoPOSIX_riscv64 &GetRegisterInfo() const; 85*f6aab3d8Srobert }; 86*f6aab3d8Srobert 87*f6aab3d8Srobert } // namespace process_linux 88*f6aab3d8Srobert } // namespace lldb_private 89*f6aab3d8Srobert 90*f6aab3d8Srobert #endif // #ifndef lldb_NativeRegisterContextLinux_riscv64_h 91*f6aab3d8Srobert 92*f6aab3d8Srobert #endif // defined(__riscv) && __riscv_xlen == 64 93