diff --git a/hw/acpi.c b/hw/acpi.c index c05dde6c89c1f076cf9af8aaf444c59536f51cb4..5d521e51331e5a5b83e0a9aea404da00181c83e0 100644 --- a/hw/acpi.c +++ b/hw/acpi.c @@ -258,6 +258,10 @@ static void acpi_notify_wakeup(Notifier *notifier, void *data) ar->pm1.evt.sts |= (ACPI_BITMASK_WAKE_STATUS | ACPI_BITMASK_RT_CLOCK_STATUS); break; + case QEMU_WAKEUP_REASON_PMTIMER: + ar->pm1.evt.sts |= + (ACPI_BITMASK_WAKE_STATUS | ACPI_BITMASK_TIMER_STATUS); + break; case QEMU_WAKEUP_REASON_OTHER: default: /* ACPI_BITMASK_WAKE_STATUS should be set on resume. @@ -293,6 +297,8 @@ void acpi_pm1_evt_write_en(ACPIREGS *ar, uint16_t val) ar->pm1.evt.en = val; qemu_system_wakeup_enable(QEMU_WAKEUP_REASON_RTC, val & ACPI_BITMASK_RT_CLOCK_ENABLE); + qemu_system_wakeup_enable(QEMU_WAKEUP_REASON_PMTIMER, + val & ACPI_BITMASK_TIMER_ENABLE); } void acpi_pm1_evt_power_down(ACPIREGS *ar) @@ -308,6 +314,7 @@ void acpi_pm1_evt_reset(ACPIREGS *ar) ar->pm1.evt.sts = 0; ar->pm1.evt.en = 0; qemu_system_wakeup_enable(QEMU_WAKEUP_REASON_RTC, 0); + qemu_system_wakeup_enable(QEMU_WAKEUP_REASON_PMTIMER, 0); } /* ACPI PM_TMR */ @@ -340,6 +347,7 @@ uint32_t acpi_pm_tmr_get(ACPIREGS *ar) static void acpi_pm_tmr_timer(void *opaque) { ACPIREGS *ar = opaque; + qemu_system_wakeup_request(QEMU_WAKEUP_REASON_PMTIMER); ar->tmr.update_sci(ar); } diff --git a/sysemu.h b/sysemu.h index 781bdaf1df75a7d28357910d9b403585e597454a..98118cc478455ccc4463c216f381839bba8058d5 100644 --- a/sysemu.h +++ b/sysemu.h @@ -41,6 +41,7 @@ void vm_stop_force_state(RunState state); typedef enum WakeupReason { QEMU_WAKEUP_REASON_OTHER = 0, QEMU_WAKEUP_REASON_RTC, + QEMU_WAKEUP_REASON_PMTIMER, } WakeupReason; void qemu_system_reset_request(void);