[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Fix writable pagetables when a flush happens in a different
# 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |