Giacomo Travaglini has submitted this change. ( https://gem5-review.googlesource.com/c/public/gem5/+/58117 )

 (

3 is the latest approved patch-set.
No files were changed between the latest approved patch-set and the submitted one.
 )Change subject: arch-arm: Fix ISA::redirectRegVHE method
......................................................................

arch-arm: Fix ISA::redirectRegVHE method

This patch is fixing the redirectRegVHE method in the following
ways:

* Redirect AArch32 version of timer/counter registers
* Redirect _EL12 registers to _EL1
* Redirect _EL02 registers to _EL0
* Redirect CNTV_*_EL0 and CNTP_*_EL0 registers to
the Secure/Non-secure _EL2
* Redirect CNTVCT_EL0 to CNTPCT_EL0

Change-Id: I34eb317045b2d5a304a29ccf6e6440df68b2a279
Signed-off-by: Giacomo Travaglini <giacomo.travagl...@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/58117
Reviewed-by: Andreas Sandberg <andreas.sandb...@arm.com>
Maintainer: Andreas Sandberg <andreas.sandb...@arm.com>
Tested-by: kokoro <noreply+kok...@google.com>
---
M src/arch/arm/isa.cc
1 file changed, 137 insertions(+), 35 deletions(-)

Approvals:
  Andreas Sandberg: Looks good to me, approved; Looks good to me, approved
  kokoro: Regressions pass




diff --git a/src/arch/arm/isa.cc b/src/arch/arm/isa.cc
index f04e518..d96d39a 100644
--- a/src/arch/arm/isa.cc
+++ b/src/arch/arm/isa.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2021 ARM Limited
+ * Copyright (c) 2010-2022 Arm Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -597,68 +597,146 @@
 ISA::redirectRegVHE(int misc_reg)
 {
     const HCR hcr = readMiscRegNoEffect(MISCREG_HCR_EL2);
-    if (hcr.e2h == 0x0 || currEL() != EL2)
+    if (hcr.e2h == 0x0)
         return misc_reg;
     SCR scr = readMiscRegNoEffect(MISCREG_SCR_EL3);
     bool sec_el2 = scr.eel2 && release->has(ArmExtension::FEAT_SEL2);
     switch(misc_reg) {
       case MISCREG_SPSR_EL1:
-          return MISCREG_SPSR_EL2;
+        return currEL() == EL2 ? MISCREG_SPSR_EL2 : misc_reg;
       case MISCREG_ELR_EL1:
-          return MISCREG_ELR_EL2;
+        return currEL() == EL2 ? MISCREG_ELR_EL2 : misc_reg;
       case MISCREG_SCTLR_EL1:
-          return MISCREG_SCTLR_EL2;
+        return currEL() == EL2 ? MISCREG_SCTLR_EL2 : misc_reg;
       case MISCREG_CPACR_EL1:
-          return MISCREG_CPTR_EL2;
-//      case :
-//          return MISCREG_TRFCR_EL2;
+        return currEL() == EL2 ? MISCREG_CPTR_EL2 : misc_reg;
+//    case MISCREG_TRFCR_EL1:
+//      return currEL() == EL2 ? MISCREG_TRFCR_EL2 : misc_reg;
       case MISCREG_TTBR0_EL1:
-          return MISCREG_TTBR0_EL2;
+        return currEL() == EL2 ? MISCREG_TTBR0_EL2 : misc_reg;
       case MISCREG_TTBR1_EL1:
-          return MISCREG_TTBR1_EL2;
+        return currEL() == EL2 ? MISCREG_TTBR1_EL2 : misc_reg;
       case MISCREG_TCR_EL1:
-          return MISCREG_TCR_EL2;
+        return currEL() == EL2 ? MISCREG_TCR_EL2 : misc_reg;
       case MISCREG_AFSR0_EL1:
-          return MISCREG_AFSR0_EL2;
+        return currEL() == EL2 ? MISCREG_AFSR0_EL2 : misc_reg;
       case MISCREG_AFSR1_EL1:
-          return MISCREG_AFSR1_EL2;
+        return currEL() == EL2 ? MISCREG_AFSR1_EL2 : misc_reg;
       case MISCREG_ESR_EL1:
-          return MISCREG_ESR_EL2;
+        return currEL() == EL2 ? MISCREG_ESR_EL2 : misc_reg;
       case MISCREG_FAR_EL1:
-          return MISCREG_FAR_EL2;
+        return currEL() == EL2 ? MISCREG_FAR_EL2 : misc_reg;
       case MISCREG_MAIR_EL1:
-          return MISCREG_MAIR_EL2;
+        return currEL() == EL2 ? MISCREG_MAIR_EL2 : misc_reg;
       case MISCREG_AMAIR_EL1:
-          return MISCREG_AMAIR_EL2;
+        return currEL() == EL2 ? MISCREG_AMAIR_EL2 : misc_reg;
       case MISCREG_VBAR_EL1:
-          return MISCREG_VBAR_EL2;
+        return currEL() == EL2 ? MISCREG_VBAR_EL2 : misc_reg;
       case MISCREG_CONTEXTIDR_EL1:
-          return MISCREG_CONTEXTIDR_EL2;
+        return currEL() == EL2 ? MISCREG_CONTEXTIDR_EL2 : misc_reg;
       case MISCREG_CNTKCTL_EL1:
-          return MISCREG_CNTHCTL_EL2;
+        return currEL() == EL2 ? MISCREG_CNTHCTL_EL2 : misc_reg;
+      case MISCREG_CNTP_TVAL:
       case MISCREG_CNTP_TVAL_EL0:
-          return sec_el2? MISCREG_CNTHPS_TVAL_EL2:
-                         MISCREG_CNTHP_TVAL_EL2;
+        if (ELIsInHost(tc, currEL())) {
+            return sec_el2 && !scr.ns ? MISCREG_CNTHPS_TVAL_EL2:
+                                        MISCREG_CNTHP_TVAL_EL2;
+        } else {
+            return misc_reg;
+        }
+      case MISCREG_CNTP_CTL:
       case MISCREG_CNTP_CTL_EL0:
-          return sec_el2? MISCREG_CNTHPS_CTL_EL2:
-                         MISCREG_CNTHP_CTL_EL2;
+        if (ELIsInHost(tc, currEL())) {
+            return sec_el2 && !scr.ns ? MISCREG_CNTHPS_CTL_EL2:
+                                        MISCREG_CNTHP_CTL_EL2;
+        } else {
+            return misc_reg;
+        }
+      case MISCREG_CNTP_CVAL:
       case MISCREG_CNTP_CVAL_EL0:
-          return sec_el2? MISCREG_CNTHPS_CVAL_EL2:
-                         MISCREG_CNTHP_CVAL_EL2;
+        if (ELIsInHost(tc, currEL())) {
+            return sec_el2 && !scr.ns ? MISCREG_CNTHPS_CVAL_EL2:
+                                        MISCREG_CNTHP_CVAL_EL2;
+        } else {
+            return misc_reg;
+        }
+      case MISCREG_CNTV_TVAL:
       case MISCREG_CNTV_TVAL_EL0:
-          return sec_el2? MISCREG_CNTHVS_TVAL_EL2:
-                         MISCREG_CNTHV_TVAL_EL2;
+        if (ELIsInHost(tc, currEL())) {
+            return sec_el2 && !scr.ns ? MISCREG_CNTHVS_TVAL_EL2:
+                                        MISCREG_CNTHV_TVAL_EL2;
+        } else {
+            return misc_reg;
+        }
+      case MISCREG_CNTV_CTL:
       case MISCREG_CNTV_CTL_EL0:
-          return sec_el2? MISCREG_CNTHVS_CTL_EL2:
-                         MISCREG_CNTHV_CTL_EL2;
+        if (ELIsInHost(tc, currEL())) {
+            return sec_el2 && !scr.ns ? MISCREG_CNTHVS_CTL_EL2:
+                                        MISCREG_CNTHV_CTL_EL2;
+        } else {
+            return misc_reg;
+        }
+      case MISCREG_CNTV_CVAL:
       case MISCREG_CNTV_CVAL_EL0:
-          return sec_el2? MISCREG_CNTHVS_CVAL_EL2:
-                         MISCREG_CNTHV_CVAL_EL2;
+        if (ELIsInHost(tc, currEL())) {
+            return sec_el2 && !scr.ns ? MISCREG_CNTHVS_CVAL_EL2:
+                                        MISCREG_CNTHV_CVAL_EL2;
+        } else {
+            return misc_reg;
+        }
+      case MISCREG_CNTVCT:
+      case MISCREG_CNTVCT_EL0:
+        return ELIsInHost(tc, currEL()) ? MISCREG_CNTPCT_EL0 : misc_reg;
+      case MISCREG_SCTLR_EL12:
+        return MISCREG_SCTLR_EL1;
+      case MISCREG_CPACR_EL12:
+        return MISCREG_CPACR_EL1;
+      case MISCREG_ZCR_EL12:
+        return MISCREG_ZCR_EL1;
+      case MISCREG_TTBR0_EL12:
+        return MISCREG_TTBR0_EL1;
+      case MISCREG_TTBR1_EL12:
+        return MISCREG_TTBR1_EL1;
+      case MISCREG_TCR_EL12:
+        return MISCREG_TCR_EL1;
+      case MISCREG_SPSR_EL12:
+        return MISCREG_SPSR_EL1;
+      case MISCREG_ELR_EL12:
+        return MISCREG_ELR_EL1;
+      case MISCREG_AFSR0_EL12:
+        return MISCREG_AFSR0_EL1;
+      case MISCREG_AFSR1_EL12:
+        return MISCREG_AFSR1_EL1;
+      case MISCREG_ESR_EL12:
+        return MISCREG_ESR_EL1;
+      case MISCREG_FAR_EL12:
+        return MISCREG_FAR_EL1;
+      case MISCREG_MAIR_EL12:
+        return MISCREG_MAIR_EL1;
+      case MISCREG_AMAIR_EL12:
+        return MISCREG_AMAIR_EL1;
+      case MISCREG_VBAR_EL12:
+        return MISCREG_VBAR_EL1;
+      case MISCREG_CONTEXTIDR_EL12:
+        return MISCREG_CONTEXTIDR_EL1;
+      case MISCREG_CNTKCTL_EL12:
+        return MISCREG_CNTKCTL_EL1;
+      // _EL02 registers
+      case MISCREG_CNTP_TVAL_EL02:
+        return MISCREG_CNTP_TVAL_EL0;
+      case MISCREG_CNTP_CTL_EL02:
+        return MISCREG_CNTP_CTL_EL0;
+      case MISCREG_CNTP_CVAL_EL02:
+        return MISCREG_CNTP_CVAL_EL0;
+      case MISCREG_CNTV_TVAL_EL02:
+        return MISCREG_CNTV_TVAL_EL0;
+      case MISCREG_CNTV_CTL_EL02:
+        return MISCREG_CNTV_CTL_EL0;
+      case MISCREG_CNTV_CVAL_EL02:
+        return MISCREG_CNTV_CVAL_EL0;
       default:
-          return misc_reg;
+        return misc_reg;
     }
-    /*should not be accessible */
-    return misc_reg;
 }

 RegVal

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/58117
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: I34eb317045b2d5a304a29ccf6e6440df68b2a279
Gerrit-Change-Number: 58117
Gerrit-PatchSet: 5
Gerrit-Owner: Giacomo Travaglini <giacomo.travagl...@arm.com>
Gerrit-Reviewer: Andreas Sandberg <andreas.sandb...@arm.com>
Gerrit-Reviewer: Giacomo Travaglini <giacomo.travagl...@arm.com>
Gerrit-Reviewer: kokoro <noreply+kok...@google.com>
Gerrit-MessageType: merged
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to