1
0
Fork 0

xen / ACPI / sleep: Register an acpi_suspend_lowlevel callback.

We piggyback on "x86/acpi: Provide registration for acpi_suspend_lowlevel."
to register a Xen version of the callback. The callback does not
do anything special - except it omits the x86_acpi_suspend_lowlevel.

This is necessary b/c during suspend the generic code tries to write
cr3 values that clashes with what the hypervisor has set up for the guest.

Signed-off-by: Liang Tang <liang.tang@oracle.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Tested-by: Ben Guthro <benjamin.guthro@citrix.com>
Acked-by: H. Peter Anvin <hpa@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
hifive-unleashed-5.1
Konrad Rzeszutek Wilk 2013-05-14 17:46:12 +00:00 committed by Rafael J. Wysocki
parent d6a77ead21
commit 068e0dc7b7
1 changed files with 15 additions and 1 deletions

View File

@ -78,11 +78,25 @@ static inline int xen_acpi_get_pxm(acpi_handle h)
int xen_acpi_notify_hypervisor_state(u8 sleep_state,
u32 pm1a_cnt, u32 pm1b_cnd);
static inline int xen_acpi_suspend_lowlevel(void)
{
/*
* Xen will save and restore CPU context, so
* we can skip that and just go straight to
* the suspend.
*/
acpi_enter_sleep_state(ACPI_STATE_S3);
return 0;
}
static inline void xen_acpi_sleep_register(void)
{
if (xen_initial_domain())
if (xen_initial_domain()) {
acpi_os_set_prepare_sleep(
&xen_acpi_notify_hypervisor_state);
acpi_suspend_lowlevel = xen_acpi_suspend_lowlevel;
}
}
#else
static inline void xen_acpi_sleep_register(void)