Made RiscVPmP more generic. Can be used from other RiscV similar architectures.

PiperOrigin-RevId: 660441394
Change-Id: I1e70756655563f69fd3cd2b08f4dc7f7fbebd410
diff --git a/cheriot/cheriot_state.cc b/cheriot/cheriot_state.cc
index 882e1cf..28edaec 100644
--- a/cheriot/cheriot_state.cc
+++ b/cheriot/cheriot_state.cc
@@ -36,6 +36,7 @@
 #include "mpact/sim/util/memory/tagged_memory_interface.h"
 #include "riscv//riscv_csr.h"
 #include "riscv//riscv_misa.h"
+#include "riscv//riscv_pmp.h"
 #include "riscv//riscv_state.h"
 
 ABSL_FLAG(uint64_t, revocation_ram_base, 0x8000'0000,
@@ -47,13 +48,14 @@
 namespace sim {
 namespace cheriot {
 
+using EC = ::mpact::sim::riscv::ExceptionCode;
 using ::mpact::sim::generic::operator*;  // NOLINT: used below (clang error).
 using ::mpact::sim::riscv::IsaExtension;
-using ::mpact::sim::riscv::RiscVXlen;
-using EC = ::mpact::sim::riscv::ExceptionCode;
 using ::mpact::sim::riscv::RiscVCsrEnum;
 using ::mpact::sim::riscv::RiscVCsrInterface;
+using ::mpact::sim::riscv::RiscVPmp;
 using ::mpact::sim::riscv::RiscVSimpleCsr;
+using ::mpact::sim::riscv::RiscVXlen;
 
 // These helper templates are used to store information about the CSR registers
 // used in CHERIoT RiscV (32 bits).
@@ -221,6 +223,10 @@
   // User level CSRs
   // None in CHERIoT.
 
+  // PMP CSRs
+  state->pmp_ = new RiscVPmp(state);
+  state->pmp_->CreatePmpCsrs<T, RiscVCheriotCsrEnum>(state->csr_set());
+
   // Simulator CSRs
 
   // Access current privilege mode. Omitted.
@@ -306,6 +312,7 @@
   delete pc_src_operand_;
   for (auto *csr : csr_vec_) delete csr;
   delete csr_set_;
+  delete pmp_;
   delete temp_reg_;
   revocation_db_->DecRef();
 }
diff --git a/cheriot/cheriot_state.h b/cheriot/cheriot_state.h
index 6d0ec7e..c736f71 100644
--- a/cheriot/cheriot_state.h
+++ b/cheriot/cheriot_state.h
@@ -40,6 +40,7 @@
 #include "riscv//riscv_csr.h"
 #include "riscv//riscv_fp_state.h"
 #include "riscv//riscv_misa.h"
+#include "riscv//riscv_pmp.h"
 #include "riscv//riscv_register.h"
 #include "riscv//riscv_state.h"
 #include "riscv//riscv_vector_state.h"
@@ -69,6 +70,7 @@
 using ::mpact::sim::riscv::RiscVMIp;
 using ::mpact::sim::riscv::RiscVMIsa;
 using ::mpact::sim::riscv::RiscVMStatus;
+using ::mpact::sim::riscv::RiscVPmp;
 using ::mpact::sim::riscv::RiscVSimpleCsr;
 using ::mpact::sim::riscv::RVVectorRegister;
 
@@ -448,6 +450,7 @@
   CheriotRegister *mscratchc_ = nullptr;
   CheriotRegister *mtdc_ = nullptr;
   CheriotRegister *temp_reg_ = nullptr;
+  RiscVPmp *pmp_ = nullptr;
   RiscVCsrInterface *mtval_ = nullptr;
   RiscVCsrInterface *mcause_ = nullptr;
   RiscVCheri32PcSourceOperand *pc_src_operand_ = nullptr;
diff --git a/cheriot/riscv_cheriot_csr_enum.h b/cheriot/riscv_cheriot_csr_enum.h
index 3988611..0000bb1 100644
--- a/cheriot/riscv_cheriot_csr_enum.h
+++ b/cheriot/riscv_cheriot_csr_enum.h
@@ -17,21 +17,6 @@
 #ifndef MPACT_CHERIOT__RISCV_CHERIOT_CSR_ENUM_H_
 #define MPACT_CHERIOT__RISCV_CHERIOT_CSR_ENUM_H_
 
-#include <any>
-#include <cstddef>
-#include <cstdint>
-#include <limits>
-#include <string>
-#include <type_traits>
-#include <vector>
-
-#include "absl/container/flat_hash_map.h"
-#include "absl/status/status.h"
-#include "absl/status/statusor.h"
-#include "absl/strings/string_view.h"
-#include "mpact/sim/generic/data_buffer.h"
-#include "mpact/sim/generic/operand_interface.h"
-
 // This file contains CHERIoT specific definitions for classes used to model the
 // RiscV control and status registers. For now, these are not modeled as actual
 // register state, instead, they're tied into the RiscV machine state a bit
@@ -112,7 +97,27 @@
   kMTval = 0x343,     // Machine bad address or instruction.
   kMIp = 0x344,       // Machine interrupt pending.
 
-  // Ignoring machine memory protection for now.
+  // PMP registers.
+  kPmpCfg0 = 0x3a0,    // PMP configuration register 0.
+  kPmpCfg1 = 0x3a1,    // PMP configuration register 1 (only for RV32).
+  kPmpCfg2 = 0x3a2,    // PMP configuration register 2.
+  kPmpCfg3 = 0x3a3,    // PMP configuration register 3 (only for RV32).
+  kPmpAddr0 = 0x3b0,   // PMP address register 0.
+  kPmpAddr1 = 0x3b1,   // PMP address register 1.
+  kPmpAddr2 = 0x3b2,   // PMP address register 2.
+  kPmpAddr3 = 0x3b3,   // PMP address register 3.
+  kPmpAddr4 = 0x3b4,   // PMP address register 4.
+  kPmpAddr5 = 0x3b5,   // PMP address register 5.
+  kPmpAddr6 = 0x3b6,   // PMP address register 6.
+  kPmpAddr7 = 0x3b7,   // PMP address register 7.
+  kPmpAddr8 = 0x3b8,   // PMP address register 8.
+  kPmpAddr9 = 0x3b9,   // PMP address register 9.
+  kPmpAddr10 = 0x3ba,  // PMP address register 10.
+  kPmpAddr11 = 0x3bb,  // PMP address register 11.
+  kPmpAddr12 = 0x3bc,  // PMP address register 12.
+  kPmpAddr13 = 0x3bd,  // PMP address register 13.
+  kPmpAddr14 = 0x3be,  // PMP address register 14.
+  kPmpAddr15 = 0x3bf,  // PMP address register 15.
 
   kMCycle = 0xb00,    // Machine cycle counter.
   kMInstret = 0xb02,  // Machine instructions-retired counter.