OpenBSD writes zero to an edge triggered decrementer, then enters idle expecting its interrupt. QEMU defers the already due edge to a timer at the current virtual time, leaving the guest stalled.
Signed-off-by: Kirill A. Korinsky <[email protected]> --- hw/ppc/ppc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c index b123b4cc1c..d99e47d532 100644 --- a/hw/ppc/ppc.c +++ b/hw/ppc/ppc.c @@ -885,6 +885,7 @@ static void __cpu_ppc_store_decr(PowerPCCPU *cpu, int64_t now, uint64_t *nextp, * an edge interrupt, so raise it here too. */ if (((flags & PPC_DECR_UNDERFLOW_LEVEL) && signed_value < 0) || + ((flags & PPC_DECR_UNDERFLOW_TRIGGERED) && value == 0) || ((flags & PPC_DECR_UNDERFLOW_TRIGGERED) && signed_value < 0 && signed_decr >= 0)) { (*raise_excp)(cpu); -- 2.55.0
