|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] x86/p2m: introduce p2m_is_special()
commit 0bf755e2c856628e11e93c76c3e12974e9964638
Author: Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Wed Aug 25 14:17:07 2021 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Wed Aug 25 14:17:07 2021 +0200
x86/p2m: introduce p2m_is_special()
Seeing the similarity of grant, foreign, and (subsequently) direct-MMIO
handling, introduce a new P2M type group named "special" (as in "needing
special accessors to create/destroy").
Also use -EPERM instead of other error codes on the two domain_crash()
paths touched.
This is part of XSA-378.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Paul Durrant <paul@xxxxxxx>
---
xen/arch/x86/mm/p2m.c | 15 +++++++--------
xen/include/asm-x86/p2m.h | 5 +++++
2 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
index b8bdd55cd2..0ca849ec77 100644
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -817,7 +817,7 @@ p2m_remove_page(struct p2m_domain *p2m, gfn_t gfn, mfn_t
mfn,
for ( i = 0; i < (1UL << page_order); i++ )
{
p2m->get_entry(p2m, gfn_add(gfn, i), &t, &a, 0, NULL, NULL);
- if ( !p2m_is_grant(t) && !p2m_is_shared(t) && !p2m_is_foreign(t) )
+ if ( !p2m_is_special(t) && !p2m_is_shared(t) )
set_gpfn_from_mfn(mfn_x(mfn) + i, INVALID_M2P_ENTRY);
}
}
@@ -954,13 +954,13 @@ guest_physmap_add_entry(struct domain *d, gfn_t gfn,
mfn_t mfn,
&ot, &a, 0, NULL, NULL);
ASSERT(!p2m_is_shared(ot));
}
- if ( p2m_is_grant(ot) || p2m_is_foreign(ot) )
+ if ( p2m_is_special(ot) )
{
- /* Really shouldn't be unmapping grant/foreign maps this way */
+ /* Don't permit unmapping grant/foreign this way. */
domain_crash(d);
p2m_unlock(p2m);
- return -EINVAL;
+ return -EPERM;
}
else if ( p2m_is_ram(ot) && !p2m_is_paged(ot) )
{
@@ -1053,8 +1053,7 @@ int p2m_change_type_one(struct domain *d, unsigned long
gfn_l,
struct p2m_domain *p2m = p2m_get_hostp2m(d);
int rc;
- BUG_ON(p2m_is_grant(ot) || p2m_is_grant(nt));
- BUG_ON(p2m_is_foreign(ot) || p2m_is_foreign(nt));
+ BUG_ON(p2m_is_special(ot) || p2m_is_special(nt));
gfn_lock(p2m, gfn, 0);
@@ -1300,11 +1299,11 @@ static int set_typed_p2m_entry(struct domain *d,
unsigned long gfn_l,
gfn_unlock(p2m, gfn, order);
return cur_order + 1;
}
- if ( p2m_is_grant(ot) || p2m_is_foreign(ot) )
+ if ( p2m_is_special(ot) )
{
gfn_unlock(p2m, gfn, order);
domain_crash(d);
- return -ENOENT;
+ return -EPERM;
}
else if ( p2m_is_ram(ot) )
{
diff --git a/xen/include/asm-x86/p2m.h b/xen/include/asm-x86/p2m.h
index b9e35d5e71..bf9967a023 100644
--- a/xen/include/asm-x86/p2m.h
+++ b/xen/include/asm-x86/p2m.h
@@ -154,6 +154,10 @@ typedef unsigned int p2m_query_t;
| p2m_to_mask(p2m_ram_logdirty) )
#define P2M_SHARED_TYPES (p2m_to_mask(p2m_ram_shared))
+/* Types established/cleaned up via special accessors. */
+#define P2M_SPECIAL_TYPES (P2M_GRANT_TYPES | \
+ p2m_to_mask(p2m_map_foreign))
+
/* Valid types not necessarily associated with a (valid) MFN. */
#define P2M_INVALID_MFN_TYPES (P2M_POD_TYPES \
| p2m_to_mask(p2m_mmio_direct) \
@@ -182,6 +186,7 @@ typedef unsigned int p2m_query_t;
#define p2m_is_paged(_t) (p2m_to_mask(_t) & P2M_PAGED_TYPES)
#define p2m_is_sharable(_t) (p2m_to_mask(_t) & P2M_SHARABLE_TYPES)
#define p2m_is_shared(_t) (p2m_to_mask(_t) & P2M_SHARED_TYPES)
+#define p2m_is_special(_t) (p2m_to_mask(_t) & P2M_SPECIAL_TYPES)
#define p2m_is_broken(_t) (p2m_to_mask(_t) & P2M_BROKEN_TYPES)
#define p2m_is_foreign(_t) (p2m_to_mask(_t) & p2m_to_mask(p2m_map_foreign))
--
generated by git-patchbot for /home/xen/git/xen.git#staging
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |