diff options
author | Andreas Sandberg <andreas.sandberg@arm.com> | 2016-06-02 13:38:30 +0100 |
---|---|---|
committer | Andreas Sandberg <andreas.sandberg@arm.com> | 2016-06-02 13:38:30 +0100 |
commit | f48ad5b29d6f291b4f3679ff5fb7b5beae10d6fa (patch) | |
tree | d08e72f1eeeea81b33b60b6bd0f90f1cbd9f174d /src/arch/arm/isa/templates/neon.isa | |
parent | 53ae19bb5dce904915385515d87ff3c9a69ee170 (diff) | |
download | gem5-f48ad5b29d6f291b4f3679ff5fb7b5beae10d6fa.tar.xz |
arm: Correctly check FP/SIMD access permission in aarch32
The current implementation of aarch32 FP/SIMD in gem5 assumes that EL1
and higher are all 32-bit. This breaks interprocessing since an
aarch64 EL1 uses different enable/disable bits. This change updates
the permission checks to according to what is prescribed by the ARM
ARM.
Change-Id: Icdcef31b00644cfeebec00216b3993aa1de12b88
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Mitch Hayenga <mitch.hayenga@arm.com>
Reviewed-by: Nathanael Premillieu <nathanael.premillieu@arm.com>
Diffstat (limited to 'src/arch/arm/isa/templates/neon.isa')
-rw-r--r-- | src/arch/arm/isa/templates/neon.isa | 27 |
1 files changed, 6 insertions, 21 deletions
diff --git a/src/arch/arm/isa/templates/neon.isa b/src/arch/arm/isa/templates/neon.isa index 45df741e7..9e9b79957 100644 --- a/src/arch/arm/isa/templates/neon.isa +++ b/src/arch/arm/isa/templates/neon.isa @@ -1,6 +1,6 @@ // -*- mode:c++ -*- -// Copyright (c) 2010-2012 ARM Limited +// Copyright (c) 2010-2012, 2016 ARM Limited // All rights reserved // // The license below extends only to copyright in the software and shall @@ -40,26 +40,11 @@ let {{ simdEnabledCheckCode = ''' { - uint32_t issEnCheck; - bool trapEnCheck; - uint32_t seq; - if (!vfpNeonEnabled(seq, Hcptr, Nsacr, Cpacr, Cpsr, issEnCheck, - trapEnCheck, xc->tcBase(), Fpexc, true)) - {return disabledFault();} - if (trapEnCheck) { - CPSR cpsrEnCheck = Cpsr; - if (cpsrEnCheck.mode == MODE_HYP) { - return std::make_shared<UndefinedInstruction>( - machInst, issEnCheck, - EC_TRAPPED_HCPTR); - } else { - if (!inSecureState(Scr, Cpsr)) { - return std::make_shared<HypervisorTrap>( - machInst, issEnCheck, - EC_TRAPPED_HCPTR); - } - } - } + Fault fault = checkAdvSIMDOrFPEnabled32(xc->tcBase(), + Cpsr, Cpacr, Nsacr, Fpexc, + true, true); + if (fault != NoFault) + return fault; } ''' }}; |