summaryrefslogtreecommitdiff
path: root/src/arch/arm/isa/insts/misc.isa
diff options
context:
space:
mode:
authorGiacomo Travaglini <giacomo.travaglini@arm.com>2017-12-01 16:25:55 +0000
committerGiacomo Travaglini <giacomo.travaglini@arm.com>2017-12-21 13:25:24 +0000
commit7df83c94da53f8d04367cb472be8f7f947f94234 (patch)
tree0ca945b489931f3503ea122622d053fee353baf7 /src/arch/arm/isa/insts/misc.isa
parent0049df179f3b5f57218b91e98390c1aacaa27c2e (diff)
downloadgem5-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/insts/misc.isa')
-rw-r--r--src/arch/arm/isa/insts/misc.isa44
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);
'''