summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGiacomo Travaglini <giacomo.travaglini@arm.com>2019-01-29 13:22:11 +0000
committerGiacomo Travaglini <giacomo.travaglini@arm.com>2019-02-08 13:41:56 +0000
commitaefae9d6f8768128b8797534f76b3e7b9e409af4 (patch)
tree33d49410cd6f13292ef2dd75c1439c8904848c0c /src
parent5508866192fce6854484f888f26bcc17b9f45e45 (diff)
downloadgem5-aefae9d6f8768128b8797534f76b3e7b9e409af4.tar.xz
arch-arm: Fix Virtual interrupts in AArch64
Checking if cpsr.mode is equal to MODE_HYP doesn't work for AArch64. This is because AArch64 is using different modes when in EL2, like EL2T and EL2H. This made Virtual Interrupts to be triggered even when executing in EL2 (hypervisor) whereas they should interrupt the scheduled VM only (Non-Secure EL0 and EL1). This patch is fixing this by using the generic currEL() helper for getting the exception level, which is working for both AArch32 and AArch64. Change-Id: I08640050ef06261f280ba1e63ca9f32c805af845 Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com> Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Reviewed-on: https://gem5-review.googlesource.com/c/16202 Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Diffstat (limited to 'src')
-rw-r--r--src/arch/arm/interrupts.hh4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/arch/arm/interrupts.hh b/src/arch/arm/interrupts.hh
index 77287e6dd..8d0cb49ea 100644
--- a/src/arch/arm/interrupts.hh
+++ b/src/arch/arm/interrupts.hh
@@ -142,7 +142,7 @@ class Interrupts : public SimObject
CPSR cpsr = tc->readMiscReg(MISCREG_CPSR);
- bool isHypMode = cpsr.mode == MODE_HYP;
+ bool isHypMode = currEL(tc) == EL2;
bool isSecure = inSecureState(tc);
bool allowVIrq = !cpsr.i && hcr.imo && !isSecure && !isHypMode;
bool allowVFiq = !cpsr.f && hcr.fmo && !isSecure && !isHypMode;
@@ -232,7 +232,7 @@ class Interrupts : public SimObject
// Calculate a few temp vars so we can work out if there's a pending
// virtual interrupt, and if its allowed to happen
// ARM ARM Issue C section B1.9.9, B1.9.11, and B1.9.13
- bool isHypMode = cpsr.mode == MODE_HYP;
+ bool isHypMode = currEL(tc) == EL2;
bool isSecure = inSecureState(tc);
bool allowVIrq = !cpsr.i && hcr.imo && !isSecure && !isHypMode;
bool allowVFiq = !cpsr.f && hcr.fmo && !isSecure && !isHypMode;