x86: introduce CONFIG_ALTP2M Kconfig option

Add new option to make altp2m code inclusion optional.
Currently altp2m implemented for Intel EPT only, so option is dependant on VMX.
Also the prompt itself depends on EXPERT=y, so that option is available
for fine-tuning, if one want to play around with it.

Use this option instead of more generic CONFIG_HVM option.
That implies the possibility to build hvm code without altp2m support,
hence we need to declare altp2m routines for hvm code to compile successfully
(altp2m_vcpu_initialise(), altp2m_vcpu_destroy(), altp2m_vcpu_enable_ve())

Also guard altp2m routines, so that they can be disabled completely in the
build -- when target platform does not actually support altp2m
(AMD-V & ARM as of now).

Signed-off-by: Sergiy Kibrik <Sergiy_Kibrik@epam.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Sergiy Kibrik authored and Jan Beulich committed 2024-08-01 13:55:08 +02:00
1 parent 55c01d28f4
commit e96831ece8
5 files changed
+35 -8

No files matched your search

+11
View File
@@ -358,6 +358,17 @@ config REQUIRE_NX
was unavailable. However, if enabled, Xen will no longer boot on
any CPU which is lacking NX support.
config ALTP2M
bool "Alternate P2M support" if EXPERT
depends on INTEL_VMX
default y
help
Alternate-p2m allows a guest to manage multiple p2m guest physical
"memory views" (as opposed to a single p2m).
Useful for memory introspection.
If unsure, stay with defaults.
endmenu
source "common/Kconfig"
+4 -1
View File
@@ -7,7 +7,7 @@
#ifndef __ASM_X86_ALTP2M_H
#define __ASM_X86_ALTP2M_H
#ifdef CONFIG_HVM
#ifdef CONFIG_ALTP2M
#include <xen/types.h>
#include <xen/sched.h> /* for struct vcpu, struct domain */
@@ -39,6 +39,9 @@ static inline bool altp2m_active(const struct domain *d)
/* Only declaration is needed. DCE will optimise it out when linking. */
uint16_t altp2m_vcpu_idx(const struct vcpu *v);
void altp2m_vcpu_initialise(struct vcpu *v);
void altp2m_vcpu_destroy(struct vcpu *v);
int altp2m_vcpu_enable_ve(struct vcpu *v, gfn_t gfn);
void altp2m_vcpu_disable_ve(struct vcpu *v);
#endif
+1 -1
View File
@@ -670,7 +670,7 @@ static inline bool hvm_hap_supported(void)
/* returns true if hardware supports alternate p2m's */
static inline bool hvm_altp2m_supported(void)
{
return hvm_funcs.caps.altp2m;
return IS_ENABLED(CONFIG_ALTP2M) && hvm_funcs.caps.altp2m;
}
/* Returns true if we have the minimum hardware requirements for nested virt */
+18 -5
View File
@@ -577,7 +577,7 @@ static inline gfn_t mfn_to_gfn(const struct domain *d, mfn_t mfn)
return _gfn(mfn_x(mfn));
}
#ifdef CONFIG_HVM
#ifdef CONFIG_ALTP2M
#define AP2MGET_prepopulate true
#define AP2MGET_query false
@@ -589,6 +589,16 @@ static inline gfn_t mfn_to_gfn(const struct domain *d, mfn_t mfn)
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);
#else
static inline int _altp2m_get_effective_entry(struct p2m_domain *ap2m,
gfn_t gfn, mfn_t *mfn,
p2m_type_t *t, p2m_access_t *a)
{
ASSERT_UNREACHABLE();
return -EOPNOTSUPP;
}
#define altp2m_get_effective_entry(ap2m, gfn, mfn, t, a, prepopulate) \
_altp2m_get_effective_entry(ap2m, gfn, mfn, t, a)
#endif
/* Init the datastructures for later use by the p2m code */
@@ -914,9 +924,6 @@ static inline bool p2m_set_altp2m(struct vcpu *v, unsigned int idx)
/* Switch alternate p2m for a single vcpu */
bool p2m_switch_vcpu_altp2m_by_id(struct vcpu *v, unsigned int idx);
/* Check to see if vcpu should be switched to a different p2m. */
void p2m_altp2m_check(struct vcpu *v, uint16_t idx);
/* Flush all the alternate p2m's for a domain */
void p2m_flush_altp2m(struct domain *d);
@@ -952,9 +959,15 @@ int p2m_set_altp2m_view_visibility(struct domain *d, unsigned int altp2m_idx,
uint8_t visible);
#else /* !CONFIG_HVM */
struct p2m_domain *p2m_get_altp2m(struct vcpu *v);
static inline void p2m_altp2m_check(struct vcpu *v, uint16_t idx) {}
#endif /* CONFIG_HVM */
#ifdef CONFIG_ALTP2M
/* Check to see if vcpu should be switched to a different p2m. */
void p2m_altp2m_check(struct vcpu *v, uint16_t idx);
#else
static inline void p2m_altp2m_check(struct vcpu *v, uint16_t idx) {}
#endif
/* p2m access to IOMMU flags */
static inline unsigned int p2m_access_to_iommu_flags(p2m_access_t p2ma)
{
+1 -1
View File
@@ -1,7 +1,7 @@
obj-y += shadow/
obj-$(CONFIG_HVM) += hap/
obj-$(CONFIG_HVM) += altp2m.o
obj-$(CONFIG_ALTP2M) += altp2m.o
obj-$(CONFIG_HVM) += guest_walk_2.o guest_walk_3.o guest_walk_4.o
obj-$(CONFIG_SHADOW_PAGING) += guest_walk_4.o
obj-$(CONFIG_MEM_ACCESS) += mem_access.o
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.