arch-arm: reg access permissions highest EL helper
authorAdrian Herrera <adrian.herrera@arm.com>
Wed, 6 Nov 2019 13:00:21 +0000 (13:00 +0000)
committerGiacomo Travaglini <giacomo.travaglini@arm.com>
Tue, 4 Feb 2020 13:39:54 +0000 (13:39 +0000)
This patch implements a helper function to filter a register access
permissions by the highest EL implemented by the system.
This filtering is convenient to follow the architecture pseudocode.

Change-Id: Iedfb2d8624c926f2f0a9326f8b1b073ea9424ab9
Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/24663
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Maintainer: Giacomo Travaglini <giacomo.travaglini@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/arch/arm/isa.cc
src/arch/arm/isa.hh

index 767fd9f6a686754e4980c2a2e6f04549e57824b1..101ca54203b14ed9cb6ef044833ddd723477c860 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2019 ARM Limited
+ * Copyright (c) 2010-2020 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -2190,6 +2190,18 @@ ISA::zeroSveVecRegUpperPart(VecRegContainer &vc, unsigned eCount)
     }
 }
 
+ISA::MiscRegLUTEntryInitializer::chain
+ISA::MiscRegLUTEntryInitializer::highest(ArmSystem *const sys) const
+{
+    switch (FullSystem ? sys->highestEL() : EL1) {
+      case EL0:
+      case EL1: priv(); break;
+      case EL2: hyp(); break;
+      case EL3: mon(); break;
+    }
+    return *this;
+}
+
 }  // namespace ArmISA
 
 ArmISA::ISA *
index fea372ed403fd81e9b72f448d56f9bc2d1d4727d..7ffa682ef2bfe3f8427348bdaf1dc4010dd477f9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2012-2019 ARM Limited
+ * Copyright (c) 2010, 2012-2020 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -357,6 +357,7 @@ namespace ArmISA
                 user(0);
                 return *this;
             }
+            chain highest(ArmSystem *const sys) const;
             MiscRegLUTEntryInitializer(struct MiscRegLUTEntry &e,
                                        std::bitset<NUM_MISCREG_INFOS> &i)
               : entry(e),