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 &reg_value) override;
38*f6aab3d8Srobert 
39*f6aab3d8Srobert   Status WriteRegister(const RegisterInfo *reg_info,
40*f6aab3d8Srobert                        const RegisterValue &reg_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