mirror of
https://github.com/xen-project/xen.git
synced 2026-10-30 03:00:05 +01:00
x86: Fix ept and vt-d co-existence issue.
For vt-d's mmio address ranges, once ept enables, they should be added to ept page tables with p2m lock held, and then guest can access these ranges like conventional ram, but to change the ept entries, it should take the p2m lock first. Signed-off-by: Xiantao Zhang <xiantao.zhang@intel.com>
This commit is contained in:
1 parent
242a16c3d1
commit
c5ff46d8d4
2 files changed
+6
No files matched your search
@@ -524,6 +524,7 @@ void ept_change_entry_emt_with_range(struct domain *d, unsigned long start_gfn,
|
||||
mfn_t mfn;
|
||||
int order = 0;
|
||||
|
||||
p2m_lock(d->arch.p2m);
|
||||
for ( gfn = start_gfn; gfn <= end_gfn; gfn++ )
|
||||
{
|
||||
e = ept_get_entry_content(d, gfn);
|
||||
@@ -561,6 +562,7 @@ void ept_change_entry_emt_with_range(struct domain *d, unsigned long start_gfn,
|
||||
ept_set_entry(d, gfn, mfn, order, e.avail1);
|
||||
}
|
||||
}
|
||||
p2m_unlock(d->arch.p2m);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -2237,7 +2237,9 @@ set_mmio_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn)
|
||||
}
|
||||
|
||||
P2M_DEBUG("set mmio %lx %lx\n", gfn, mfn_x(mfn));
|
||||
p2m_lock(d->arch.p2m);
|
||||
rc = set_p2m_entry(d, gfn, mfn, 0, p2m_mmio_direct);
|
||||
p2m_unlock(d->arch.p2m);
|
||||
if ( 0 == rc )
|
||||
gdprintk(XENLOG_ERR,
|
||||
"set_mmio_p2m_entry: set_p2m_entry failed! mfn=%08lx\n",
|
||||
@@ -2261,7 +2263,9 @@ clear_mmio_p2m_entry(struct domain *d, unsigned long gfn)
|
||||
"clear_mmio_p2m_entry: gfn_to_mfn failed! gfn=%08lx\n", gfn);
|
||||
return 0;
|
||||
}
|
||||
p2m_lock(d->arch.p2m);
|
||||
rc = set_p2m_entry(d, gfn, _mfn(INVALID_MFN), 0, 0);
|
||||
p2m_unlock(d->arch.p2m);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||