# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 0c5980d0bf20f3806a3aaaeb0e0bf87ac1671f38
# Parent 026e5ef0aa3c8e1af5d70ab01ca4cbeb9c72a64d
Fix writable pagetables when a flush happens in a different
domain, which is temporarily made to run on the wrong
pagetables.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
diff -r 026e5ef0aa3c -r 0c5980d0bf20 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Fri Jan 13 15:09:45 2006
+++ b/xen/arch/x86/mm.c Fri Jan 13 15:27:45 2006
@@ -3023,12 +3023,25 @@
* STEP 2. Validate any modified PTEs.
*/
- pl1e = map_domain_page(l1e_get_pfn(pte));
- modified = revalidate_l1(d, pl1e, d->arch.ptwr[which].page);
- unmap_domain_page(pl1e);
- perfc_incr_histo(wpt_updates, modified, PT_UPDATES);
- ptwr_eip_stat_update(d->arch.ptwr[which].eip, d->domain_id, modified);
- d->arch.ptwr[which].prev_nr_updates = modified;
+ if ( likely(d == current->domain) )
+ {
+ pl1e = map_domain_page(l1e_get_pfn(pte));
+ modified = revalidate_l1(d, pl1e, d->arch.ptwr[which].page);
+ unmap_domain_page(pl1e);
+ perfc_incr_histo(wpt_updates, modified, PT_UPDATES);
+ ptwr_eip_stat_update(d->arch.ptwr[which].eip, d->domain_id, modified);
+ d->arch.ptwr[which].prev_nr_updates = modified;
+ }
+ else
+ {
+ /*
+ * Must make a temporary global mapping, since we are running in the
+ * wrong address space, so no access to our own mapcache.
+ */
+ pl1e = map_domain_page_global(l1e_get_pfn(pte));
+ modified = revalidate_l1(d, pl1e, d->arch.ptwr[which].page);
+ unmap_domain_page_global(pl1e);
+ }
/*
* STEP 3. Reattach the L1 p.t. page into the current address space.
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|