qemu-ga: add win32 guest-suspend-ram command

S3 sleep implementation for windows.
This commit is contained in:
Michael Roth 2012-03-12 12:50:02 -05:00
parent aa59637ea1
commit f54603b6aa
1 changed files with 25 additions and 9 deletions

View File

@ -174,7 +174,8 @@ int64_t qmp_guest_fsfreeze_thaw(Error **err)
} }
typedef enum { typedef enum {
GUEST_SUSPEND_MODE_DISK GUEST_SUSPEND_MODE_DISK,
GUEST_SUSPEND_MODE_RAM
} GuestSuspendMode; } GuestSuspendMode;
static void check_suspend_mode(GuestSuspendMode mode, Error **err) static void check_suspend_mode(GuestSuspendMode mode, Error **err)
@ -192,18 +193,24 @@ static void check_suspend_mode(GuestSuspendMode mode, Error **err)
goto out; goto out;
} }
if (mode == GUEST_SUSPEND_MODE_DISK) { switch (mode) {
if (sys_pwr_caps.SystemS4) { case GUEST_SUSPEND_MODE_DISK:
return; 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", error_set(&local_err, QERR_INVALID_PARAMETER_VALUE, "mode",
"GuestSuspendMode"); "GuestSuspendMode");
goto out;
} }
error_set(&local_err, QERR_QGA_COMMAND_FAILED,
"suspend mode not supported by OS");
out: out:
if (local_err) { if (local_err) {
error_propagate(err, 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) 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) void qmp_guest_suspend_hybrid(Error **err)