diff options
author | Giacomo Travaglini <giacomo.travaglini@arm.com> | 2017-12-01 16:25:55 +0000 |
---|---|---|
committer | Giacomo Travaglini <giacomo.travaglini@arm.com> | 2017-12-21 13:25:24 +0000 |
commit | 7df83c94da53f8d04367cb472be8f7f947f94234 (patch) | |
tree | 0ca945b489931f3503ea122622d053fee353baf7 /src/arch/arm/isa | |
parent | 0049df179f3b5f57218b91e98390c1aacaa27c2e (diff) | |
download | gem5-7df83c94da53f8d04367cb472be8f7f947f94234.tar.xz |
arch-arm: Fixed WFE/WFI trapping behaviour
This patch fixes the WFx trapping behaviour by introducing the arm arm
v8 pseudocode functions: checkForWFxTrap32 and checkForWFxTrap64
Change-Id: I3db0d78b5c4ad46860e6d199c2f2fc7b41842840
Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/6622
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Diffstat (limited to 'src/arch/arm/isa')
-rw-r--r-- | src/arch/arm/isa/insts/misc.isa | 44 |
1 files changed, 12 insertions, 32 deletions
diff --git a/src/arch/arm/isa/insts/misc.isa b/src/arch/arm/isa/insts/misc.isa index ef0a6709e..ae8474f79 100644 --- a/src/arch/arm/isa/insts/misc.isa +++ b/src/arch/arm/isa/insts/misc.isa @@ -670,10 +670,8 @@ let {{ exec_output += PredOpExecute.subst(yieldIop) wfeCode = ''' - HCR hcr = Hcr; CPSR cpsr = Cpsr; SCR scr = Scr64; - SCTLR sctlr = Sctlr; // WFE Sleeps if SevMailbox==0 and no unmasked interrupts are pending, ThreadContext *tc = xc->tcBase(); @@ -683,22 +681,13 @@ let {{ } else if (tc->getCpuPtr()->getInterruptController( tc->threadId())->checkInterrupts(tc)) { PseudoInst::quiesceSkip(tc); - } else if (cpsr.el == EL0 && !sctlr.ntwe) { - PseudoInst::quiesceSkip(tc); - fault = std::make_shared<SupervisorTrap>(machInst, 0x1E00001, - EC_TRAPPED_WFI_WFE); - } else if (ArmSystem::haveVirtualization(tc) && - !inSecureState(scr, cpsr) && (cpsr.mode != MODE_HYP) && - hcr.twe) { - PseudoInst::quiesceSkip(tc); - fault = std::make_shared<HypervisorTrap>(machInst, 0x1E00001, - EC_TRAPPED_WFI_WFE); - } else if (ArmSystem::haveSecurity(tc) && cpsr.el != EL3 && scr.twe) { - PseudoInst::quiesceSkip(tc); - fault = std::make_shared<SecureMonitorTrap>(machInst, 0x1E00001, - EC_TRAPPED_WFI_WFE); } else { - PseudoInst::quiesce(tc); + fault = trapWFx(tc, cpsr, scr, true); + if (fault == NoFault) { + PseudoInst::quiesce(tc); + } else { + PseudoInst::quiesceSkip(tc); + } } ''' wfePredFixUpCode = ''' @@ -720,28 +709,19 @@ let {{ HCR hcr = Hcr; CPSR cpsr = Cpsr; SCR scr = Scr64; - SCTLR sctlr = Sctlr; // WFI doesn't sleep if interrupts are pending (masked or not) ThreadContext *tc = xc->tcBase(); if (tc->getCpuPtr()->getInterruptController( tc->threadId())->checkWfiWake(hcr, cpsr, scr)) { PseudoInst::quiesceSkip(tc); - } else if (cpsr.el == EL0 && !sctlr.ntwi) { - PseudoInst::quiesceSkip(tc); - fault = std::make_shared<SupervisorTrap>(machInst, 0x1E00000, - EC_TRAPPED_WFI_WFE); - } else if (ArmSystem::haveVirtualization(tc) && hcr.twi && - (cpsr.mode != MODE_HYP) && !inSecureState(scr, cpsr)) { - PseudoInst::quiesceSkip(tc); - fault = std::make_shared<HypervisorTrap>(machInst, 0x1E00000, - EC_TRAPPED_WFI_WFE); - } else if (ArmSystem::haveSecurity(tc) && cpsr.el != EL3 && scr.twi) { - PseudoInst::quiesceSkip(tc); - fault = std::make_shared<SecureMonitorTrap>(machInst, 0x1E00000, - EC_TRAPPED_WFI_WFE); } else { - PseudoInst::quiesce(tc); + fault = trapWFx(tc, cpsr, scr, false); + if (fault == NoFault) { + PseudoInst::quiesce(tc); + } else { + PseudoInst::quiesceSkip(tc); + } } tc->getCpuPtr()->clearInterrupt(tc->threadId(), INT_ABT, 0); ''' |