|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 06/22] x86: map/unmap pages in restore_all_guests
From: Hongyan Xia <hongyxia@xxxxxxxxxx>
Before, it assumed the pv cr3 could be accessed via a direct map. This
is no longer true.
Note that we do not map and unmap root_pgt for now since it is still a
xenheap page.
Signed-off-by: Hongyan Xia <hongyxia@xxxxxxxxxx>
Signed-off-by: Julien Grall <jgrall@xxxxxxxxxx>
----
Changes since Hongyan's version:
* Remove the final dot in the commit title
---
xen/arch/x86/x86_64/entry.S | 27 ++++++++++++++++++++++++++-
1 file changed, 26 insertions(+), 1 deletion(-)
diff --git a/xen/arch/x86/x86_64/entry.S b/xen/arch/x86/x86_64/entry.S
index ae012851819a..b72abf923d9c 100644
--- a/xen/arch/x86/x86_64/entry.S
+++ b/xen/arch/x86/x86_64/entry.S
@@ -165,7 +165,24 @@ restore_all_guest:
and %rsi, %rdi
and %r9, %rsi
add %rcx, %rdi
- add %rcx, %rsi
+
+ /*
+ * Without a direct map, we have to map first before copying. We only
+ * need to map the guest root table but not the per-CPU root_pgt,
+ * because the latter is still a xenheap page.
+ */
+ pushq %r9
+ pushq %rdx
+ pushq %rax
+ pushq %rdi
+ mov %rsi, %rdi
+ shr $PAGE_SHIFT, %rdi
+ callq map_domain_page
+ mov %rax, %rsi
+ popq %rdi
+ /* Stash the pointer for unmapping later. */
+ pushq %rax
+
mov $ROOT_PAGETABLE_FIRST_XEN_SLOT, %ecx
mov root_table_offset(SH_LINEAR_PT_VIRT_START)*8(%rsi), %r8
mov %r8, root_table_offset(SH_LINEAR_PT_VIRT_START)*8(%rdi)
@@ -177,6 +194,14 @@ restore_all_guest:
sub $(ROOT_PAGETABLE_FIRST_XEN_SLOT - \
ROOT_PAGETABLE_LAST_XEN_SLOT - 1) * 8, %rdi
rep movsq
+
+ /* Unmap the page. */
+ popq %rdi
+ callq unmap_domain_page
+ popq %rax
+ popq %rdx
+ popq %r9
+
.Lrag_copy_done:
mov %r9, STACK_CPUINFO_FIELD(xen_cr3)(%rdx)
movb $1, STACK_CPUINFO_FIELD(use_pv_cr3)(%rdx)
--
2.38.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |