diff --git a/target/ppc/pmu_book3s_helper.c b/target/ppc/pmu_book3s_helper.c
index 91bb82e699..43cc0eb722 100644
--- a/target/ppc/pmu_book3s_helper.c
+++ b/target/ppc/pmu_book3s_helper.c
@@ -10,12 +10,15 @@
* See the COPYING file in the top-level directory.
*/
+#include "pmu_book3s_helper.h"
+
#include "qemu/osdep.h"
+static void cpu_ppc_pmu_timer_cb(void *opaque)
+{
+ PowerPCCPU *cpu = opaque;
+ CPUPPCState *env = &cpu->env;
+ uint64_t mmcr0;
+
+ mmcr0 = env->spr[SPR_POWER_MMCR0];
+ if (env->spr[SPR_POWER_MMCR0] & MMCR0_EBE) {
+ /* freeeze counters if needed */
+ if (mmcr0 & MMCR0_FCECE) {
+ mmcr0 &= ~MMCR0_FCECE;
+ mmcr0 |= MMCR0_FC;
+ }
+
+ /* Clear PMAE and set PMAO */
+ if (mmcr0 & MMCR0_PMAE) {
+ mmcr0 &= ~MMCR0_PMAE;
+ mmcr0 |= MMCR0_PMAO;
+ }
+ env->spr[SPR_POWER_MMCR0] = mmcr0;
+
+ /* Fire the PMC hardware exception */
+ ppc_set_irq(cpu, PPC_INTERRUPT_PMC, 1);