* [PATCH v3 1/7] xen/x86: move declaration from mem_access.h to altp2m.h
2025-11-21 9:15 [PATCH v3 0/7] consolidate vm event subsystem Penny Zheng
@ 2025-11-21 9:15 ` Penny Zheng
2025-11-21 9:15 ` [PATCH v3 2/7] xen/xsm: wrap xsm_vm_event_control() with CONFIG_VM_EVENT Penny Zheng
` (4 subsequent siblings)
5 siblings, 0 replies; 12+ messages in thread
From: Penny Zheng @ 2025-11-21 9:15 UTC (permalink / raw)
To: xen-devel
Cc: ray.huang, grygorii_strashko, Penny Zheng, Jan Beulich,
Andrew Cooper, Roger Pau Monné, Tamas K Lengyel,
Alexandru Isaila, Petre Pircalabu, Jason Andryuk
Memory access and ALTP2M are two seperate features, and each could be
controlled via VM_EVENT or ALTP2M. In order to avoid implicit declaration
when ALTP2M=y and VM_EVENT=n on compiling hvm.o/altp2m.o, we move declaration
of the following functions from <asm/mem_access.h> to <asm/altp2m.h>:
- p2m_set_suppress_ve
- p2m_set_suppress_ve_multi
- p2m_get_suppress_ve
Potential error on altp2m.c also breaks Misra Rule 8.4.
Signed-off-by: Penny Zheng <Penny.Zheng@amd.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Jason Andryuk <jason.andryuk@amd.com>
---
xen/arch/x86/include/asm/altp2m.h | 10 ++++++++++
xen/arch/x86/include/asm/mem_access.h | 10 ----------
2 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/xen/arch/x86/include/asm/altp2m.h b/xen/arch/x86/include/asm/altp2m.h
index 8ecd74f363..9c1ac3cc26 100644
--- a/xen/arch/x86/include/asm/altp2m.h
+++ b/xen/arch/x86/include/asm/altp2m.h
@@ -46,6 +46,16 @@ 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);
+int p2m_set_suppress_ve(struct domain *d, gfn_t gfn, bool suppress_ve,
+ unsigned int altp2m_idx);
+
+struct xen_hvm_altp2m_suppress_ve_multi;
+int p2m_set_suppress_ve_multi(struct domain *d,
+ struct xen_hvm_altp2m_suppress_ve_multi *sve);
+
+int p2m_get_suppress_ve(struct domain *d, gfn_t gfn, bool *suppress_ve,
+ unsigned int altp2m_idx);
+
#else
static inline bool altp2m_is_eptp_valid(const struct domain *d,
diff --git a/xen/arch/x86/include/asm/mem_access.h b/xen/arch/x86/include/asm/mem_access.h
index 1a52a10322..257ed33de1 100644
--- a/xen/arch/x86/include/asm/mem_access.h
+++ b/xen/arch/x86/include/asm/mem_access.h
@@ -34,16 +34,6 @@ bool p2m_mem_access_emulate_check(struct vcpu *v,
/* Sanity check for mem_access hardware support */
bool p2m_mem_access_sanity_check(const struct domain *d);
-int p2m_set_suppress_ve(struct domain *d, gfn_t gfn, bool suppress_ve,
- unsigned int altp2m_idx);
-
-struct xen_hvm_altp2m_suppress_ve_multi;
-int p2m_set_suppress_ve_multi(struct domain *d,
- struct xen_hvm_altp2m_suppress_ve_multi *sve);
-
-int p2m_get_suppress_ve(struct domain *d, gfn_t gfn, bool *suppress_ve,
- unsigned int altp2m_idx);
-
#endif /*__ASM_X86_MEM_ACCESS_H__ */
/*
--
2.34.1
^ permalink raw reply related [flat|nested] 12+ messages in thread* [PATCH v3 2/7] xen/xsm: wrap xsm_vm_event_control() with CONFIG_VM_EVENT
2025-11-21 9:15 [PATCH v3 0/7] consolidate vm event subsystem Penny Zheng
2025-11-21 9:15 ` [PATCH v3 1/7] xen/x86: move declaration from mem_access.h to altp2m.h Penny Zheng
@ 2025-11-21 9:15 ` Penny Zheng
2025-11-25 14:57 ` Daniel P. Smith
2025-11-21 9:15 ` [PATCH v3 4/7] x86/monitor: wrap monitor_op under CONFIG_VM_EVENT Penny Zheng
` (3 subsequent siblings)
5 siblings, 1 reply; 12+ messages in thread
From: Penny Zheng @ 2025-11-21 9:15 UTC (permalink / raw)
To: xen-devel; +Cc: ray.huang, grygorii_strashko, Penny Zheng, Daniel P. Smith
Function xsm_vm_event_control() is only invoked under CONFIG_VM_EVENT, so
it shall be wrapped with it, otherwiae it will become unreachable when
VM_EVENT=n and hence violating Misra rule 2.1.
Signed-off-by: Penny Zheng <Penny.Zheng@amd.com>
---
v1 -> v3:
- new commit
---
xen/include/xsm/dummy.h | 2 +-
xen/include/xsm/xsm.h | 4 ++--
xen/xsm/dummy.c | 2 +-
xen/xsm/flask/hooks.c | 4 ++--
4 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/xen/include/xsm/dummy.h b/xen/include/xsm/dummy.h
index 12792c3a43..e801dbcdba 100644
--- a/xen/include/xsm/dummy.h
+++ b/xen/include/xsm/dummy.h
@@ -640,6 +640,7 @@ static XSM_INLINE int cf_check xsm_hvm_altp2mhvm_op(
}
}
+#ifdef CONFIG_VM_EVENT
static XSM_INLINE int cf_check xsm_vm_event_control(
XSM_DEFAULT_ARG struct domain *d, int mode, int op)
{
@@ -647,7 +648,6 @@ static XSM_INLINE int cf_check xsm_vm_event_control(
return xsm_default_action(action, current->domain, d);
}
-#ifdef CONFIG_VM_EVENT
static XSM_INLINE int cf_check xsm_mem_access(XSM_DEFAULT_ARG struct domain *d)
{
XSM_ASSERT_ACTION(XSM_DM_PRIV);
diff --git a/xen/include/xsm/xsm.h b/xen/include/xsm/xsm.h
index 9a23d2827c..d9e5c831f3 100644
--- a/xen/include/xsm/xsm.h
+++ b/xen/include/xsm/xsm.h
@@ -155,9 +155,9 @@ struct xsm_ops {
int (*hvm_altp2mhvm_op)(struct domain *d, uint64_t mode, uint32_t op);
int (*get_vnumainfo)(struct domain *d);
+#ifdef CONFIG_VM_EVENT
int (*vm_event_control)(struct domain *d, int mode, int op);
-#ifdef CONFIG_VM_EVENT
int (*mem_access)(struct domain *d);
#endif
@@ -649,13 +649,13 @@ static inline int xsm_get_vnumainfo(xsm_default_t def, struct domain *d)
return alternative_call(xsm_ops.get_vnumainfo, d);
}
+#ifdef CONFIG_VM_EVENT
static inline int xsm_vm_event_control(
xsm_default_t def, struct domain *d, int mode, int op)
{
return alternative_call(xsm_ops.vm_event_control, d, mode, op);
}
-#ifdef CONFIG_VM_EVENT
static inline int xsm_mem_access(xsm_default_t def, struct domain *d)
{
return alternative_call(xsm_ops.mem_access, d);
diff --git a/xen/xsm/dummy.c b/xen/xsm/dummy.c
index 8b7e01b506..96dc82ac2e 100644
--- a/xen/xsm/dummy.c
+++ b/xen/xsm/dummy.c
@@ -115,9 +115,9 @@ static const struct xsm_ops __initconst_cf_clobber dummy_ops = {
.remove_from_physmap = xsm_remove_from_physmap,
.map_gmfn_foreign = xsm_map_gmfn_foreign,
+#ifdef CONFIG_VM_EVENT
.vm_event_control = xsm_vm_event_control,
-#ifdef CONFIG_VM_EVENT
.mem_access = xsm_mem_access,
#endif
diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c
index b0308e1b26..9f3915617c 100644
--- a/xen/xsm/flask/hooks.c
+++ b/xen/xsm/flask/hooks.c
@@ -1365,12 +1365,12 @@ static int cf_check flask_hvm_altp2mhvm_op(struct domain *d, uint64_t mode, uint
return current_has_perm(d, SECCLASS_HVM, HVM__ALTP2MHVM_OP);
}
+#ifdef CONFIG_VM_EVENT
static int cf_check flask_vm_event_control(struct domain *d, int mode, int op)
{
return current_has_perm(d, SECCLASS_DOMAIN2, DOMAIN2__VM_EVENT);
}
-#ifdef CONFIG_VM_EVENT
static int cf_check flask_mem_access(struct domain *d)
{
return current_has_perm(d, SECCLASS_DOMAIN2, DOMAIN2__MEM_ACCESS);
@@ -1967,9 +1967,9 @@ static const struct xsm_ops __initconst_cf_clobber flask_ops = {
.do_xsm_op = do_flask_op,
.get_vnumainfo = flask_get_vnumainfo,
+#ifdef CONFIG_VM_EVENT
.vm_event_control = flask_vm_event_control,
-#ifdef CONFIG_VM_EVENT
.mem_access = flask_mem_access,
#endif
--
2.34.1
^ permalink raw reply related [flat|nested] 12+ messages in thread* Re: [PATCH v3 2/7] xen/xsm: wrap xsm_vm_event_control() with CONFIG_VM_EVENT
2025-11-21 9:15 ` [PATCH v3 2/7] xen/xsm: wrap xsm_vm_event_control() with CONFIG_VM_EVENT Penny Zheng
@ 2025-11-25 14:57 ` Daniel P. Smith
2025-11-25 15:01 ` Jan Beulich
0 siblings, 1 reply; 12+ messages in thread
From: Daniel P. Smith @ 2025-11-25 14:57 UTC (permalink / raw)
To: Penny Zheng, xen-devel; +Cc: ray.huang, grygorii_strashko
On 11/21/25 4:15 AM, Penny Zheng wrote:
> Function xsm_vm_event_control() is only invoked under CONFIG_VM_EVENT, so
> it shall be wrapped with it, otherwiae it will become unreachable when
otherwiae --> otherwise (maybe committer is willing to fix on commit?)
> VM_EVENT=n and hence violating Misra rule 2.1.
>
> Signed-off-by: Penny Zheng <Penny.Zheng@amd.com>
> ---
> v1 -> v3:
> - new commit
> ---
> xen/include/xsm/dummy.h | 2 +-
> xen/include/xsm/xsm.h | 4 ++--
> xen/xsm/dummy.c | 2 +-
> xen/xsm/flask/hooks.c | 4 ++--
> 4 files changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/xen/include/xsm/dummy.h b/xen/include/xsm/dummy.h
> index 12792c3a43..e801dbcdba 100644
> --- a/xen/include/xsm/dummy.h
> +++ b/xen/include/xsm/dummy.h
> @@ -640,6 +640,7 @@ static XSM_INLINE int cf_check xsm_hvm_altp2mhvm_op(
> }
> }
>
> +#ifdef CONFIG_VM_EVENT
> static XSM_INLINE int cf_check xsm_vm_event_control(
> XSM_DEFAULT_ARG struct domain *d, int mode, int op)
> {
> @@ -647,7 +648,6 @@ static XSM_INLINE int cf_check xsm_vm_event_control(
> return xsm_default_action(action, current->domain, d);
> }
>
> -#ifdef CONFIG_VM_EVENT
> static XSM_INLINE int cf_check xsm_mem_access(XSM_DEFAULT_ARG struct domain *d)
> {
> XSM_ASSERT_ACTION(XSM_DM_PRIV);
> diff --git a/xen/include/xsm/xsm.h b/xen/include/xsm/xsm.h
> index 9a23d2827c..d9e5c831f3 100644
> --- a/xen/include/xsm/xsm.h
> +++ b/xen/include/xsm/xsm.h
> @@ -155,9 +155,9 @@ struct xsm_ops {
> int (*hvm_altp2mhvm_op)(struct domain *d, uint64_t mode, uint32_t op);
> int (*get_vnumainfo)(struct domain *d);
>
> +#ifdef CONFIG_VM_EVENT
> int (*vm_event_control)(struct domain *d, int mode, int op);
>
> -#ifdef CONFIG_VM_EVENT
> int (*mem_access)(struct domain *d);
> #endif
>
> @@ -649,13 +649,13 @@ static inline int xsm_get_vnumainfo(xsm_default_t def, struct domain *d)
> return alternative_call(xsm_ops.get_vnumainfo, d);
> }
>
> +#ifdef CONFIG_VM_EVENT
> static inline int xsm_vm_event_control(
> xsm_default_t def, struct domain *d, int mode, int op)
> {
> return alternative_call(xsm_ops.vm_event_control, d, mode, op);
> }
>
> -#ifdef CONFIG_VM_EVENT
> static inline int xsm_mem_access(xsm_default_t def, struct domain *d)
> {
> return alternative_call(xsm_ops.mem_access, d);
> diff --git a/xen/xsm/dummy.c b/xen/xsm/dummy.c
> index 8b7e01b506..96dc82ac2e 100644
> --- a/xen/xsm/dummy.c
> +++ b/xen/xsm/dummy.c
> @@ -115,9 +115,9 @@ static const struct xsm_ops __initconst_cf_clobber dummy_ops = {
> .remove_from_physmap = xsm_remove_from_physmap,
> .map_gmfn_foreign = xsm_map_gmfn_foreign,
>
> +#ifdef CONFIG_VM_EVENT
> .vm_event_control = xsm_vm_event_control,
>
> -#ifdef CONFIG_VM_EVENT
> .mem_access = xsm_mem_access,
> #endif
>
> diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c
> index b0308e1b26..9f3915617c 100644
> --- a/xen/xsm/flask/hooks.c
> +++ b/xen/xsm/flask/hooks.c
> @@ -1365,12 +1365,12 @@ static int cf_check flask_hvm_altp2mhvm_op(struct domain *d, uint64_t mode, uint
> return current_has_perm(d, SECCLASS_HVM, HVM__ALTP2MHVM_OP);
> }
>
> +#ifdef CONFIG_VM_EVENT
> static int cf_check flask_vm_event_control(struct domain *d, int mode, int op)
> {
> return current_has_perm(d, SECCLASS_DOMAIN2, DOMAIN2__VM_EVENT);
> }
>
> -#ifdef CONFIG_VM_EVENT
> static int cf_check flask_mem_access(struct domain *d)
> {
> return current_has_perm(d, SECCLASS_DOMAIN2, DOMAIN2__MEM_ACCESS);
> @@ -1967,9 +1967,9 @@ static const struct xsm_ops __initconst_cf_clobber flask_ops = {
> .do_xsm_op = do_flask_op,
> .get_vnumainfo = flask_get_vnumainfo,
>
> +#ifdef CONFIG_VM_EVENT
> .vm_event_control = flask_vm_event_control,
>
> -#ifdef CONFIG_VM_EVENT
> .mem_access = flask_mem_access,
> #endif
>
Acked-by: Daniel P. Smith <dpsmith@apertussolutions.com>
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH v3 2/7] xen/xsm: wrap xsm_vm_event_control() with CONFIG_VM_EVENT
2025-11-25 14:57 ` Daniel P. Smith
@ 2025-11-25 15:01 ` Jan Beulich
0 siblings, 0 replies; 12+ messages in thread
From: Jan Beulich @ 2025-11-25 15:01 UTC (permalink / raw)
To: Daniel P. Smith; +Cc: ray.huang, grygorii_strashko, Penny Zheng, xen-devel
On 25.11.2025 15:57, Daniel P. Smith wrote:
> On 11/21/25 4:15 AM, Penny Zheng wrote:
>> Function xsm_vm_event_control() is only invoked under CONFIG_VM_EVENT, so
>> it shall be wrapped with it, otherwiae it will become unreachable when
>
> otherwiae --> otherwise (maybe committer is willing to fix on commit?)
Sure.
Jan
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v3 4/7] x86/monitor: wrap monitor_op under CONFIG_VM_EVENT
2025-11-21 9:15 [PATCH v3 0/7] consolidate vm event subsystem Penny Zheng
2025-11-21 9:15 ` [PATCH v3 1/7] xen/x86: move declaration from mem_access.h to altp2m.h Penny Zheng
2025-11-21 9:15 ` [PATCH v3 2/7] xen/xsm: wrap xsm_vm_event_control() with CONFIG_VM_EVENT Penny Zheng
@ 2025-11-21 9:15 ` Penny Zheng
2025-11-21 9:15 ` [PATCH v3 5/7] xen/p2m: move xenmem_access_to_p2m_access() to common p2m.c Penny Zheng
` (2 subsequent siblings)
5 siblings, 0 replies; 12+ messages in thread
From: Penny Zheng @ 2025-11-21 9:15 UTC (permalink / raw)
To: xen-devel
Cc: ray.huang, grygorii_strashko, Penny Zheng, Jan Beulich,
Andrew Cooper, Roger Pau Monné, Jason Andryuk,
Tamas K Lengyel, Alexandru Isaila, Petre Pircalabu
Feature monitor_op is based on vm event subsystem, so monitor.o shall be
wrapped under CONFIG_VM_EVENT.
The following functions are only invoked by monitor-op, so they all shall be
wrapped with CONFIG_VM_EVENT (otherwise they will become unreachable and
violate Misra rule 2.1 when VM_EVENT=n):
- hvm_enable_msr_interception
- hvm_function_table.enable_msr_interception
- hvm_has_set_descriptor_access_existing
- hvm_function_table.set_descriptor_access_existi
- arch_monitor_get_capabilities
Function monitored_msr() still needs a stub to pass compilation when
VM_EVENT=n.
Signed-off-by: Penny Zheng <Penny.Zheng@amd.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Jason Andryuk <jason.andryuk@amd.com>
---
xen/arch/x86/hvm/Makefile | 2 +-
xen/arch/x86/hvm/svm/svm.c | 8 +++++++-
xen/arch/x86/hvm/vmx/vmx.c | 10 ++++++++++
xen/arch/x86/include/asm/hvm/hvm.h | 18 +++++++++++-------
xen/arch/x86/include/asm/monitor.h | 9 +++++++++
5 files changed, 38 insertions(+), 9 deletions(-)
diff --git a/xen/arch/x86/hvm/Makefile b/xen/arch/x86/hvm/Makefile
index 6ec2c8f2db..50e0b6e63b 100644
--- a/xen/arch/x86/hvm/Makefile
+++ b/xen/arch/x86/hvm/Makefile
@@ -16,7 +16,7 @@ obj-y += io.o
obj-y += ioreq.o
obj-y += irq.o
obj-y += mmio.o
-obj-y += monitor.o
+obj-$(CONFIG_VM_EVENT) += monitor.o
obj-y += mtrr.o
obj-y += nestedhvm.o
obj-y += pmtimer.o
diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c
index e9d39f59a9..ce4fbbe488 100644
--- a/xen/arch/x86/hvm/svm/svm.c
+++ b/xen/arch/x86/hvm/svm/svm.c
@@ -299,6 +299,7 @@ void svm_intercept_msr(struct vcpu *v, uint32_t msr, int flags)
__clear_bit(msr * 2 + 1, msr_bit);
}
+#ifdef CONFIG_VM_EVENT
static void cf_check svm_enable_msr_interception(struct domain *d, uint32_t msr)
{
struct vcpu *v;
@@ -306,6 +307,7 @@ static void cf_check svm_enable_msr_interception(struct domain *d, uint32_t msr)
for_each_vcpu ( d, v )
svm_intercept_msr(v, msr, MSR_INTERCEPT_WRITE);
}
+#endif /* CONFIG_VM_EVENT */
static void svm_save_dr(struct vcpu *v)
{
@@ -826,6 +828,7 @@ static void cf_check svm_set_rdtsc_exiting(struct vcpu *v, bool enable)
vmcb_set_general2_intercepts(vmcb, general2_intercepts);
}
+#ifdef CONFIG_VM_EVENT
static void cf_check svm_set_descriptor_access_exiting(
struct vcpu *v, bool enable)
{
@@ -843,6 +846,7 @@ static void cf_check svm_set_descriptor_access_exiting(
vmcb_set_general1_intercepts(vmcb, general1_intercepts);
}
+#endif /* CONFIG_VM_EVENT */
static unsigned int cf_check svm_get_insn_bytes(struct vcpu *v, uint8_t *buf)
{
@@ -2457,9 +2461,11 @@ static struct hvm_function_table __initdata_cf_clobber svm_function_table = {
.fpu_dirty_intercept = svm_fpu_dirty_intercept,
.msr_read_intercept = svm_msr_read_intercept,
.msr_write_intercept = svm_msr_write_intercept,
+#ifdef CONFIG_VM_EVENT
.enable_msr_interception = svm_enable_msr_interception,
- .set_rdtsc_exiting = svm_set_rdtsc_exiting,
.set_descriptor_access_exiting = svm_set_descriptor_access_exiting,
+#endif
+ .set_rdtsc_exiting = svm_set_rdtsc_exiting,
.get_insn_bytes = svm_get_insn_bytes,
.nhvm_vcpu_initialise = nsvm_vcpu_initialise,
diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c
index 3ca18302e5..75e0ea8d52 100644
--- a/xen/arch/x86/hvm/vmx/vmx.c
+++ b/xen/arch/x86/hvm/vmx/vmx.c
@@ -1583,6 +1583,7 @@ static void cf_check vmx_set_rdtsc_exiting(struct vcpu *v, bool enable)
vmx_vmcs_exit(v);
}
+#ifdef CONFIG_VM_EVENT
static void cf_check vmx_set_descriptor_access_exiting(
struct vcpu *v, bool enable)
{
@@ -1597,6 +1598,7 @@ static void cf_check vmx_set_descriptor_access_exiting(
vmx_update_secondary_exec_control(v);
vmx_vmcs_exit(v);
}
+#endif /* CONFIG_VM_EVENT */
static void cf_check vmx_init_hypercall_page(void *p)
{
@@ -2476,6 +2478,7 @@ static void cf_check vmx_handle_eoi(uint8_t vector, int isr)
printk_once(XENLOG_WARNING "EOI for %02x but SVI=%02x\n", vector, old_svi);
}
+#ifdef CONFIG_VM_EVENT
static void cf_check vmx_enable_msr_interception(struct domain *d, uint32_t msr)
{
struct vcpu *v;
@@ -2483,6 +2486,7 @@ static void cf_check vmx_enable_msr_interception(struct domain *d, uint32_t msr)
for_each_vcpu ( d, v )
vmx_set_msr_intercept(v, msr, VMX_MSR_W);
}
+#endif /* CONFIG_VM_EVENT */
#ifdef CONFIG_ALTP2M
@@ -2934,7 +2938,9 @@ static struct hvm_function_table __initdata_cf_clobber vmx_function_table = {
.nhvm_domain_relinquish_resources = nvmx_domain_relinquish_resources,
.update_vlapic_mode = vmx_vlapic_msr_changed,
.nhvm_hap_walk_L1_p2m = nvmx_hap_walk_L1_p2m,
+#ifdef CONFIG_VM_EVENT
.enable_msr_interception = vmx_enable_msr_interception,
+#endif
#ifdef CONFIG_ALTP2M
.altp2m_vcpu_update_p2m = vmx_vcpu_update_eptp,
.altp2m_vcpu_update_vmfunc_ve = vmx_vcpu_update_vmfunc_ve,
@@ -3142,9 +3148,11 @@ const struct hvm_function_table * __init start_vmx(void)
vmx_function_table.caps.singlestep = cpu_has_monitor_trap_flag;
+#ifdef CONFIG_VM_EVENT
if ( cpu_has_vmx_dt_exiting )
vmx_function_table.set_descriptor_access_exiting =
vmx_set_descriptor_access_exiting;
+#endif
/*
* Do not enable EPT when (!cpu_has_vmx_pat), to prevent security hole
@@ -3215,8 +3223,10 @@ void __init vmx_fill_funcs(void)
if ( !cpu_has_xen_ibt )
return;
+#ifdef CONFIG_VM_EVENT
vmx_function_table.set_descriptor_access_exiting =
vmx_set_descriptor_access_exiting;
+#endif
vmx_function_table.update_eoi_exit_bitmap = vmx_update_eoi_exit_bitmap;
vmx_function_table.process_isr = vmx_process_isr;
diff --git a/xen/arch/x86/include/asm/hvm/hvm.h b/xen/arch/x86/include/asm/hvm/hvm.h
index 56ad63dc57..a513f47b7a 100644
--- a/xen/arch/x86/include/asm/hvm/hvm.h
+++ b/xen/arch/x86/include/asm/hvm/hvm.h
@@ -192,7 +192,11 @@ struct hvm_function_table {
void (*handle_cd)(struct vcpu *v, unsigned long value);
void (*set_info_guest)(struct vcpu *v);
void (*set_rdtsc_exiting)(struct vcpu *v, bool enable);
+
+#ifdef CONFIG_VM_EVENT
void (*set_descriptor_access_exiting)(struct vcpu *v, bool enable);
+ void (*enable_msr_interception)(struct domain *d, uint32_t msr);
+#endif
/* Nested HVM */
int (*nhvm_vcpu_initialise)(struct vcpu *v);
@@ -224,8 +228,6 @@ struct hvm_function_table {
paddr_t *L1_gpa, unsigned int *page_order,
uint8_t *p2m_acc, struct npfec npfec);
- void (*enable_msr_interception)(struct domain *d, uint32_t msr);
-
#ifdef CONFIG_ALTP2M
/* Alternate p2m */
void (*altp2m_vcpu_update_p2m)(struct vcpu *v);
@@ -435,11 +437,18 @@ static inline bool using_svm(void)
#define hvm_long_mode_active(v) (!!((v)->arch.hvm.guest_efer & EFER_LMA))
+#ifdef CONFIG_VM_EVENT
static inline bool hvm_has_set_descriptor_access_exiting(void)
{
return hvm_funcs.set_descriptor_access_exiting;
}
+static inline void hvm_enable_msr_interception(struct domain *d, uint32_t msr)
+{
+ alternative_vcall(hvm_funcs.enable_msr_interception, d, msr);
+}
+#endif /* CONFIG_VM_EVENT */
+
static inline void hvm_domain_creation_finished(struct domain *d)
{
if ( hvm_funcs.domain_creation_finished )
@@ -681,11 +690,6 @@ static inline int nhvm_hap_walk_L1_p2m(
v, L2_gpa, L1_gpa, page_order, p2m_acc, npfec);
}
-static inline void hvm_enable_msr_interception(struct domain *d, uint32_t msr)
-{
- alternative_vcall(hvm_funcs.enable_msr_interception, d, msr);
-}
-
static inline bool hvm_is_singlestep_supported(void)
{
return hvm_funcs.caps.singlestep;
diff --git a/xen/arch/x86/include/asm/monitor.h b/xen/arch/x86/include/asm/monitor.h
index 3c64d8258f..9249324fd0 100644
--- a/xen/arch/x86/include/asm/monitor.h
+++ b/xen/arch/x86/include/asm/monitor.h
@@ -71,6 +71,7 @@ int arch_monitor_domctl_op(struct domain *d, struct xen_domctl_monitor_op *mop)
return rc;
}
+#ifdef CONFIG_VM_EVENT
static inline uint32_t arch_monitor_get_capabilities(struct domain *d)
{
uint32_t capabilities = 0;
@@ -102,6 +103,7 @@ static inline uint32_t arch_monitor_get_capabilities(struct domain *d)
return capabilities;
}
+#endif /* CONFIG_VM_EVENT */
int arch_monitor_domctl_event(struct domain *d,
struct xen_domctl_monitor_op *mop);
@@ -123,7 +125,14 @@ static inline void arch_monitor_cleanup_domain(struct domain *d) {}
#endif
+#ifdef CONFIG_VM_EVENT
bool monitored_msr(const struct domain *d, u32 msr);
+#else
+static inline bool monitored_msr(const struct domain *d, u32 msr)
+{
+ return false;
+}
+#endif
bool monitored_msr_onchangeonly(const struct domain *d, u32 msr);
#endif /* __ASM_X86_MONITOR_H__ */
--
2.34.1
^ permalink raw reply related [flat|nested] 12+ messages in thread* [PATCH v3 5/7] xen/p2m: move xenmem_access_to_p2m_access() to common p2m.c
2025-11-21 9:15 [PATCH v3 0/7] consolidate vm event subsystem Penny Zheng
` (2 preceding siblings ...)
2025-11-21 9:15 ` [PATCH v3 4/7] x86/monitor: wrap monitor_op under CONFIG_VM_EVENT Penny Zheng
@ 2025-11-21 9:15 ` Penny Zheng
2025-11-24 14:01 ` Jan Beulich
2025-11-21 9:15 ` [PATCH v3 6/7] xen/mem_access: wrap memory access when VM_EVENT=n Penny Zheng
2025-11-21 9:15 ` [PATCH v3 7/7] xen/vm_event: consolidate CONFIG_VM_EVENT Penny Zheng
5 siblings, 1 reply; 12+ messages in thread
From: Penny Zheng @ 2025-11-21 9:15 UTC (permalink / raw)
To: xen-devel
Cc: ray.huang, grygorii_strashko, Penny Zheng, Tamas K Lengyel,
Alexandru Isaila, Petre Pircalabu, Jan Beulich, Andrew Cooper,
Roger Pau Monné, Anthony PERARD, Michal Orzel, Julien Grall,
Stefano Stabellini
Memory access and ALTP2M are two seperate features, while both depending on
helper xenmem_access_to_p2m_access(). So it betters lives in common p2m.c,
other than mem_access.c which will be compiled out when VM_EVENT=n && ALTP2M=y.
Guard xenmem_access_to_p2m_access() with VM_EVENT || ALTP2M, otherwise it
will become unreachable when both VM_EVENT=n and ALTP2M=n, and hence
violating Misra rule 2.1
We also need to move declaration from mem_access.h to p2m-common.h
An extra blank line is inserted after each case-block to correct coding
style at the same time.
Signed-off-by: Penny Zheng <Penny.Zheng@amd.com>
---
v1 -> v3:
- Guard xenmem_access_to_p2m_access() with VM_EVENT || ALTP2M
- Move declaration from mem_access.h to p2m-common.h
- refine commit message
---
xen/arch/x86/mm/mem_access.c | 36 --------------------------------
xen/arch/x86/mm/p2m.c | 40 ++++++++++++++++++++++++++++++++++++
xen/include/xen/mem_access.h | 5 -----
xen/include/xen/p2m-common.h | 3 +++
4 files changed, 43 insertions(+), 41 deletions(-)
diff --git a/xen/arch/x86/mm/mem_access.c b/xen/arch/x86/mm/mem_access.c
index e6b609064c..e55e53f44c 100644
--- a/xen/arch/x86/mm/mem_access.c
+++ b/xen/arch/x86/mm/mem_access.c
@@ -298,42 +298,6 @@ static int set_mem_access(struct domain *d, struct p2m_domain *p2m,
return rc;
}
-bool xenmem_access_to_p2m_access(const struct p2m_domain *p2m,
- xenmem_access_t xaccess,
- p2m_access_t *paccess)
-{
- static const p2m_access_t memaccess[] = {
-#define ACCESS(ac) [XENMEM_access_##ac] = p2m_access_##ac
- ACCESS(n),
- ACCESS(r),
- ACCESS(w),
- ACCESS(rw),
- ACCESS(x),
- ACCESS(rx),
- ACCESS(wx),
- ACCESS(rwx),
- ACCESS(rx2rw),
- ACCESS(n2rwx),
- ACCESS(r_pw),
-#undef ACCESS
- };
-
- switch ( xaccess )
- {
- case 0 ... ARRAY_SIZE(memaccess) - 1:
- xaccess = array_index_nospec(xaccess, ARRAY_SIZE(memaccess));
- *paccess = memaccess[xaccess];
- break;
- case XENMEM_access_default:
- *paccess = p2m->default_access;
- break;
- default:
- return false;
- }
-
- return true;
-}
-
/*
* Set access type for a region of gfns.
* If gfn == INVALID_GFN, sets the default access type.
diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
index e2a00a0efd..2763f9a6be 100644
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -2189,6 +2189,46 @@ void p2m_log_dirty_range(struct domain *d, unsigned long begin_pfn,
guest_flush_tlb_mask(d, d->dirty_cpumask);
}
+#if defined(CONFIG_VM_EVENT) || defined(CONFIG_ALTP2M)
+bool xenmem_access_to_p2m_access(const struct p2m_domain *p2m,
+ xenmem_access_t xaccess,
+ p2m_access_t *paccess)
+{
+ static const p2m_access_t memaccess[] = {
+#define ACCESS(ac) [XENMEM_access_##ac] = p2m_access_##ac
+ ACCESS(n),
+ ACCESS(r),
+ ACCESS(w),
+ ACCESS(rw),
+ ACCESS(x),
+ ACCESS(rx),
+ ACCESS(wx),
+ ACCESS(rwx),
+ ACCESS(rx2rw),
+ ACCESS(n2rwx),
+ ACCESS(r_pw),
+#undef ACCESS
+ };
+
+ switch ( xaccess )
+ {
+ case 0 ... ARRAY_SIZE(memaccess) - 1:
+ xaccess = array_index_nospec(xaccess, ARRAY_SIZE(memaccess));
+ *paccess = memaccess[xaccess];
+ break;
+
+ case XENMEM_access_default:
+ *paccess = p2m->default_access;
+ break;
+
+ default:
+ return false;
+ }
+
+ return true;
+}
+#endif /* VM_EVENT || ALTP2M */
+
/*
* Local variables:
* mode: C
diff --git a/xen/include/xen/mem_access.h b/xen/include/xen/mem_access.h
index 4de651038d..8e7d9ea2e3 100644
--- a/xen/include/xen/mem_access.h
+++ b/xen/include/xen/mem_access.h
@@ -73,11 +73,6 @@ typedef enum {
/* NOTE: Assumed to be only 4 bits right now on x86. */
} p2m_access_t;
-struct p2m_domain;
-bool xenmem_access_to_p2m_access(const struct p2m_domain *p2m,
- xenmem_access_t xaccess,
- p2m_access_t *paccess);
-
/*
* Set access type for a region of gfns.
* If gfn == INVALID_GFN, sets the default access type.
diff --git a/xen/include/xen/p2m-common.h b/xen/include/xen/p2m-common.h
index f0bd9a6b98..bd4169caee 100644
--- a/xen/include/xen/p2m-common.h
+++ b/xen/include/xen/p2m-common.h
@@ -43,5 +43,8 @@ int __must_check check_get_page_from_gfn(struct domain *d, gfn_t gfn,
bool readonly, p2m_type_t *p2mt_p,
struct page_info **page_p);
+bool xenmem_access_to_p2m_access(const struct p2m_domain *p2m,
+ xenmem_access_t xaccess,
+ p2m_access_t *paccess);
#endif /* _XEN_P2M_COMMON_H */
--
2.34.1
^ permalink raw reply related [flat|nested] 12+ messages in thread* Re: [PATCH v3 5/7] xen/p2m: move xenmem_access_to_p2m_access() to common p2m.c
2025-11-21 9:15 ` [PATCH v3 5/7] xen/p2m: move xenmem_access_to_p2m_access() to common p2m.c Penny Zheng
@ 2025-11-24 14:01 ` Jan Beulich
0 siblings, 0 replies; 12+ messages in thread
From: Jan Beulich @ 2025-11-24 14:01 UTC (permalink / raw)
To: Penny Zheng
Cc: ray.huang, grygorii_strashko, Tamas K Lengyel, Alexandru Isaila,
Petre Pircalabu, Andrew Cooper, Roger Pau Monné,
Anthony PERARD, Michal Orzel, Julien Grall, Stefano Stabellini,
xen-devel
On 21.11.2025 10:15, Penny Zheng wrote:
> Memory access and ALTP2M are two seperate features, while both depending on
> helper xenmem_access_to_p2m_access(). So it betters lives in common p2m.c,
> other than mem_access.c which will be compiled out when VM_EVENT=n && ALTP2M=y.
> Guard xenmem_access_to_p2m_access() with VM_EVENT || ALTP2M, otherwise it
> will become unreachable when both VM_EVENT=n and ALTP2M=n, and hence
> violating Misra rule 2.1
> We also need to move declaration from mem_access.h to p2m-common.h
> An extra blank line is inserted after each case-block to correct coding
> style at the same time.
>
> Signed-off-by: Penny Zheng <Penny.Zheng@amd.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v3 6/7] xen/mem_access: wrap memory access when VM_EVENT=n
2025-11-21 9:15 [PATCH v3 0/7] consolidate vm event subsystem Penny Zheng
` (3 preceding siblings ...)
2025-11-21 9:15 ` [PATCH v3 5/7] xen/p2m: move xenmem_access_to_p2m_access() to common p2m.c Penny Zheng
@ 2025-11-21 9:15 ` Penny Zheng
2025-11-24 14:09 ` Jan Beulich
2025-11-21 9:15 ` [PATCH v3 7/7] xen/vm_event: consolidate CONFIG_VM_EVENT Penny Zheng
5 siblings, 1 reply; 12+ messages in thread
From: Penny Zheng @ 2025-11-21 9:15 UTC (permalink / raw)
To: xen-devel
Cc: ray.huang, grygorii_strashko, Penny Zheng, Jan Beulich,
Andrew Cooper, Roger Pau Monné, Tamas K Lengyel,
Alexandru Isaila, Petre Pircalabu
Feature memory access is based on vm event subsystem, and it could be disabled
in the future. So a few switch-blocks in do_altp2m_op() need
vm_event_is_enabled() condition check to pass compilation when ALTP2M=y and
VM_EVENT=n(, hence MEM_ACCESS=n), like HVMOP_altp2m_set_mem_access, etc.
Function p2m_mem_access_check() still needs stub when VM_EVENT=n to
pass compilation.
Although local variable "req_ptr" still remains NULL throughout its lifetime,
with the change of NULL assignment, we will face runtime undefined error only
when CONFIG_USBAN is on. So we strengthen the condition check via adding
vm_event_is_enabled() for the special case.
Signed-off-by: Penny Zheng <Penny.Zheng@amd.com>
---
v1 -> v3:
- a comment next to the excessive condition
- use vm_event_is_enabled() instead
- avoid heavy churn by using the inverted condition plus break
---
xen/arch/x86/hvm/hvm.c | 25 ++++++++++++++++++++++++-
xen/arch/x86/include/asm/mem_access.h | 10 ++++++++++
2 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index aa14101241..8509b53585 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -52,6 +52,7 @@
#include <asm/i387.h>
#include <asm/mc146818rtc.h>
#include <asm/mce.h>
+#include <asm/mem_access.h>
#include <asm/monitor.h>
#include <asm/msr.h>
#include <asm/mtrr.h>
@@ -2080,7 +2081,11 @@ int hvm_hap_nested_page_fault(paddr_t gpa, unsigned long gla,
#endif
}
- if ( req_ptr )
+ /*
+ * Excessive condition is to avoid runtime undefined error only
+ * when CONFIG_USBAN=y
+ */
+ if ( req_ptr && vm_event_is_enabled(curr) )
{
if ( monitor_traps(curr, sync, req_ptr) < 0 )
rc = 0;
@@ -4802,6 +4807,12 @@ static int do_altp2m_op(
break;
case HVMOP_altp2m_set_mem_access:
+ if ( !vm_event_is_enabled(current) )
+ {
+ rc = -EOPNOTSUPP;
+ break;
+ }
+
if ( a.u.mem_access.pad )
rc = -EINVAL;
else
@@ -4811,6 +4822,12 @@ static int do_altp2m_op(
break;
case HVMOP_altp2m_set_mem_access_multi:
+ if ( !vm_event_is_enabled(current) )
+ {
+ rc = -EOPNOTSUPP;
+ break;
+ }
+
if ( a.u.set_mem_access_multi.pad ||
a.u.set_mem_access_multi.opaque > a.u.set_mem_access_multi.nr )
{
@@ -4842,6 +4859,12 @@ static int do_altp2m_op(
break;
case HVMOP_altp2m_get_mem_access:
+ if ( !vm_event_is_enabled(current) )
+ {
+ rc = -EOPNOTSUPP;
+ break;
+ }
+
if ( a.u.mem_access.pad )
rc = -EINVAL;
else
diff --git a/xen/arch/x86/include/asm/mem_access.h b/xen/arch/x86/include/asm/mem_access.h
index 257ed33de1..790bed81e8 100644
--- a/xen/arch/x86/include/asm/mem_access.h
+++ b/xen/arch/x86/include/asm/mem_access.h
@@ -14,6 +14,7 @@
#ifndef __ASM_X86_MEM_ACCESS_H__
#define __ASM_X86_MEM_ACCESS_H__
+#ifdef CONFIG_VM_EVENT
/*
* Setup vm_event request based on the access (gla is -1ull if not available).
* Handles the rw2rx conversion. Boolean return value indicates if event type
@@ -25,6 +26,15 @@
bool p2m_mem_access_check(paddr_t gpa, unsigned long gla,
struct npfec npfec,
struct vm_event_st **req_ptr);
+#else
+static inline bool p2m_mem_access_check(paddr_t gpa, unsigned long gla,
+ struct npfec npfec,
+ struct vm_event_st **req_ptr)
+{
+ *req_ptr = NULL;
+ return false;
+}
+#endif /* CONFIG_VM_EVENT */
/* Check for emulation and mark vcpu for skipping one instruction
* upon rescheduling if required. */
--
2.34.1
^ permalink raw reply related [flat|nested] 12+ messages in thread* Re: [PATCH v3 6/7] xen/mem_access: wrap memory access when VM_EVENT=n
2025-11-21 9:15 ` [PATCH v3 6/7] xen/mem_access: wrap memory access when VM_EVENT=n Penny Zheng
@ 2025-11-24 14:09 ` Jan Beulich
2025-12-01 3:46 ` Penny, Zheng
0 siblings, 1 reply; 12+ messages in thread
From: Jan Beulich @ 2025-11-24 14:09 UTC (permalink / raw)
To: Penny Zheng
Cc: ray.huang, grygorii_strashko, Andrew Cooper, Roger Pau Monné,
Tamas K Lengyel, Alexandru Isaila, Petre Pircalabu, xen-devel
On 21.11.2025 10:15, Penny Zheng wrote:
> @@ -2080,7 +2081,11 @@ int hvm_hap_nested_page_fault(paddr_t gpa, unsigned long gla,
> #endif
> }
>
> - if ( req_ptr )
> + /*
> + * Excessive condition is to avoid runtime undefined error only
> + * when CONFIG_USBAN=y
> + */
> + if ( req_ptr && vm_event_is_enabled(curr) )
> {
I fear the comment isn't really helpful this way. What's "excessive" here may
be clear from patch context, but it won't be clear when looking at the code
later. Nor would it then be immediately clear why the vm_event_is_enabled()
check is (seemingly) unnecessary. How about this:
"req_ptr being constant NULL when !CONFIG_VM_EVENT, CONFIG_UBSAN=y builds
have been observed to still hit undefined-ness at runtime. Hence do a
seemingly redundant vm_event_is_enabled() check here."
With this or any other suitable improvement to the comment:
Acked-by: Jan Beulich <jbeulich@suse.com>
If we want to go with the suggestion above, I'd be happy to do the replacement
while committing. But of course first the necessary 2nd ack will want
collecting.
Jan
^ permalink raw reply [flat|nested] 12+ messages in thread* RE: [PATCH v3 6/7] xen/mem_access: wrap memory access when VM_EVENT=n
2025-11-24 14:09 ` Jan Beulich
@ 2025-12-01 3:46 ` Penny, Zheng
0 siblings, 0 replies; 12+ messages in thread
From: Penny, Zheng @ 2025-12-01 3:46 UTC (permalink / raw)
To: Jan Beulich
Cc: Huang, Ray, grygorii_strashko@epam.com, Andrew Cooper,
Roger Pau Monné, Tamas K Lengyel, Alexandru Isaila,
Petre Pircalabu, xen-devel@lists.xenproject.org
[Public]
> -----Original Message-----
> From: Jan Beulich <jbeulich@suse.com>
> Sent: Monday, November 24, 2025 10:10 PM
> To: Penny, Zheng <penny.zheng@amd.com>
> Cc: Huang, Ray <Ray.Huang@amd.com>; grygorii_strashko@epam.com; Andrew
> Cooper <andrew.cooper3@citrix.com>; Roger Pau Monné <roger.pau@citrix.com>;
> Tamas K Lengyel <tamas@tklengyel.com>; Alexandru Isaila
> <aisaila@bitdefender.com>; Petre Pircalabu <ppircalabu@bitdefender.com>; xen-
> devel@lists.xenproject.org
> Subject: Re: [PATCH v3 6/7] xen/mem_access: wrap memory access when
> VM_EVENT=n
>
> On 21.11.2025 10:15, Penny Zheng wrote:
> > @@ -2080,7 +2081,11 @@ int hvm_hap_nested_page_fault(paddr_t gpa,
> > unsigned long gla, #endif
> > }
> >
> > - if ( req_ptr )
> > + /*
> > + * Excessive condition is to avoid runtime undefined error only
> > + * when CONFIG_USBAN=y
> > + */
> > + if ( req_ptr && vm_event_is_enabled(curr) )
> > {
>
> I fear the comment isn't really helpful this way. What's "excessive" here may be
> clear from patch context, but it won't be clear when looking at the code later. Nor
> would it then be immediately clear why the vm_event_is_enabled() check is
> (seemingly) unnecessary. How about this:
>
> "req_ptr being constant NULL when !CONFIG_VM_EVENT, CONFIG_UBSAN=y
> builds have been observed to still hit undefined-ness at runtime. Hence do a
> seemingly redundant vm_event_is_enabled() check here."
>
> With this or any other suitable improvement to the comment:
> Acked-by: Jan Beulich <jbeulich@suse.com> If we want to go with the suggestion
> above, I'd be happy to do the replacement while committing. But of course first the
> necessary 2nd ack will want collecting.
Thx!
>
> Jan
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v3 7/7] xen/vm_event: consolidate CONFIG_VM_EVENT
2025-11-21 9:15 [PATCH v3 0/7] consolidate vm event subsystem Penny Zheng
` (4 preceding siblings ...)
2025-11-21 9:15 ` [PATCH v3 6/7] xen/mem_access: wrap memory access when VM_EVENT=n Penny Zheng
@ 2025-11-21 9:15 ` Penny Zheng
5 siblings, 0 replies; 12+ messages in thread
From: Penny Zheng @ 2025-11-21 9:15 UTC (permalink / raw)
To: xen-devel
Cc: ray.huang, grygorii_strashko, Penny Zheng, Jan Beulich,
Andrew Cooper, Roger Pau Monné, Anthony PERARD, Michal Orzel,
Julien Grall, Stefano Stabellini, Tamas K Lengyel,
Alexandru Isaila, Petre Pircalabu, Jason Andryuk
File hvm/vm_event.c and x86/vm_event.c are the extend to vm_event handling
routines, and its compilation shall be guarded by CONFIG_VM_EVENT too.
Although CONFIG_VM_EVENT is right now forcibly enabled on x86 via
MEM_ACCESS_ALWAYS_ON, we could disable it through disabling
CONFIG_MGMT_HYPERCALLS later. So we remove MEM_ACCESS_ALWAYS_ON and
make VM_EVENT=y on default only on x86 to retain the same.
The following functions are developed on the basis of vm event framework, or
only invoked by vm_event.c, so they all shall be wrapped with CONFIG_VM_EVENT
(otherwise they will become unreachable and
violate Misra rule 2.1 when VM_EVENT=n):
- hvm_toggle_singlestep
- hvm_fast_singlestep
- hvm_emulate_one_vm_event
- hvmemul_write{,cmpxchg,rep_ins,rep_outs,rep_movs,rep_stos,read_io,write_io}_discard
And Function vm_event_check_ring() needs stub to pass compilation when
VM_EVENT=n.
Signed-off-by: Penny Zheng <Penny.Zheng@amd.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Jason Andryuk <jason.andryuk@amd.com>
---
As the last commit, plz be commited either in the last, or shall be commited
together with prereq commit 55d5245f85, 2edfe59bc1, 316aac242d, 690b46c23d,
and 0bbd6cebfd
---
xen/arch/x86/Makefile | 2 +-
xen/arch/x86/hvm/Kconfig | 1 -
xen/arch/x86/hvm/Makefile | 2 +-
xen/arch/x86/hvm/emulate.c | 58 ++++++++++++++++++++------------------
xen/arch/x86/hvm/hvm.c | 2 ++
xen/common/Kconfig | 7 ++---
xen/include/xen/vm_event.h | 7 +++++
7 files changed, 44 insertions(+), 35 deletions(-)
diff --git a/xen/arch/x86/Makefile b/xen/arch/x86/Makefile
index 407571c510..f71ca9f18b 100644
--- a/xen/arch/x86/Makefile
+++ b/xen/arch/x86/Makefile
@@ -75,7 +75,7 @@ obj-y += usercopy.o
obj-y += x86_emulate.o
obj-$(CONFIG_TBOOT) += tboot.o
obj-y += hpet.o
-obj-y += vm_event.o
+obj-$(CONFIG_VM_EVENT) += vm_event.o
obj-y += xstate.o
ifneq ($(CONFIG_PV_SHIM_EXCLUSIVE),y)
diff --git a/xen/arch/x86/hvm/Kconfig b/xen/arch/x86/hvm/Kconfig
index c323d767e7..31859deb97 100644
--- a/xen/arch/x86/hvm/Kconfig
+++ b/xen/arch/x86/hvm/Kconfig
@@ -4,7 +4,6 @@ menuconfig HVM
default !PV_SHIM
select COMPAT
select IOREQ_SERVER
- select MEM_ACCESS_ALWAYS_ON
help
Interfaces to support HVM domains. HVM domains require hardware
virtualisation extensions (e.g. Intel VT-x, AMD SVM), but can boot
diff --git a/xen/arch/x86/hvm/Makefile b/xen/arch/x86/hvm/Makefile
index 50e0b6e63b..952db00dd7 100644
--- a/xen/arch/x86/hvm/Makefile
+++ b/xen/arch/x86/hvm/Makefile
@@ -26,7 +26,7 @@ obj-y += save.o
obj-y += stdvga.o
obj-y += vioapic.o
obj-y += vlapic.o
-obj-y += vm_event.o
+obj-$(CONFIG_VM_EVENT) += vm_event.o
obj-y += vmsi.o
obj-y += vpic.o
obj-y += vpt.o
diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c
index fe75b0516d..d56ef02baf 100644
--- a/xen/arch/x86/hvm/emulate.c
+++ b/xen/arch/x86/hvm/emulate.c
@@ -1615,6 +1615,7 @@ static int cf_check hvmemul_blk(
return rc;
}
+#ifdef CONFIG_VM_EVENT
static int cf_check hvmemul_write_discard(
enum x86_segment seg,
unsigned long offset,
@@ -1717,6 +1718,7 @@ static int cf_check hvmemul_cache_op_discard(
{
return X86EMUL_OKAY;
}
+#endif /* CONFIG_VM_EVENT */
static int cf_check hvmemul_cmpxchg(
enum x86_segment seg,
@@ -2750,33 +2752,6 @@ static const struct x86_emulate_ops hvm_emulate_ops = {
.vmfunc = hvmemul_vmfunc,
};
-static const struct x86_emulate_ops hvm_emulate_ops_no_write = {
- .read = hvmemul_read,
- .insn_fetch = hvmemul_insn_fetch,
- .write = hvmemul_write_discard,
- .cmpxchg = hvmemul_cmpxchg_discard,
- .rep_ins = hvmemul_rep_ins_discard,
- .rep_outs = hvmemul_rep_outs_discard,
- .rep_movs = hvmemul_rep_movs_discard,
- .rep_stos = hvmemul_rep_stos_discard,
- .read_segment = hvmemul_read_segment,
- .write_segment = hvmemul_write_segment,
- .read_io = hvmemul_read_io_discard,
- .write_io = hvmemul_write_io_discard,
- .read_cr = hvmemul_read_cr,
- .write_cr = hvmemul_write_cr,
- .read_xcr = hvmemul_read_xcr,
- .write_xcr = hvmemul_write_xcr,
- .read_msr = hvmemul_read_msr,
- .write_msr = hvmemul_write_msr_discard,
- .cache_op = hvmemul_cache_op_discard,
- .tlb_op = hvmemul_tlb_op,
- .cpuid = x86emul_cpuid,
- .get_fpu = hvmemul_get_fpu,
- .put_fpu = hvmemul_put_fpu,
- .vmfunc = hvmemul_vmfunc,
-};
-
/*
* Note that passing VIO_no_completion into this function serves as kind
* of (but not fully) an "auto select completion" indicator. When there's
@@ -2887,6 +2862,34 @@ int hvm_emulate_one(
return _hvm_emulate_one(hvmemul_ctxt, &hvm_emulate_ops, completion);
}
+#ifdef CONFIG_VM_EVENT
+static const struct x86_emulate_ops hvm_emulate_ops_no_write = {
+ .read = hvmemul_read,
+ .insn_fetch = hvmemul_insn_fetch,
+ .write = hvmemul_write_discard,
+ .cmpxchg = hvmemul_cmpxchg_discard,
+ .rep_ins = hvmemul_rep_ins_discard,
+ .rep_outs = hvmemul_rep_outs_discard,
+ .rep_movs = hvmemul_rep_movs_discard,
+ .rep_stos = hvmemul_rep_stos_discard,
+ .read_segment = hvmemul_read_segment,
+ .write_segment = hvmemul_write_segment,
+ .read_io = hvmemul_read_io_discard,
+ .write_io = hvmemul_write_io_discard,
+ .read_cr = hvmemul_read_cr,
+ .write_cr = hvmemul_write_cr,
+ .read_xcr = hvmemul_read_xcr,
+ .write_xcr = hvmemul_write_xcr,
+ .read_msr = hvmemul_read_msr,
+ .write_msr = hvmemul_write_msr_discard,
+ .cache_op = hvmemul_cache_op_discard,
+ .tlb_op = hvmemul_tlb_op,
+ .cpuid = x86emul_cpuid,
+ .get_fpu = hvmemul_get_fpu,
+ .put_fpu = hvmemul_put_fpu,
+ .vmfunc = hvmemul_vmfunc,
+};
+
void hvm_emulate_one_vm_event(enum emul_kind kind, unsigned int trapnr,
unsigned int errcode)
{
@@ -2949,6 +2952,7 @@ void hvm_emulate_one_vm_event(enum emul_kind kind, unsigned int trapnr,
hvm_emulate_writeback(&ctx);
}
+#endif /* CONFIG_VM_EVENT */
void hvm_emulate_init_once(
struct hvm_emulate_ctxt *hvmemul_ctxt,
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 8509b53585..d03f563d76 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -5247,6 +5247,7 @@ int hvm_debug_op(struct vcpu *v, int32_t op)
return rc;
}
+#ifdef CONFIG_VM_EVENT
void hvm_toggle_singlestep(struct vcpu *v)
{
ASSERT(atomic_read(&v->pause_count));
@@ -5273,6 +5274,7 @@ void hvm_fast_singlestep(struct vcpu *v, uint16_t p2midx)
v->arch.hvm.fast_single_step.p2midx = p2midx;
}
#endif
+#endif /* CONFIG_VM_EVENT */
/*
* Segment caches in VMCB/VMCS are inconsistent about which bits are checked,
diff --git a/xen/common/Kconfig b/xen/common/Kconfig
index 401d5046f6..218ac3d549 100644
--- a/xen/common/Kconfig
+++ b/xen/common/Kconfig
@@ -173,13 +173,10 @@ config HAS_VMAP
config LIBFDT
bool
-config MEM_ACCESS_ALWAYS_ON
- bool
-
config VM_EVENT
- def_bool MEM_ACCESS_ALWAYS_ON
- prompt "Memory Access and VM events" if !MEM_ACCESS_ALWAYS_ON
+ bool "Memory Access and VM events"
depends on HVM
+ default X86
help
Framework to configure memory access types for guests and receive
diff --git a/xen/include/xen/vm_event.h b/xen/include/xen/vm_event.h
index 27d0c74216..1b76ce632e 100644
--- a/xen/include/xen/vm_event.h
+++ b/xen/include/xen/vm_event.h
@@ -51,7 +51,14 @@ struct vm_event_domain
};
/* Returns whether a ring has been set up */
+#ifdef CONFIG_VM_EVENT
bool vm_event_check_ring(struct vm_event_domain *ved);
+#else
+static inline bool vm_event_check_ring(struct vm_event_domain *ved)
+{
+ return false;
+}
+#endif /* CONFIG_VM_EVENT */
/* Returns 0 on success, -ENOSYS if there is no ring, -EBUSY if there is no
* available space and the caller is a foreign domain. If the guest itself
--
2.34.1
^ permalink raw reply related [flat|nested] 12+ messages in thread