From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, xen-devel@lists.xensource.com,
lenb@kernel.org, linux-acpi@vger.kernel.org, hpa@zytor.com,
x86@kernel.org
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [PATCH 4/4] xen/acpi: Prep saved_context cr3 values.
Date: Wed, 17 Oct 2012 09:49:46 -0400 [thread overview]
Message-ID: <1350481786-4969-5-git-send-email-konrad.wilk@oracle.com> (raw)
In-Reply-To: <1350481786-4969-1-git-send-email-konrad.wilk@oracle.com>
When save_processor_state is executed it executes a bunch of
pvops calls to save the CPU state values. When it comes back
from Xen's S3 (so acpi_enter_sleep_state, which ends up calling
xen_acpi_notify_hypervisor_state), it ends up back in the
assembler code in wakeup_[32|64].S. It skips the wakeup
calls (so wakeup_pmode_return and wakeup_long64) as that has
been done in the hypervisor. Instead it continues on in
the resume_point (64-bit) or ret_point (32-bit). Most of the
calls in there are safe to be executed except when it comes to
reloading of cr3 (which it only does on 64-bit kernels). Since
they are native assembler calls and Xen expects a PV kernel to
prep those to use machine address for cr3 that is what
we are going to do. Note: that it is not Machine Frame Numbers
(those are used in the MMUEXT_NEW_BASEPTR hypercall for cr3
installation) but the machine physical address.
When the assembler code executes this mov %ebx, cr3 it ends
end up trapped in the hypervisor (traps.c) which properly now
sets the cr3 value.
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
drivers/xen/acpi.c | 25 +++++++++++++++++++++++++
1 files changed, 25 insertions(+), 0 deletions(-)
diff --git a/drivers/xen/acpi.c b/drivers/xen/acpi.c
index 119d42a..25e612c 100644
--- a/drivers/xen/acpi.c
+++ b/drivers/xen/acpi.c
@@ -35,6 +35,13 @@
#include <asm/xen/hypercall.h>
#include <asm/xen/hypervisor.h>
+#include <xen/page.h>
+
+#ifdef CONFIG_X86_64
+#include <asm/suspend_64.h>
+extern struct saved_context saved_context;
+#endif
+
int xen_acpi_notify_hypervisor_state(u8 sleep_state,
u32 pm1a_cnt, u32 pm1b_cnt)
{
@@ -56,7 +63,25 @@ int xen_acpi_notify_hypervisor_state(u8 sleep_state,
pm1a_cnt, pm1b_cnt);
return -1;
}
+#ifdef CONFIG_X86_64
+ /* We do not need to anything for 32-bit kernels as the
+ * low-level calls (write to cr3) is done in the wakup code
+ * which we never execute when running under Xen.
+ */
+ {
+ unsigned long mfn;
+ /* resume_point in wakeup_64.s barrels through and does:
+ * movq saved_context_cr3(%rax), %rbx
+ * movq %rbx, %cr3
+ * so lets prep the values so they are OK with the
+ * hypervisor. */
+ mfn = pfn_to_mfn(PFN_DOWN(saved_context.cr3));
+ /* and back to a physical address */
+ mfn = PFN_PHYS(mfn);
+ saved_context.cr3 = mfn;
+ }
+#endif
HYPERVISOR_dom0_op(&op);
return 1;
}
--
1.7.7.6
next prev parent reply other threads:[~2012-10-17 13:49 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-17 13:49 [RFC] ACPI S3 and Xen (suprisingly small\!) Konrad Rzeszutek Wilk
2012-10-17 13:49 ` [PATCH 1/4] x86/wakeup/sleep: Check whether the TSS GDT descriptor is empty before using it Konrad Rzeszutek Wilk
2012-10-18 0:03 ` H. Peter Anvin
2012-10-18 14:47 ` Konrad Rzeszutek Wilk
2012-10-18 15:01 ` H. Peter Anvin
2013-01-17 14:41 ` Konrad Rzeszutek Wilk
2012-10-17 13:49 ` [PATCH 2/4] xen/lowlevel: Implement pvop call for load_idt (sidt) Konrad Rzeszutek Wilk
2012-10-17 23:51 ` H. Peter Anvin
2012-10-18 14:45 ` Konrad Rzeszutek Wilk
2012-10-18 15:02 ` H. Peter Anvin
2013-01-17 14:36 ` Konrad Rzeszutek Wilk
2012-10-17 13:49 ` [PATCH 3/4] xen/lowlevel: Implement pvop call for store_gdt (gidt) Konrad Rzeszutek Wilk
2012-10-17 13:49 ` Konrad Rzeszutek Wilk [this message]
2013-01-17 14:48 ` [PATCH 4/4] xen/acpi: Prep saved_context cr3 values Konrad Rzeszutek Wilk
2012-10-17 16:03 ` [RFC] ACPI S3 and Xen (suprisingly small\!) H. Peter Anvin
2012-10-17 16:10 ` Is: axe read_tscp pvops call. Was: " Konrad Rzeszutek Wilk
2012-10-17 16:39 ` Konrad Rzeszutek Wilk
2012-10-17 16:54 ` H. Peter Anvin
2012-10-17 16:50 ` H. Peter Anvin
2012-10-17 16:54 ` Konrad Rzeszutek Wilk
2012-10-17 17:35 ` H. Peter Anvin
2012-10-18 15:22 ` [Xen-devel] " Dan Magenheimer
2012-10-18 15:28 ` H. Peter Anvin
2012-10-18 15:56 ` Dan Magenheimer
2012-10-18 16:17 ` Borislav Petkov
2012-10-18 16:44 ` Stefano Stabellini
2012-10-18 17:04 ` H. Peter Anvin
2012-10-18 16:37 ` H. Peter Anvin
2012-10-19 15:48 ` Is: Xen architecture document. Was: " Konrad Rzeszutek Wilk
2012-10-19 17:45 ` H. Peter Anvin
2012-10-18 16:31 ` David Vrabel
2012-10-18 17:42 ` Konrad Rzeszutek Wilk
2012-10-18 18:02 ` David Vrabel
2012-10-17 17:46 ` Ben Guthro
2012-10-17 17:43 ` Konrad Rzeszutek Wilk
2012-10-17 18:00 ` Ben Guthro
2012-10-19 18:49 ` Konrad Rzeszutek Wilk
2012-10-20 1:23 ` Ben Guthro
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1350481786-4969-5-git-send-email-konrad.wilk@oracle.com \
--to=konrad.wilk@oracle.com \
--cc=hpa@zytor.com \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=x86@kernel.org \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).