|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] x86/p2m: {,un}map_mmio_regions() are HVM-only
commit a4d9fbc0d7b362d3a3d8790958178b2c9c6e2711
Author: Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Mon May 3 15:26:08 2021 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Mon May 3 15:26:08 2021 +0200
x86/p2m: {,un}map_mmio_regions() are HVM-only
Mirror the "translated" check the functions do to do_domctl(), allowing
the calls to be DCEd by the compiler. Add ASSERT_UNREACHABLE() to the
original checks.
Also arrange for {set,clear}_mmio_p2m_entry() and
{set,clear}_identity_p2m_entry() to respectively live next to each
other, such that clear_mmio_p2m_entry() can also be covered by the
#ifdef already covering set_mmio_p2m_entry().
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Acked-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
---
xen/arch/x86/mm/p2m.c | 106 ++++++++++++++++++++++++----------------------
xen/common/domctl.c | 3 ++
xen/include/asm-x86/p2m.h | 8 ++++
3 files changed, 67 insertions(+), 50 deletions(-)
diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
index 3e356418e1..e76d8c66d3 100644
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -1352,52 +1352,6 @@ int set_mmio_p2m_entry(struct domain *d, gfn_t gfn,
mfn_t mfn,
p2m_get_hostp2m(d)->default_access);
}
-#endif /* CONFIG_HVM */
-
-int set_identity_p2m_entry(struct domain *d, unsigned long gfn_l,
- p2m_access_t p2ma, unsigned int flag)
-{
- p2m_type_t p2mt;
- p2m_access_t a;
- gfn_t gfn = _gfn(gfn_l);
- mfn_t mfn;
- struct p2m_domain *p2m = p2m_get_hostp2m(d);
- int ret;
-
- if ( !paging_mode_translate(p2m->domain) )
- {
- if ( !is_iommu_enabled(d) )
- return 0;
- return iommu_legacy_map(d, _dfn(gfn_l), _mfn(gfn_l),
- 1ul << PAGE_ORDER_4K,
- IOMMUF_readable | IOMMUF_writable);
- }
-
- gfn_lock(p2m, gfn, 0);
-
- mfn = p2m->get_entry(p2m, gfn, &p2mt, &a, 0, NULL, NULL);
-
- if ( p2mt == p2m_invalid || p2mt == p2m_mmio_dm )
- ret = p2m_set_entry(p2m, gfn, _mfn(gfn_l), PAGE_ORDER_4K,
- p2m_mmio_direct, p2ma);
- else if ( mfn_x(mfn) == gfn_l && p2mt == p2m_mmio_direct && a == p2ma )
- ret = 0;
- else
- {
- if ( flag & XEN_DOMCTL_DEV_RDM_RELAXED )
- ret = 0;
- else
- ret = -EBUSY;
- printk(XENLOG_G_WARNING
- "Cannot setup identity map d%d:%lx,"
- " gfn already mapped to %lx.\n",
- d->domain_id, gfn_l, mfn_x(mfn));
- }
-
- gfn_unlock(p2m, gfn, 0);
- return ret;
-}
-
/*
* Returns:
* 0 for success
@@ -1447,6 +1401,52 @@ int clear_mmio_p2m_entry(struct domain *d, unsigned long
gfn_l, mfn_t mfn,
return rc;
}
+#endif /* CONFIG_HVM */
+
+int set_identity_p2m_entry(struct domain *d, unsigned long gfn_l,
+ p2m_access_t p2ma, unsigned int flag)
+{
+ p2m_type_t p2mt;
+ p2m_access_t a;
+ gfn_t gfn = _gfn(gfn_l);
+ mfn_t mfn;
+ struct p2m_domain *p2m = p2m_get_hostp2m(d);
+ int ret;
+
+ if ( !paging_mode_translate(p2m->domain) )
+ {
+ if ( !is_iommu_enabled(d) )
+ return 0;
+ return iommu_legacy_map(d, _dfn(gfn_l), _mfn(gfn_l),
+ 1ul << PAGE_ORDER_4K,
+ IOMMUF_readable | IOMMUF_writable);
+ }
+
+ gfn_lock(p2m, gfn, 0);
+
+ mfn = p2m->get_entry(p2m, gfn, &p2mt, &a, 0, NULL, NULL);
+
+ if ( p2mt == p2m_invalid || p2mt == p2m_mmio_dm )
+ ret = p2m_set_entry(p2m, gfn, _mfn(gfn_l), PAGE_ORDER_4K,
+ p2m_mmio_direct, p2ma);
+ else if ( mfn_x(mfn) == gfn_l && p2mt == p2m_mmio_direct && a == p2ma )
+ ret = 0;
+ else
+ {
+ if ( flag & XEN_DOMCTL_DEV_RDM_RELAXED )
+ ret = 0;
+ else
+ ret = -EBUSY;
+ printk(XENLOG_G_WARNING
+ "Cannot setup identity map d%d:%lx,"
+ " gfn already mapped to %lx.\n",
+ d->domain_id, gfn_l, mfn_x(mfn));
+ }
+
+ gfn_unlock(p2m, gfn, 0);
+ return ret;
+}
+
int clear_identity_p2m_entry(struct domain *d, unsigned long gfn_l)
{
p2m_type_t p2mt;
@@ -1892,6 +1892,8 @@ void *map_domain_gfn(struct p2m_domain *p2m, gfn_t gfn,
mfn_t *mfn,
return map_domain_page(*mfn);
}
+#ifdef CONFIG_HVM
+
static unsigned int mmio_order(const struct domain *d,
unsigned long start_fn, unsigned long nr)
{
@@ -1932,7 +1934,10 @@ int map_mmio_regions(struct domain *d,
unsigned int iter, order;
if ( !paging_mode_translate(d) )
- return 0;
+ {
+ ASSERT_UNREACHABLE();
+ return -EOPNOTSUPP;
+ }
for ( iter = i = 0; i < nr && iter < MAP_MMIO_MAX_ITER;
i += 1UL << order, ++iter )
@@ -1964,7 +1969,10 @@ int unmap_mmio_regions(struct domain *d,
unsigned int iter, order;
if ( !paging_mode_translate(d) )
- return 0;
+ {
+ ASSERT_UNREACHABLE();
+ return -EOPNOTSUPP;
+ }
for ( iter = i = 0; i < nr && iter < MAP_MMIO_MAX_ITER;
i += 1UL << order, ++iter )
@@ -1986,8 +1994,6 @@ int unmap_mmio_regions(struct domain *d,
return i == nr ? 0 : i ?: ret;
}
-#ifdef CONFIG_HVM
-
int altp2m_get_effective_entry(struct p2m_domain *ap2m, gfn_t gfn, mfn_t *mfn,
p2m_type_t *t, p2m_access_t *a,
bool prepopulate)
diff --git a/xen/common/domctl.c b/xen/common/domctl.c
index af044e2eda..ef202c2b8c 100644
--- a/xen/common/domctl.c
+++ b/xen/common/domctl.c
@@ -750,6 +750,9 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t)
u_domctl)
if ( ret )
break;
+ if ( !paging_mode_translate(d) )
+ break;
+
if ( add )
{
printk(XENLOG_G_DEBUG
diff --git a/xen/include/asm-x86/p2m.h b/xen/include/asm-x86/p2m.h
index 7d63f5787e..6fadeed7bd 100644
--- a/xen/include/asm-x86/p2m.h
+++ b/xen/include/asm-x86/p2m.h
@@ -658,11 +658,19 @@ int p2m_finish_type_change(struct domain *d,
int p2m_is_logdirty_range(struct p2m_domain *, unsigned long start,
unsigned long end);
+#ifdef CONFIG_HVM
/* Set mmio addresses in the p2m table (for pass-through) */
int set_mmio_p2m_entry(struct domain *d, gfn_t gfn, mfn_t mfn,
unsigned int order);
int clear_mmio_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn,
unsigned int order);
+#else
+static inline int clear_mmio_p2m_entry(struct domain *d, unsigned long gfn,
+ mfn_t mfn, unsigned int order)
+{
+ return -EIO;
+}
+#endif
/* Set identity addresses in the p2m table (for pass-through) */
int set_identity_p2m_entry(struct domain *d, unsigned long gfn,
--
generated by git-patchbot for /home/xen/git/xen.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |