124 lines
4.2 KiB
Diff
124 lines
4.2 KiB
Diff
|
From bc05a488b49f903e404323b76ca9b675318393fc Mon Sep 17 00:00:00 2001
|
||
|
From: "Liu, Jinsong" <jinsong.liu@intel.com>
|
||
|
Date: Wed, 25 Sep 2013 16:38:29 +0000
|
||
|
Subject: [PATCH] qemu: Adjust qemu wakeup
|
||
|
|
||
|
Currently Xen hvm s3 has a bug coming from the difference between
|
||
|
qemu-traditioanl and qemu-xen. For qemu-traditional, the way to
|
||
|
resume from hvm s3 is via 'xl trigger' command. However, for
|
||
|
qemu-xen, the way to resume from hvm s3 inherited from standard
|
||
|
qemu, i.e. via QMP, and it doesn't work under Xen.
|
||
|
|
||
|
The root cause is, for qemu-xen, 'xl trigger' command didn't reset
|
||
|
devices, while QMP didn't unpause hvm domain though they did qemu
|
||
|
system reset.
|
||
|
|
||
|
We have two qemu patches and one xl patch to fix Xen hvm s3 bug.
|
||
|
This patch is the qemu patch 1. It adjusts qemu wakeup so that
|
||
|
Xen s3 resume logic (which will be implemented at qemu patch 2)
|
||
|
will be notified after qemu system reset.
|
||
|
|
||
|
Signed-off-by: Liu Jinsong <jinsong.liu@intel.com>
|
||
|
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
|
||
|
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
|
||
|
Reviewed-by: Anthony PERARD <anthony.perard@citrix.com>
|
||
|
(cherry picked from commit 4bc78a877252d772b983810a7d2c0be00e9be70e)
|
||
|
|
||
|
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
|
||
|
---
|
||
|
hw/acpi/core.c | 3 ++-
|
||
|
include/sysemu/sysemu.h | 4 +++-
|
||
|
vl.c | 15 +++++++--------
|
||
|
3 files changed, 12 insertions(+), 10 deletions(-)
|
||
|
|
||
|
diff --git a/hw/acpi/core.c b/hw/acpi/core.c
|
||
|
index b07feda..769cfdb 100644
|
||
|
--- a/hw/acpi/core.c
|
||
|
+++ b/hw/acpi/core.c
|
||
|
@@ -324,12 +324,13 @@ static void acpi_notify_wakeup(Notifier *notifier, void *data)
|
||
|
(ACPI_BITMASK_WAKE_STATUS | ACPI_BITMASK_TIMER_STATUS);
|
||
|
break;
|
||
|
case QEMU_WAKEUP_REASON_OTHER:
|
||
|
- default:
|
||
|
/* ACPI_BITMASK_WAKE_STATUS should be set on resume.
|
||
|
Pretend that resume was caused by power button */
|
||
|
ar->pm1.evt.sts |=
|
||
|
(ACPI_BITMASK_WAKE_STATUS | ACPI_BITMASK_POWER_BUTTON_STATUS);
|
||
|
break;
|
||
|
+ default:
|
||
|
+ break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
|
||
|
index d7a77b6..1a77c99 100644
|
||
|
--- a/include/sysemu/sysemu.h
|
||
|
+++ b/include/sysemu/sysemu.h
|
||
|
@@ -39,9 +39,11 @@ int vm_stop(RunState state);
|
||
|
int vm_stop_force_state(RunState state);
|
||
|
|
||
|
typedef enum WakeupReason {
|
||
|
- QEMU_WAKEUP_REASON_OTHER = 0,
|
||
|
+ /* Always keep QEMU_WAKEUP_REASON_NONE = 0 */
|
||
|
+ QEMU_WAKEUP_REASON_NONE = 0,
|
||
|
QEMU_WAKEUP_REASON_RTC,
|
||
|
QEMU_WAKEUP_REASON_PMTIMER,
|
||
|
+ QEMU_WAKEUP_REASON_OTHER,
|
||
|
} WakeupReason;
|
||
|
|
||
|
void qemu_system_reset_request(void);
|
||
|
diff --git a/vl.c b/vl.c
|
||
|
index f422a1c..2160933 100644
|
||
|
--- a/vl.c
|
||
|
+++ b/vl.c
|
||
|
@@ -1792,14 +1792,14 @@ static pid_t shutdown_pid;
|
||
|
static int powerdown_requested;
|
||
|
static int debug_requested;
|
||
|
static int suspend_requested;
|
||
|
-static int wakeup_requested;
|
||
|
+static WakeupReason wakeup_reason;
|
||
|
static NotifierList powerdown_notifiers =
|
||
|
NOTIFIER_LIST_INITIALIZER(powerdown_notifiers);
|
||
|
static NotifierList suspend_notifiers =
|
||
|
NOTIFIER_LIST_INITIALIZER(suspend_notifiers);
|
||
|
static NotifierList wakeup_notifiers =
|
||
|
NOTIFIER_LIST_INITIALIZER(wakeup_notifiers);
|
||
|
-static uint32_t wakeup_reason_mask = ~0;
|
||
|
+static uint32_t wakeup_reason_mask = ~(1 << QEMU_WAKEUP_REASON_NONE);
|
||
|
static RunState vmstop_requested = RUN_STATE_MAX;
|
||
|
|
||
|
int qemu_shutdown_requested_get(void)
|
||
|
@@ -1849,11 +1849,9 @@ static int qemu_suspend_requested(void)
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
-static int qemu_wakeup_requested(void)
|
||
|
+static WakeupReason qemu_wakeup_requested(void)
|
||
|
{
|
||
|
- int r = wakeup_requested;
|
||
|
- wakeup_requested = 0;
|
||
|
- return r;
|
||
|
+ return wakeup_reason;
|
||
|
}
|
||
|
|
||
|
static int qemu_powerdown_requested(void)
|
||
|
@@ -1970,8 +1968,7 @@ void qemu_system_wakeup_request(WakeupReason reason)
|
||
|
return;
|
||
|
}
|
||
|
runstate_set(RUN_STATE_RUNNING);
|
||
|
- notifier_list_notify(&wakeup_notifiers, &reason);
|
||
|
- wakeup_requested = 1;
|
||
|
+ wakeup_reason = reason;
|
||
|
qemu_notify_event();
|
||
|
}
|
||
|
|
||
|
@@ -2063,6 +2060,8 @@ static bool main_loop_should_exit(void)
|
||
|
pause_all_vcpus();
|
||
|
cpu_synchronize_all_states();
|
||
|
qemu_system_reset(VMRESET_SILENT);
|
||
|
+ notifier_list_notify(&wakeup_notifiers, &wakeup_reason);
|
||
|
+ wakeup_reason = QEMU_WAKEUP_REASON_NONE;
|
||
|
resume_all_vcpus();
|
||
|
monitor_protocol_event(QEVENT_WAKEUP, NULL);
|
||
|
}
|