summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/arm/system.cc17
-rw-r--r--src/arch/arm/system.hh7
2 files changed, 22 insertions, 2 deletions
diff --git a/src/arch/arm/system.cc b/src/arch/arm/system.cc
index 1fe706079..097a87b2b 100644
--- a/src/arch/arm/system.cc
+++ b/src/arch/arm/system.cc
@@ -225,6 +225,23 @@ ArmSystem::highestEL(ThreadContext *tc)
return FullSystem? getArmSystem(tc)->highestEL() : EL1;
}
+bool
+ArmSystem::haveEL(ThreadContext *tc, ExceptionLevel el)
+{
+ switch (el) {
+ case EL0:
+ case EL1:
+ return true;
+ case EL2:
+ return haveVirtualization(tc);
+ case EL3:
+ return haveSecurity(tc);
+ default:
+ warn("Unimplemented Exception Level\n");
+ return false;
+ }
+}
+
Addr
ArmSystem::resetAddr64(ThreadContext *tc)
{
diff --git a/src/arch/arm/system.hh b/src/arch/arm/system.hh
index b81ec05f9..46103f42c 100644
--- a/src/arch/arm/system.hh
+++ b/src/arch/arm/system.hh
@@ -259,8 +259,11 @@ class ArmSystem : public System
*/
static ExceptionLevel highestEL(ThreadContext *tc);
- /** Returns the reset address if the highest implemented exception level for
- * the system of a specific thread context is 64 bits (ARMv8)
+ /** Return true if the system implements a specific exception level */
+ static bool haveEL(ThreadContext *tc, ExceptionLevel el);
+
+ /** Returns the reset address if the highest implemented exception level
+ * for the system of a specific thread context is 64 bits (ARMv8)
*/
static Addr resetAddr64(ThreadContext *tc);