diff options
author | Giacomo Travaglini <giacomo.travaglini@arm.com> | 2018-12-18 14:20:44 +0000 |
---|---|---|
committer | Giacomo Travaglini <giacomo.travaglini@arm.com> | 2019-01-16 11:20:26 +0000 |
commit | cba75858ab94b525c2daad973b8197e9ebd1f1af (patch) | |
tree | e0cf1bcc94ce66e264afb127e9ad8f58a7a3467f /src/arch/arm/utility.cc | |
parent | 671840615bb721b9545789555e796f5d47a15bf6 (diff) | |
download | gem5-cba75858ab94b525c2daad973b8197e9ebd1f1af.tar.xz |
arch-arm: Read VMPIDR instead of MPIDR when EL2 is Enabled
Trying to read MPIDR(_EL1) from EL1, should return the value of
VMPIDR_EL2 if EL2 is enabled. This patch is modifying the utility
function for reading MPIDR in order to match this behaviour for both
AArch32 and AArch64.
Change-Id: I32c2d4d5052f509e6e0542a5314844164221c6a3
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/15617
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Diffstat (limited to 'src/arch/arm/utility.cc')
-rw-r--r-- | src/arch/arm/utility.cc | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/src/arch/arm/utility.cc b/src/arch/arm/utility.cc index 1dc7fc047..58eb032c4 100644 --- a/src/arch/arm/utility.cc +++ b/src/arch/arm/utility.cc @@ -205,7 +205,37 @@ longDescFormatInUse(ThreadContext *tc) return ArmSystem::haveLPAE(tc) && ttbcr.eae; } -uint32_t +MiscReg +readMPIDR(ArmSystem *arm_sys, ThreadContext *tc) +{ + CPSR cpsr = tc->readMiscReg(MISCREG_CPSR); + const ExceptionLevel current_el = + opModeToEL((OperatingMode) (uint8_t) cpsr.mode); + + const bool is_secure = isSecureBelowEL3(tc); + + switch (current_el) { + case EL0: + // Note: in MsrMrs instruction we read the register value before + // checking access permissions. This means that EL0 entry must + // be part of the table even if MPIDR is not accessible in user + // mode. + warn_once("Trying to read MPIDR at EL0\n"); + M5_FALLTHROUGH; + case EL1: + if (ArmSystem::haveEL(tc, EL2) && !is_secure) + return tc->readMiscReg(MISCREG_VMPIDR_EL2); + else + return getMPIDR(arm_sys, tc); + case EL2: + case EL3: + return getMPIDR(arm_sys, tc); + default: + panic("Invalid EL for reading MPIDR register\n"); + } +} + +MiscReg getMPIDR(ArmSystem *arm_sys, ThreadContext *tc) { // Multiprocessor Affinity Register MPIDR from Cortex(tm)-A15 Technical |