mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
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@xensource.com>
This commit is contained in:
1 parent
f9a0cd1238
commit
c62fffdcdc
1 file changed
+19
-6
+19
-6
@@ -3023,12 +3023,25 @@ void ptwr_flush(struct domain *d, const int which)
|
||||
* 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.
|
||||
|
||||