From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:42960) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S7BgN-0007w6-Ej for qemu-devel@nongnu.org; Mon, 12 Mar 2012 16:17:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1S7BgL-0003xL-Mr for qemu-devel@nongnu.org; Mon, 12 Mar 2012 16:17:26 -0400 Received: from mail-yw0-f45.google.com ([209.85.213.45]:46657) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S7BgL-0003wq-GO for qemu-devel@nongnu.org; Mon, 12 Mar 2012 16:17:25 -0400 Received: by yhoo21 with SMTP id o21so3520408yho.4 for ; Mon, 12 Mar 2012 13:17:23 -0700 (PDT) Sender: fluxion From: Michael Roth Date: Mon, 12 Mar 2012 15:16:44 -0500 Message-Id: <1331583406-12873-6-git-send-email-mdroth@linux.vnet.ibm.com> In-Reply-To: <1331583406-12873-1-git-send-email-mdroth@linux.vnet.ibm.com> References: <1331583406-12873-1-git-send-email-mdroth@linux.vnet.ibm.com> Subject: [Qemu-devel] [PATCH 5/7] qemu-ga: add win32 guest-suspend-ram command List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: ghammer@redhat.com, mprivozn@redhat.com, aliguori@us.ibm.com, lcapitulino@redhat.com S3 sleep implementation for windows. Signed-off-by: Michael Roth --- qga/commands-win32.c | 34 +++++++++++++++++++++++++--------- 1 files changed, 25 insertions(+), 9 deletions(-) diff --git a/qga/commands-win32.c b/qga/commands-win32.c index 062e519..b7600ed 100644 --- a/qga/commands-win32.c +++ b/qga/commands-win32.c @@ -174,7 +174,8 @@ int64_t qmp_guest_fsfreeze_thaw(Error **err) } typedef enum { - GUEST_SUSPEND_MODE_DISK + GUEST_SUSPEND_MODE_DISK, + GUEST_SUSPEND_MODE_RAM } GuestSuspendMode; static void check_suspend_mode(GuestSuspendMode mode, Error **err) @@ -192,18 +193,24 @@ static void check_suspend_mode(GuestSuspendMode mode, Error **err) goto out; } - if (mode == GUEST_SUSPEND_MODE_DISK) { - if (sys_pwr_caps.SystemS4) { - return; + switch (mode) { + case GUEST_SUSPEND_MODE_DISK: + if (!sys_pwr_caps.SystemS4) { + error_set(&local_err, QERR_QGA_COMMAND_FAILED, + "suspend-to-disk not supported by OS"); } - } else { + break; + case GUEST_SUSPEND_MODE_RAM: + if (!sys_pwr_caps.SystemS3) { + error_set(&local_err, QERR_QGA_COMMAND_FAILED, + "suspend-to-ram not supported by OS"); + } + break; + default: error_set(&local_err, QERR_INVALID_PARAMETER_VALUE, "mode", "GuestSuspendMode"); - goto out; } - error_set(&local_err, QERR_QGA_COMMAND_FAILED, - "suspend mode not supported by OS"); out: if (local_err) { error_propagate(err, local_err); @@ -239,7 +246,16 @@ void qmp_guest_suspend_disk(Error **err) void qmp_guest_suspend_ram(Error **err) { - error_set(err, QERR_UNSUPPORTED); + GuestSuspendMode *mode = g_malloc(sizeof(GuestSuspendMode)); + + *mode = GUEST_SUSPEND_MODE_RAM; + check_suspend_mode(*mode, err); + acquire_privilege(SE_SHUTDOWN_NAME, err); + execute_async(do_suspend, mode, err); + + if (error_is_set(err)) { + g_free(mode); + } } void qmp_guest_suspend_hybrid(Error **err) -- 1.7.4.1