From bc5842f94517c5fa760409cf8c956bbc7c37ead5 Mon Sep 17 00:00:00 2001 From: Atul Khare Date: Tue, 11 Jul 2023 13:31:12 -0700 Subject: Add Smcsrind/Sscsrind support This adds the following CSRs: miselect (0x350), mireg (0x351), mireg2/3 (0x352, 0x353), mireg4-6 (0x355 - 0x357), siselect (0x150), sireg (0x151), sireg2/3 (0x152, 0x153), sireg4-6 (0x155 - 0x157), vsiselect (0x250), vsireg (0x251), mireg2/3 (0x252, 0x253), vsireg4-6 (0x255 - 0x257). Presently, attempts to read / write from ireg? registers will fail, and future extensions will provide proxy CSR mappings for the respective ?ireg CSRs. --- riscv/csrs.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'riscv/csrs.h') diff --git a/riscv/csrs.h b/riscv/csrs.h index 07d6d82..d28d124 100644 --- a/riscv/csrs.h +++ b/riscv/csrs.h @@ -6,8 +6,12 @@ #include "encoding.h" // For reg_t: #include "decode.h" +// For std::unordered_map +#include // For std::shared_ptr #include +// For std::optional +#include // For access_type: #include "memtracer.h" #include @@ -787,4 +791,28 @@ class jvt_csr_t: public basic_csr_t { jvt_csr_t(processor_t* const proc, const reg_t addr, const reg_t init); virtual void verify_permissions(insn_t insn, bool write) const override; }; + +// Sscsrind registers needs permissions checked +// (the original virtualized_csr_t does not call verify_permission of the underlying CSRs) +class virtualized_indirect_csr_t: public virtualized_csr_t { + public: + virtualized_indirect_csr_t(processor_t* const proc, csr_t_p orig, csr_t_p virt); + virtual void verify_permissions(insn_t insn, bool write) const override; +}; + +class sscsrind_reg_csr_t : public csr_t { + public: + typedef std::shared_ptr sscsrind_reg_csr_t_p; + sscsrind_reg_csr_t(processor_t* const proc, const reg_t addr, csr_t_p iselect); + reg_t read() const noexcept override; + virtual void verify_permissions(insn_t insn, bool write) const override; + void add_ireg_proxy(const reg_t iselect_val, csr_t_p proxy_csr); + protected: + virtual bool unlogged_write(const reg_t val) noexcept override; + private: + csr_t_p iselect; + std::unordered_map ireg_proxy; + csr_t_p get_reg() const noexcept; +}; + #endif -- cgit v1.1