From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ben Guthro Subject: [PATCH 2/2] xen/acpi/sleep: Register to the acpi_suspend_lowlevel a callback. Date: Tue, 14 May 2013 13:09:17 -0400 Message-ID: <1368551357-3903-3-git-send-email-benjamin.guthro@citrix.com> References: <1368551357-3903-1-git-send-email-benjamin.guthro@citrix.com> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from smtp.citrix.com ([66.165.176.89]:42439 "EHLO SMTP.CITRIX.COM" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757020Ab3ENRJe (ORCPT ); Tue, 14 May 2013 13:09:34 -0400 In-Reply-To: <1368551357-3903-1-git-send-email-benjamin.guthro@citrix.com> Sender: linux-acpi-owner@vger.kernel.org List-Id: linux-acpi@vger.kernel.org To: linux-kernel@vger.kernel.org, x86@kernel.org, linux-acpi@vger.kernel.org, xen-devel@lists.xensource.com Cc: Konrad Rzeszutek Wilk , Liang Tang From: Konrad Rzeszutek Wilk 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. It does that b/c during suspend it tries to save cr8 values (which the hypervisor does not support), and then on resume path the cr3, cr8, idt, and gdt are all resumed which clashes with what the hypervisor has set up for the guest. Signed-off-by: Liang Tang Signed-off-by: Konrad Rzeszutek Wilk Tested-by: Ben Guthro Acked-by: H. Peter Anvin --- include/xen/acpi.h | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/include/xen/acpi.h b/include/xen/acpi.h index 68d73d0..46aa3d1 100644 --- a/include/xen/acpi.h +++ b/include/xen/acpi.h @@ -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) -- 1.7.9.5