summaryrefslogtreecommitdiff
path: root/xen/arch/x86/mm/hap/hap.c
diff options
context:
space:
mode:
Diffstat (limited to 'xen/arch/x86/mm/hap/hap.c')
-rw-r--r--xen/arch/x86/mm/hap/hap.c45
1 files changed, 4 insertions, 41 deletions
diff --git a/xen/arch/x86/mm/hap/hap.c b/xen/arch/x86/mm/hap/hap.c
index d1ad10003c..0fdb7d4a59 100644
--- a/xen/arch/x86/mm/hap/hap.c
+++ b/xen/arch/x86/mm/hap/hap.c
@@ -774,55 +774,18 @@ static void hap_update_paging_modes(struct vcpu *v)
put_gfn(d, cr3_gfn);
}
-static int
-hap_write_p2m_entry(struct p2m_domain *p2m, unsigned long gfn, l1_pgentry_t *p,
- l1_pgentry_t new, unsigned int level)
+static void
+hap_write_p2m_entry_post(struct p2m_domain *p2m, unsigned int oflags)
{
struct domain *d = p2m->domain;
- uint32_t old_flags;
- mfn_t omfn;
- int rc;
-
- /* We know always use the host p2m here, regardless if the vcpu
- * is in host or guest mode. The vcpu can be in guest mode by
- * a hypercall which passes a domain and chooses mostly the first
- * vcpu. */
-
- paging_lock(d);
- old_flags = l1e_get_flags(*p);
- omfn = l1e_get_mfn(*p);
-
- rc = p2m_entry_modify(p2m, p2m_flags_to_type(l1e_get_flags(new)),
- p2m_flags_to_type(old_flags), l1e_get_mfn(new),
- omfn, level);
- if ( rc )
- {
- paging_unlock(d);
- return rc;
- }
- safe_write_pte(p, new);
- if ( old_flags & _PAGE_PRESENT )
+ if ( oflags & _PAGE_PRESENT )
guest_flush_tlb_mask(d, d->dirty_cpumask);
-
- paging_unlock(d);
-
- if ( nestedhvm_enabled(d) && (old_flags & _PAGE_PRESENT) &&
- !p2m_get_hostp2m(d)->defer_nested_flush &&
- /*
- * We are replacing a valid entry so we need to flush nested p2ms,
- * unless the only change is an increase in access rights.
- */
- (!mfn_eq(omfn, l1e_get_mfn(new)) ||
- !perms_strictly_increased(old_flags, l1e_get_flags(new))) )
- p2m_flush_nestedp2m(d);
-
- return 0;
}
void hap_p2m_init(struct p2m_domain *p2m)
{
- p2m->write_p2m_entry = hap_write_p2m_entry;
+ p2m->write_p2m_entry_post = hap_write_p2m_entry_post;
}
static unsigned long hap_gva_to_gfn_real_mode(