|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2 04/14] x86/mm: split set_identity_p2m_entry() into PV and HVM parts
..., moving the former into the new physmap.c. Also call the new
functions directly from arch_iommu_hwdom_init() and
vpci_make_msix_hole(), as the PV/HVM split is explicit there.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: George Dunlap <george.dunlap@xxxxxxxxxx>
---
v2: Change arch_iommu_hwdom_init() and vpci_make_msix_hole().
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -1473,12 +1473,9 @@ static int clear_mmio_p2m_entry(struct d
return rc;
}
-#endif /* CONFIG_HVM */
-
-int set_identity_p2m_entry(struct domain *d, unsigned long gfn_l,
+int p2m_add_identity_entry(struct domain *d, unsigned long gfn_l,
p2m_access_t p2ma, unsigned int flag)
{
-#ifdef CONFIG_HVM
p2m_type_t p2mt;
p2m_access_t a;
gfn_t gfn = _gfn(gfn_l);
@@ -1488,13 +1485,8 @@ int set_identity_p2m_entry(struct domain
if ( !paging_mode_translate(d) )
{
-#endif
- if ( !is_iommu_enabled(d) )
- return 0;
- return iommu_legacy_map(d, _dfn(gfn_l), _mfn(gfn_l),
- 1ul << PAGE_ORDER_4K,
- p2m_access_to_iommu_flags(p2ma));
-#ifdef CONFIG_HVM
+ ASSERT_UNREACHABLE();
+ return -EPERM;
}
gfn_lock(p2m, gfn, 0);
@@ -1520,12 +1512,10 @@ int set_identity_p2m_entry(struct domain
gfn_unlock(p2m, gfn, 0);
return ret;
-#endif
}
-int clear_identity_p2m_entry(struct domain *d, unsigned long gfn_l)
+int p2m_remove_identity_entry(struct domain *d, unsigned long gfn_l)
{
-#ifdef CONFIG_HVM
p2m_type_t p2mt;
p2m_access_t a;
gfn_t gfn = _gfn(gfn_l);
@@ -1535,11 +1525,8 @@ int clear_identity_p2m_entry(struct doma
if ( !paging_mode_translate(d) )
{
-#endif
- if ( !is_iommu_enabled(d) )
- return 0;
- return iommu_legacy_unmap(d, _dfn(gfn_l), 1ul << PAGE_ORDER_4K);
-#ifdef CONFIG_HVM
+ ASSERT_UNREACHABLE();
+ return -EPERM;
}
gfn_lock(p2m, gfn, 0);
@@ -1561,7 +1548,6 @@ int clear_identity_p2m_entry(struct doma
}
return ret;
-#endif
}
#ifdef CONFIG_MEM_SHARING
@@ -1606,8 +1592,6 @@ int set_shared_p2m_entry(struct domain *
#endif /* CONFIG_MEM_SHARING */
-#ifdef CONFIG_HVM
-
static struct p2m_domain *
p2m_getlru_nestedp2m(struct domain *d, struct p2m_domain *p2m)
{
--- a/xen/arch/x86/mm/physmap.c
+++ b/xen/arch/x86/mm/physmap.c
@@ -21,6 +21,7 @@
* along with this program; If not, see <http://www.gnu.org/licenses/>.
*/
+#include <xen/iommu.h>
#include <asm/p2m.h>
#include "mm-locks.h"
@@ -75,6 +76,33 @@ guest_physmap_remove_page(struct domain
return p2m_remove_page(d, gfn, mfn, page_order);
}
+int set_identity_p2m_entry(struct domain *d, unsigned long gfn,
+ p2m_access_t p2ma, unsigned int flag)
+{
+ if ( !paging_mode_translate(d) )
+ {
+ if ( !is_iommu_enabled(d) )
+ return 0;
+ return iommu_legacy_map(d, _dfn(gfn), _mfn(gfn),
+ 1ul << PAGE_ORDER_4K,
+ p2m_access_to_iommu_flags(p2ma));
+ }
+
+ return p2m_add_identity_entry(d, gfn, p2ma, flag);
+}
+
+int clear_identity_p2m_entry(struct domain *d, unsigned long gfn)
+{
+ if ( !paging_mode_translate(d) )
+ {
+ if ( !is_iommu_enabled(d) )
+ return 0;
+ return iommu_legacy_unmap(d, _dfn(gfn), 1ul << PAGE_ORDER_4K);
+ }
+
+ return p2m_remove_identity_entry(d, gfn);
+}
+
/*
* Local variables:
* mode: C
--- a/xen/drivers/passthrough/x86/iommu.c
+++ b/xen/drivers/passthrough/x86/iommu.c
@@ -373,7 +373,7 @@ void __hwdom_init arch_iommu_hwdom_init(
if ( !hwdom_iommu_map(d, pfn, max_pfn) )
rc = 0;
else if ( paging_mode_translate(d) )
- rc = set_identity_p2m_entry(d, pfn, p2m_access_rw, 0);
+ rc = p2m_add_identity_entry(d, pfn, p2m_access_rw, 0);
else
rc = iommu_map(d, _dfn(pfn), _mfn(pfn), 1ul << PAGE_ORDER_4K,
IOMMUF_readable | IOMMUF_writable, &flush_flags);
--- a/xen/drivers/vpci/msix.c
+++ b/xen/drivers/vpci/msix.c
@@ -409,7 +409,7 @@ int vpci_make_msix_hole(const struct pci
case p2m_mmio_direct:
if ( mfn_x(mfn) == start )
{
- clear_identity_p2m_entry(d, start);
+ p2m_remove_identity_entry(d, start);
break;
}
/* fallthrough. */
--- a/xen/arch/x86/include/asm/p2m.h
+++ b/xen/arch/x86/include/asm/p2m.h
@@ -637,6 +637,10 @@ int set_mmio_p2m_entry(struct domain *d,
int set_identity_p2m_entry(struct domain *d, unsigned long gfn,
p2m_access_t p2ma, unsigned int flag);
int clear_identity_p2m_entry(struct domain *d, unsigned long gfn);
+/* HVM-only callers can use these directly: */
+int p2m_add_identity_entry(struct domain *d, unsigned long gfn,
+ p2m_access_t p2ma, unsigned int flag);
+int p2m_remove_identity_entry(struct domain *d, unsigned long gfn);
/*
* Populate-on-demand
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |