arm: Correctly check translation mode (aarch64/aarch32)
According to the ARM ARM (see AArch32.TranslateAddress in the pseudocode library), the TLB should be operating in aarch64 mode if the EL0 is aarch32 and EL1 is aarch64. This is currently not the case in gem5, which breaks 64/32 interprocessing. Update the check to match the reference manual. Change-Id: I6f1444d57c0e2eb5f8880f513f33a9197b7cb2ce Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com> Reviewed-by: Mitch Hayenga <mitch.hayenga@arm.com> Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
This commit is contained in:
parent
44e9b81f74
commit
9d4a42e8c5
1 changed files with 8 additions and 4 deletions
|
@ -1197,11 +1197,15 @@ TLB::updateMiscReg(ThreadContext *tc, ArmTranslationType tranType)
|
||||||
|
|
||||||
DPRINTF(TLBVerbose, "TLB variables changed!\n");
|
DPRINTF(TLBVerbose, "TLB variables changed!\n");
|
||||||
cpsr = tc->readMiscReg(MISCREG_CPSR);
|
cpsr = tc->readMiscReg(MISCREG_CPSR);
|
||||||
|
|
||||||
// Dependencies: SCR/SCR_EL3, CPSR
|
// Dependencies: SCR/SCR_EL3, CPSR
|
||||||
isSecure = inSecureState(tc);
|
isSecure = inSecureState(tc) &&
|
||||||
isSecure &= (tranType & HypMode) == 0;
|
!(tranType & HypMode) && !(tranType & S1S2NsTran);
|
||||||
isSecure &= (tranType & S1S2NsTran) == 0;
|
|
||||||
aarch64 = !cpsr.width;
|
const OperatingMode op_mode = (OperatingMode) (uint8_t)cpsr.mode;
|
||||||
|
aarch64 = opModeIs64(op_mode) ||
|
||||||
|
(opModeToEL(op_mode) == EL0 && ELIs64(tc, EL1));
|
||||||
|
|
||||||
if (aarch64) { // AArch64
|
if (aarch64) { // AArch64
|
||||||
aarch64EL = (ExceptionLevel) (uint8_t) cpsr.el;
|
aarch64EL = (ExceptionLevel) (uint8_t) cpsr.el;
|
||||||
switch (aarch64EL) {
|
switch (aarch64EL) {
|
||||||
|
|
Loading…
Reference in a new issue