Alex Richardson has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/55404 )

Change subject: arch-riscv: Consistently check privilege mode for CSR accesses
......................................................................

arch-riscv: Consistently check privilege mode for CSR accesses

According to the RISC-V privileged spec, bits 8 and 9 of the CSR number
encode the lowest  privilege mode that is permitted to access the CSR.
Commit 55e7d3e5b6f062659bad5f6fdc8469ce80f102dd added this check for
for CSR_MSTATUS but none of the other CSRs.

Change-Id: Iecf2e387fa9ee810e8b8471341bfa371693b97c5
---
M src/arch/riscv/isa/formats/standard.isa
1 file changed, 23 insertions(+), 13 deletions(-)



diff --git a/src/arch/riscv/isa/formats/standard.isa b/src/arch/riscv/isa/formats/standard.isa
index 9345c1f..e4bd4d8 100644
--- a/src/arch/riscv/isa/formats/standard.isa
+++ b/src/arch/riscv/isa/formats/standard.isa
@@ -290,23 +290,19 @@
         %(op_rd)s;

         RegVal data, olddata;
-
+        auto lowestAllowedMode = (PrivilegeMode)bits(csr, 9, 8);
+        auto pm = (PrivilegeMode)xc->readMiscReg(MISCREG_PRV);
+        if (pm < lowestAllowedMode) {
+            return std::make_shared<IllegalInstFault>(
+                    csprintf("%s is not accessible in %s\n", csrName, pm),
+                    machInst);
+        }
         switch (csr) {
           case CSR_SATP: {
-            auto pm = (PrivilegeMode)xc->readMiscReg(MISCREG_PRV);
             STATUS status = xc->readMiscReg(MISCREG_STATUS);
-            if (pm == PRV_U || (pm == PRV_S && status.tvm == 1)) {
+            if (pm == PRV_S && status.tvm == 1) {
                 return std::make_shared<IllegalInstFault>(
-                        "SATP access in user mode or with TVM enabled\n",
-                        machInst);
-            }
-            break;
-          }
-          case CSR_MSTATUS: {
-            auto pm = (PrivilegeMode)xc->readMiscReg(MISCREG_PRV);
-            if (pm != PrivilegeMode::PRV_M) {
-                return std::make_shared<IllegalInstFault>(
-                        "MSTATUS is only accessibly in machine mode\n",
+                        "SATP access with TVM enabled\n",
                         machInst);
             }
             break;

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/55404
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: Iecf2e387fa9ee810e8b8471341bfa371693b97c5
Gerrit-Change-Number: 55404
Gerrit-PatchSet: 1
Gerrit-Owner: Alex Richardson <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to