|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] x86/p2m: change_entry_type_* hooks are HVM-only
commit 136234f0da018390c98d4353dfe2f2934b623106
Author: Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Mon May 3 15:27:56 2021 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Mon May 3 15:27:56 2021 +0200
x86/p2m: change_entry_type_* hooks are HVM-only
Exclude functions using them from !HVM builds, thus making it possible
to exclude the hooks as well. Also cover the already unused
memory_type_changed hook while inserting the #ifdef in the struct.
While no respective check was there, I can't see how
XEN_DOMCTL_set_broken_page_p2m could have been meant to work for PV the
way it is implemented. Restrict this operation to acting on HVM guests.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Acked-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
---
xen/arch/x86/domctl.c | 7 +++++--
xen/arch/x86/mm/p2m-pt.c | 8 ++++++++
xen/arch/x86/mm/p2m.c | 14 +++++++-------
xen/arch/x86/mm/paging.c | 2 ++
xen/include/asm-x86/p2m.h | 2 ++
5 files changed, 24 insertions(+), 9 deletions(-)
diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c
index e440bd021e..26a76d2be9 100644
--- a/xen/arch/x86/domctl.c
+++ b/xen/arch/x86/domctl.c
@@ -1080,9 +1080,12 @@ long arch_do_domctl(
{
p2m_type_t pt;
unsigned long pfn = domctl->u.set_broken_page_p2m.pfn;
- mfn_t mfn = get_gfn_query(d, pfn, &pt);
- if ( unlikely(!mfn_valid(mfn)) || unlikely(!p2m_is_ram(pt)) )
+ if ( !is_hvm_domain(d) )
+ return -EINVAL;
+
+ if ( unlikely(!mfn_valid(get_gfn_query(d, pfn, &pt))) ||
+ unlikely(!p2m_is_ram(pt)) )
ret = -EINVAL;
else
ret = p2m_change_type_one(d, pfn, pt, p2m_ram_broken);
diff --git a/xen/arch/x86/mm/p2m-pt.c b/xen/arch/x86/mm/p2m-pt.c
index f2afcf49a3..4a70ee4f19 100644
--- a/xen/arch/x86/mm/p2m-pt.c
+++ b/xen/arch/x86/mm/p2m-pt.c
@@ -324,6 +324,7 @@ p2m_next_level(struct p2m_domain *p2m, void **table,
return rc;
}
+#ifdef CONFIG_HVM
/*
* Mark (via clearing the U flag) as needing P2M type re-calculation all valid
* present entries at the targeted level for the passed in GFN range, which is
@@ -392,6 +393,7 @@ static int p2m_pt_set_recalc_range(struct p2m_domain *p2m,
return err;
}
+#endif /* CONFIG_HVM */
/*
* Handle possibly necessary P2M type re-calculation (U flag clear for a
@@ -930,6 +932,8 @@ pod_retry_l1:
return (p2m_is_valid(*t) || p2m_is_any_ram(*t)) ? mfn : INVALID_MFN;
}
+#ifdef CONFIG_HVM
+
static void p2m_pt_change_entry_type_global(struct p2m_domain *p2m,
p2m_type_t ot, p2m_type_t nt)
{
@@ -1011,6 +1015,8 @@ static int p2m_pt_change_entry_type_range(struct
p2m_domain *p2m,
return err;
}
+#endif /* CONFIG_HVM */
+
#if P2M_AUDIT
static long p2m_pt_audit_p2m(struct p2m_domain *p2m)
{
@@ -1168,8 +1174,10 @@ void p2m_pt_init(struct p2m_domain *p2m)
p2m->set_entry = p2m_pt_set_entry;
p2m->get_entry = p2m_pt_get_entry;
p2m->recalc = do_recalc;
+#ifdef CONFIG_HVM
p2m->change_entry_type_global = p2m_pt_change_entry_type_global;
p2m->change_entry_type_range = p2m_pt_change_entry_type_range;
+#endif
/* Still too early to use paging_mode_hap(). */
if ( hap_enabled(p2m->domain) )
diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
index 7c3a5c8570..bb3ac9c81e 100644
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -292,6 +292,8 @@ int p2m_is_logdirty_range(struct p2m_domain *p2m, unsigned
long start,
return 0;
}
+#ifdef CONFIG_HVM
+
static void change_entry_type_global(struct p2m_domain *p2m,
p2m_type_t ot, p2m_type_t nt)
{
@@ -316,7 +318,6 @@ void p2m_change_entry_type_global(struct domain *d,
change_entry_type_global(hostp2m, ot, nt);
-#ifdef CONFIG_HVM
if ( unlikely(altp2m_active(d)) )
{
unsigned int i;
@@ -331,12 +332,10 @@ void p2m_change_entry_type_global(struct domain *d,
p2m_unlock(altp2m);
}
}
-#endif
p2m_unlock(hostp2m);
}
-#ifdef CONFIG_HVM
/* There's already a memory_type_changed() in asm/mtrr.h. */
static void _memory_type_changed(struct p2m_domain *p2m)
{
@@ -369,7 +368,8 @@ void p2m_memory_type_changed(struct domain *d)
p2m_unlock(hostp2m);
}
-#endif
+
+#endif /* CONFIG_HVM */
int p2m_set_ioreq_server(struct domain *d,
unsigned int flags,
@@ -876,6 +876,7 @@ guest_physmap_add_page(struct domain *d, gfn_t gfn, mfn_t
mfn,
}
#ifdef CONFIG_HVM
+
int
guest_physmap_add_entry(struct domain *d, gfn_t gfn, mfn_t mfn,
unsigned int page_order, p2m_type_t t)
@@ -1024,7 +1025,6 @@ out:
return rc;
}
-#endif
/*
* Modify the p2m type of a single gfn from ot to nt.
@@ -1161,7 +1161,6 @@ void p2m_change_type_range(struct domain *d,
change_type_range(hostp2m, start, end, ot, nt);
-#ifdef CONFIG_HVM
if ( unlikely(altp2m_active(d)) )
{
unsigned int i;
@@ -1176,7 +1175,6 @@ void p2m_change_type_range(struct domain *d,
p2m_unlock(altp2m);
}
}
-#endif
hostp2m->defer_nested_flush = 0;
if ( nestedhvm_enabled(d) )
p2m_flush_nestedp2m(d);
@@ -1184,6 +1182,8 @@ void p2m_change_type_range(struct domain *d,
p2m_unlock(hostp2m);
}
+#endif /* CONFIG_HVM */
+
/*
* Finish p2m type change for gfns which are marked as need_recalc in a range.
* Uses the current p2m's max_mapped_pfn to further clip the invalidation
diff --git a/xen/arch/x86/mm/paging.c b/xen/arch/x86/mm/paging.c
index 8bc14df943..c304c24526 100644
--- a/xen/arch/x86/mm/paging.c
+++ b/xen/arch/x86/mm/paging.c
@@ -588,6 +588,7 @@ static int paging_log_dirty_op(struct domain *d,
return rv;
}
+#ifdef CONFIG_HVM
void paging_log_dirty_range(struct domain *d,
unsigned long begin_pfn,
unsigned long nr,
@@ -617,6 +618,7 @@ void paging_log_dirty_range(struct domain *d,
guest_flush_tlb_mask(d, d->dirty_cpumask);
}
+#endif
/*
* Callers must supply log_dirty_ops for the log dirty code to call. This
diff --git a/xen/include/asm-x86/p2m.h b/xen/include/asm-x86/p2m.h
index 6fadeed7bd..1084397ffe 100644
--- a/xen/include/asm-x86/p2m.h
+++ b/xen/include/asm-x86/p2m.h
@@ -264,6 +264,7 @@ struct p2m_domain {
void (*enable_hardware_log_dirty)(struct p2m_domain *p2m);
void (*disable_hardware_log_dirty)(struct p2m_domain *p2m);
void (*flush_hardware_cached_dirty)(struct p2m_domain *p2m);
+#ifdef CONFIG_HVM
void (*change_entry_type_global)(struct p2m_domain *p2m,
p2m_type_t ot,
p2m_type_t nt);
@@ -272,6 +273,7 @@ struct p2m_domain {
unsigned long first_gfn,
unsigned long last_gfn);
void (*memory_type_changed)(struct p2m_domain *p2m);
+#endif
void (*write_p2m_entry_pre)(struct domain *d,
unsigned long gfn,
l1_pgentry_t old,
--
generated by git-patchbot for /home/xen/git/xen.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |