arch-arm: Fix WFI sleeping in secure mode

The CPU should not sleep with a pending virtual interrupt
if secure mode EL2 is supported (FEAT_SEL2)

Change-Id: Ib71c4a09d76a790331cf6750da45f83694946aee
Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
This commit is contained in:
Giacomo Travaglini
2023-10-17 15:54:49 +01:00
parent b8fabc15d9
commit 098feb4042

View File

@@ -169,16 +169,16 @@ class Interrupts : public BaseInterrupts
bool
checkWfiWake(HCR hcr, CPSR cpsr, SCR scr) const
{
uint64_t maskedIntStatus;
bool virtWake;
uint64_t masked_int_status;
bool virt_wake;
maskedIntStatus = intStatus & ~((1 << INT_VIRT_IRQ) |
(1 << INT_VIRT_FIQ));
virtWake = (hcr.vi || interrupts[INT_VIRT_IRQ]) && hcr.imo;
virtWake |= (hcr.vf || interrupts[INT_VIRT_FIQ]) && hcr.fmo;
virtWake |= hcr.va && hcr.amo;
virtWake &= (cpsr.mode != MODE_HYP) && !isSecure(tc);
return maskedIntStatus || virtWake;
masked_int_status = intStatus & ~((1 << INT_VIRT_IRQ) |
(1 << INT_VIRT_FIQ));
virt_wake = (hcr.vi || interrupts[INT_VIRT_IRQ]) && hcr.imo;
virt_wake |= (hcr.vf || interrupts[INT_VIRT_FIQ]) && hcr.fmo;
virt_wake |= hcr.va && hcr.amo;
virt_wake &= currEL(cpsr) < EL2 && EL2Enabled(tc);
return masked_int_status || virt_wake;
}
uint32_t