From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:34902) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RvXRZ-0005yM-NK for qemu-devel@nongnu.org; Thu, 09 Feb 2012 12:06:07 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RvXRS-0003ce-P6 for qemu-devel@nongnu.org; Thu, 09 Feb 2012 12:06:01 -0500 Received: from mx1.redhat.com ([209.132.183.28]:31374) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RvXRS-0003cN-Bg for qemu-devel@nongnu.org; Thu, 09 Feb 2012 12:05:54 -0500 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q19H5rJg020970 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 9 Feb 2012 12:05:53 -0500 From: Gerd Hoffmann Date: Thu, 9 Feb 2012 18:05:42 +0100 Message-Id: <1328807143-29499-11-git-send-email-kraxel@redhat.com> In-Reply-To: <1328807143-29499-1-git-send-email-kraxel@redhat.com> References: <1328807143-29499-1-git-send-email-kraxel@redhat.com> Subject: [Qemu-devel] [PATCH v4 10/11] suspend: make rtc alarm wakeup the guest. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , gleb@redhat.com Make the rtc wake up the guest when the alarm fires. Add acpi windup to property support RTC_EN. Signed-off-by: Gerd Hoffmann --- hw/acpi.c | 7 +++++++ hw/mc146818rtc.c | 1 + sysemu.h | 1 + 3 files changed, 9 insertions(+), 0 deletions(-) diff --git a/hw/acpi.c b/hw/acpi.c index 7b16716..c05dde6 100644 --- a/hw/acpi.c +++ b/hw/acpi.c @@ -254,6 +254,10 @@ static void acpi_notify_wakeup(Notifier *notifier, void *data) WakeupReason *reason = data; switch (*reason) { + case QEMU_WAKEUP_REASON_RTC: + ar->pm1.evt.sts |= + (ACPI_BITMASK_WAKE_STATUS | ACPI_BITMASK_RT_CLOCK_STATUS); + break; case QEMU_WAKEUP_REASON_OTHER: default: /* ACPI_BITMASK_WAKE_STATUS should be set on resume. @@ -287,6 +291,8 @@ void acpi_pm1_evt_write_sts(ACPIREGS *ar, uint16_t val) 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); } void acpi_pm1_evt_power_down(ACPIREGS *ar) @@ -301,6 +307,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); } /* ACPI PM_TMR */ diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c index 314ed52..37adddb 100644 --- a/hw/mc146818rtc.c +++ b/hw/mc146818rtc.c @@ -437,6 +437,7 @@ static void rtc_update_second2(void *opaque) s->cmos_data[RTC_REG_C] |= REG_C_AF; if (s->cmos_data[RTC_REG_B] & REG_B_AIE) { + qemu_system_wakeup_request(QEMU_WAKEUP_REASON_RTC); qemu_irq_raise(s->irq); s->cmos_data[RTC_REG_C] |= REG_C_IRQF; } diff --git a/sysemu.h b/sysemu.h index af73813..781bdaf 100644 --- a/sysemu.h +++ b/sysemu.h @@ -40,6 +40,7 @@ void vm_stop_force_state(RunState state); typedef enum WakeupReason { QEMU_WAKEUP_REASON_OTHER = 0, + QEMU_WAKEUP_REASON_RTC, } WakeupReason; void qemu_system_reset_request(void); -- 1.7.1