diff --git a/src/arch/arm/isa/insts/misc.isa b/src/arch/arm/isa/insts/misc.isa index b2f459158a..64bf791d59 100644 --- a/src/arch/arm/isa/insts/misc.isa +++ b/src/arch/arm/isa/insts/misc.isa @@ -721,18 +721,19 @@ let {{ // WFE Sleeps if SevMailbox==0 and no unmasked interrupts are pending, ThreadContext *tc = xc->tcBase(); + Tick next_cycle = tc->getCpuPtr()->nextCycle(); if (SevMailbox == 1) { SevMailbox = 0; - PseudoInst::quiesceSkip(tc); + tc->quiesceTick(next_cycle + 1); } else if (tc->getCpuPtr()->getInterruptController( tc->threadId())->checkInterrupts()) { - PseudoInst::quiesceSkip(tc); + tc->quiesceTick(next_cycle + 1); } else { fault = trapWFx(tc, cpsr, scr, true); if (fault == NoFault) { - PseudoInst::quiesce(tc); + tc->quiesce(); } else { - PseudoInst::quiesceSkip(tc); + tc->quiesceTick(next_cycle + 1); } } ''' @@ -760,15 +761,16 @@ let {{ ThreadContext *tc = xc->tcBase(); auto *ic = dynamic_cast( tc->getCpuPtr()->getInterruptController(tc->threadId())); + Tick next_cycle = tc->getCpuPtr()->nextCycle(); if (ic->checkWfiWake(hcr, cpsr, scr)) { - PseudoInst::quiesceSkip(tc); + tc->quiesceTick(next_cycle + 1); } else { fault = trapWFx(tc, cpsr, scr, false); if (fault == NoFault) { - PseudoInst::quiesce(tc); + tc->quiesce(); ArmSystem::callSetStandByWfi(tc); } else { - PseudoInst::quiesceSkip(tc); + tc->quiesceTick(next_cycle + 1); } } tc->getCpuPtr()->clearInterrupt(tc->threadId(), INT_ABT, 0); diff --git a/src/arch/arm/isa/templates/pred.isa b/src/arch/arm/isa/templates/pred.isa index ee48f90cd0..9b08fc3d3e 100644 --- a/src/arch/arm/isa/templates/pred.isa +++ b/src/arch/arm/isa/templates/pred.isa @@ -206,7 +206,8 @@ def template QuiescePredOpExecute {{ } } else { xc->setPredicate(false); - PseudoInst::quiesceSkip(xc->tcBase()); + ThreadContext *tc = xc->tcBase(); + tc->quiesceTick(tc->getCpuPtr()->nextCycle() + 1); } return fault; @@ -233,7 +234,8 @@ def template QuiescePredOpExecuteWithFixup {{ } else { xc->setPredicate(false); %(pred_fixup)s; - PseudoInst::quiesceSkip(xc->tcBase()); + ThreadContext *tc = xc->tcBase(); + tc->quiesceTick(tc->getCpuPtr()->nextCycle() + 1); } return fault;