Add RMRR 1:1 IOMMU mappings to IOMMU page tables if EPT page table are not being
shared with the IOMMU.
This is a regression in behaviour versus Xen 4.5.
Signed-off-by: Malcolm Crossley <malcolm.crossley@xxxxxxxxxx>
---
xen/drivers/passthrough/vtd/iommu.c | 23 ++++++++++++++++++++---
1 file changed, 20 insertions(+), 3 deletions(-)
diff --git a/xen/drivers/passthrough/vtd/iommu.c
b/xen/drivers/passthrough/vtd/iommu.c
index 836aed5..89de741 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -1839,8 +1839,16 @@ static int rmrr_identity_mapping(struct domain *d,
bool_t map,
while ( base_pfn < end_pfn )
{
- if ( clear_identity_p2m_entry(d, base_pfn) )
- ret = -ENXIO;
+ if ( iommu_use_hap_pt(d) )
+ {
+ if ( clear_identity_p2m_entry(d, base_pfn) )
+ ret = -ENXIO;
+ }
+ else
+ {
+ if ( intel_iommu_unmap_page(d, base_pfn) )
+ ret = -ENXIO;
+ }
base_pfn++;
}
@@ -1855,7 +1863,16 @@ static int rmrr_identity_mapping(struct domain *d,
bool_t map,
while ( base_pfn < end_pfn )
{
- int err = set_identity_p2m_entry(d, base_pfn, p2m_access_rw, flag);
+ int err;
+ if ( iommu_use_hap_pt(d) )
+ {
+ err = set_identity_p2m_entry(d, base_pfn, p2m_access_rw, flag);
+ }
+ else
+ {
+ err = intel_iommu_map_page(d, base_pfn, base_pfn,
+ IOMMUF_readable|IOMMUF_writable);
+ }
if ( err )
return err;