From f03a13ee4852311650ba33167a5d334859916e5b Mon Sep 17 00:00:00 2001 Message-Id: In-Reply-To: <27a73856ecc481c66c7afac8171f753887f32e31.1342518105.git.minovotn@redhat.com> References: <27a73856ecc481c66c7afac8171f753887f32e31.1342518105.git.minovotn@redhat.com> From: Luiz Capitulino Date: Tue, 5 Jun 2012 14:58:21 +0200 Subject: [PATCH 12/41] qemu-ga: add win32 guest-suspend-ram command RH-Author: Luiz Capitulino Message-id: <1338908331-15633-7-git-send-email-lcapitulino@redhat.com> Patchwork-id: 39903 O-Subject: [PATCH RHEL6.4 qemu-kvm 06/36] qemu-ga: add win32 guest-suspend-ram command Bugzilla: 827612 RH-Acked-by: Paolo Bonzini RH-Acked-by: Jeffrey Cody RH-Acked-by: Juan Quintela From: Michael Roth S3 sleep implementation for windows. (cherry picked from commit f54603b6aa765514b2519e74114a2f417759d727) Signed-off-by: Luiz Capitulino --- qga/commands-win32.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) Signed-off-by: Michal Novotny --- qga/commands-win32.c | 34 +++++++++++++++++++++++++--------- 1 file 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.10.4