33.10.3.1.4. gem5 ARM WFE
gem5 390a74f59934b85d91489f8a563450d8321b602d does not sleep on the first WFE on either syscall emulation or full system, because the code does:
Fault WfeInst::execute(
ExecContext *xc, Trace::InstRecord *traceData) const
{
[...]
if (SevMailbox == 1) {
SevMailbox = 0;
PseudoInst::quiesceSkip(tc);
} else if (tc->getCpuPtr()->getInterruptController(
tc->threadId())->checkInterrupts(tc)) {
PseudoInst::quiesceSkip(tc);
} else {
fault = trapWFx(tc, cpsr, scr, true);
if (fault == NoFault) {
PseudoInst::quiesce(tc);
} else {
PseudoInst::quiesceSkip(tc);
}
}
where "quiesce" means "sleep" for laymen like Ciro, and quiesceSkip means don’t sleep.
SevMailbox is read from MISCREG_SEV_MAILBOX which is initialized to 1 at:
ISA::clear()
{
[...]
miscRegs[MISCREG_SEV_MAILBOX] = 1;