On 02/09/12 12:19, Gleb Natapov wrote:
> On Thu, Feb 09, 2012 at 11:45:21AM +0100, Gerd Hoffmann wrote:
>> On 02/09/12 09:48, Gleb Natapov wrote:
>>> On Wed, Feb 08, 2012 at 12:00:14PM +0100, Gerd Hoffmann wrote:
>>>>  * qemu_system_wakeup_request is supposed to be called on events which
>>>>    should wake up the guest.
>>>>
>>> qemu_system_wakeup_request() should get wakeup source as a parameter.
>>> There are ways to report it to a guest.
>>
>> Can we do that incrementally, when we actually implement the guest
>> reporting?
>>
> What do you mean by "when we actually implement the guest
> reporting"? The guest reporting is part of ACPI spec and implemented
> by all relevant guests. I think that adding wakeup source parameter to
> qemu_system_wakeup_request() and reporting RTC_STS and PWRBTN_STS should
> not complicate your patch series to much. I agree that DSDT magic required
> by other devices can wait for later.

Incremental patch (just infrastructure, no acpi windup yet) attached.
Something like this?

cheers,
  Gerd
commit 78fbd17ddc98a2e96e05db62afbe3a69c5fad5e5
Author: Gerd Hoffmann <kra...@redhat.com>
Date:   Thu Feb 9 12:52:48 2012 +0100

    reason: infra

diff --git a/sysemu.h b/sysemu.h
index 3b9d7f5..e7060aa 100644
--- a/sysemu.h
+++ b/sysemu.h
@@ -38,10 +38,16 @@ void vm_start(void);
 void vm_stop(RunState state);
 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);
 void qemu_system_suspend_request(void);
 void qemu_register_suspend_notifier(Notifier *notifier);
-void qemu_system_wakeup_request(void);
+void qemu_system_wakeup_request(WakeupReason reason);
+void qemu_register_wakeup_notifier(Notifier *notifier);
 void qemu_system_shutdown_request(void);
 void qemu_system_powerdown_request(void);
 void qemu_system_debug_request(void);
diff --git a/vl.c b/vl.c
index 822fd58..17d4b72 100644
--- a/vl.c
+++ b/vl.c
@@ -1286,6 +1286,8 @@ static int debug_requested;
 static bool is_suspended;
 static NotifierList suspend_notifiers =
     NOTIFIER_LIST_INITIALIZER(suspend_notifiers);
+static NotifierList wakeup_notifiers =
+    NOTIFIER_LIST_INITIALIZER(wakeup_notifiers);
 static RunState vmstop_requested = RUN_STATE_MAX;
 
 int qemu_shutdown_requested_get(void)
@@ -1416,16 +1418,22 @@ void qemu_register_suspend_notifier(Notifier *notifier)
     notifier_list_add(&suspend_notifiers, notifier);
 }
 
-void qemu_system_wakeup_request(void)
+void qemu_system_wakeup_request(WakeupReason reason)
 {
     if (!is_suspended) {
         return;
     }
+    notifier_list_notify(&wakeup_notifiers, &reason);
     reset_requested = 1;
     qemu_notify_event();
     is_suspended = false;
 }
 
+void qemu_register_wakeup_notifier(Notifier *notifier)
+{
+    notifier_list_add(&wakeup_notifiers, notifier);
+}
+
 void qemu_system_killed(int signal, pid_t pid)
 {
     shutdown_signal = signal;

Reply via email to