]> xenbits.xensource.com Git - qemu-xen.git/commitdiff
target/ppc: Fix pending HDEC when entering PM state
authorNicholas Piggin <npiggin@gmail.com>
Wed, 26 Jul 2023 18:22:27 +0000 (04:22 +1000)
committerMichael Tokarev <mjt@tls.msk.ru>
Sat, 5 Aug 2023 17:49:49 +0000 (20:49 +0300)
HDEC is defined to not wake from PM state. There is a check in the HDEC
timer to avoid setting the interrupt if we are in a PM state, but no
check on PM entry to lower HDEC if it already fired. This can cause a
HDECR wake up and  QEMU abort with unsupported exception in Power Save
mode.

Fixes: 4b236b621bf ("ppc: Initial HDEC support")
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
Message-ID: <20230726182230.433945-4-npiggin@gmail.com>
Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
(cherry picked from commit 9915dac4847f3cc5ffd36e4c374a4eec83fe09b5)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
target/ppc/excp_helper.c

index a5640060b26438ee73fc7e85dc74780e4b60dc52..9769cea7e903ab21741ba5c146b7881230289085 100644 (file)
@@ -2636,6 +2636,12 @@ void helper_pminsn(CPUPPCState *env, uint32_t insn)
     env->resume_as_sreset = (insn != PPC_PM_STOP) ||
         (env->spr[SPR_PSSCR] & PSSCR_EC);
 
+    /* HDECR is not to wake from PM state, it may have already fired */
+    if (env->resume_as_sreset) {
+        PowerPCCPU *cpu = env_archcpu(env);
+        ppc_set_irq(cpu, PPC_INTERRUPT_HDECR, 0);
+    }
+
     ppc_maybe_interrupt(env);
 }
 #endif /* defined(TARGET_PPC64) */