Make them uniformly return EOPNOTSUPP when their dependent features are absent. Otherwise the compiler loses context and they might return ENOSYS instead.
debug_op, mem_sharing_op, p2m_audit and psr_alloc change behaviour and return EOPNOTSUPP when compiled out, rather than ENOSYS. While at it, remove the public headers from mem_sharing.h (forward declarations are fine) and add a missing xen/sched.h include (for complete struct domain definition). Signed-off-by: Alejandro Vallejo <[email protected]> --- v2: * Also cover p2m_audit * in mem_sharing.h, restrict the xen/sched.h inclusion to the ifdef. * bugfix: make psr handler correctly exit early when !IS_ENABLED(...PSR) --- xen/arch/x86/domctl.c | 33 +++++++++++++++----------- xen/arch/x86/include/asm/mem_sharing.h | 12 ++++++---- xen/arch/x86/include/asm/p2m.h | 10 ++++---- 3 files changed, 31 insertions(+), 24 deletions(-) diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c index d9521808dc..942f41c584 100644 --- a/xen/arch/x86/domctl.c +++ b/xen/arch/x86/domctl.c @@ -220,15 +220,15 @@ long arch_do_domctl( { case XEN_DOMCTL_shadow_op: -#ifdef CONFIG_PAGING + ret = -EOPNOTSUPP; + if ( !IS_ENABLED(CONFIG_PAGING) ) + break; + ret = paging_domctl(d, &domctl->u.shadow_op, u_domctl, 0); if ( ret == -ERESTART ) return hypercall_create_continuation( __HYPERVISOR_paging_domctl_cont, "h", u_domctl); copyback = true; -#else - ret = -EOPNOTSUPP; -#endif break; case XEN_DOMCTL_ioport_permission: @@ -842,11 +842,14 @@ long arch_do_domctl( } break; -#ifdef CONFIG_HVM case XEN_DOMCTL_debug_op: { struct vcpu *v; + ret = -EOPNOTSUPP; + if ( !IS_ENABLED(CONFIG_HVM) ) + break; + ret = -EINVAL; if ( (domctl->u.debug_op.vcpu >= d->max_vcpus) || ((v = d->vcpu[domctl->u.debug_op.vcpu]) == NULL) ) @@ -860,7 +863,6 @@ long arch_do_domctl( ret = hvm_debug_op(v, domctl->u.debug_op.op); break; } -#endif case XEN_DOMCTL_gdbsx_guestmemio: case XEN_DOMCTL_gdbsx_pausevcpu: @@ -1033,15 +1035,18 @@ long arch_do_domctl( break; } -#ifdef CONFIG_MEM_SHARING case XEN_DOMCTL_mem_sharing_op: + ret = -EOPNOTSUPP; + if ( !IS_ENABLED(CONFIG_MEM_SHARING) ) + break; + ret = mem_sharing_domctl(d, &domctl->u.mem_sharing_op); break; -#endif -#if P2M_AUDIT case XEN_DOMCTL_audit_p2m: - if ( d == currd ) + if ( !P2M_AUDIT ) + ret = -EOPNOTSUPP; + else if ( d == currd ) ret = -EPERM; else { @@ -1052,7 +1057,6 @@ long arch_do_domctl( copyback = true; } break; -#endif /* P2M_AUDIT */ case XEN_DOMCTL_set_broken_page_p2m: { @@ -1240,9 +1244,12 @@ long arch_do_domctl( break; case XEN_DOMCTL_psr_alloc: + ret = -EOPNOTSUPP; + if ( !IS_ENABLED(CONFIG_X86_PSR) ) + break; + switch ( domctl->u.psr_alloc.cmd ) { -#ifdef CONFIG_X86_PSR case XEN_DOMCTL_PSR_SET_L3_CBM: ret = psr_set_val(d, domctl->u.psr_alloc.target, domctl->u.psr_alloc.data, @@ -1305,8 +1312,6 @@ long arch_do_domctl( #undef domctl_psr_get_val -#endif /* CONFIG_X86_PSR */ - default: ret = -EOPNOTSUPP; break; diff --git a/xen/arch/x86/include/asm/mem_sharing.h b/xen/arch/x86/include/asm/mem_sharing.h index 040962f690..c66cc912db 100644 --- a/xen/arch/x86/include/asm/mem_sharing.h +++ b/xen/arch/x86/include/asm/mem_sharing.h @@ -9,10 +9,12 @@ #ifndef __MEM_SHARING_H__ #define __MEM_SHARING_H__ -#include <public/domctl.h> -#include <public/memory.h> +struct xen_domctl_mem_sharing_op; #ifdef CONFIG_MEM_SHARING +#include <xen/sched.h> + +struct xen_mem_sharing_op; #define mem_sharing_enabled(d) ((d)->arch.hvm.mem_sharing.enabled) @@ -92,8 +94,6 @@ int mem_sharing_fork_reset(struct domain *d, bool reset_state, int mem_sharing_notify_enomem(struct domain *d, unsigned long gfn, bool allow_sleep); int mem_sharing_memop(XEN_GUEST_HANDLE_PARAM(xen_mem_sharing_op_t) arg); -int mem_sharing_domctl(struct domain *d, - struct xen_domctl_mem_sharing_op *mec); /* * Scans the p2m and relinquishes any shared pages, destroying @@ -103,6 +103,7 @@ int mem_sharing_domctl(struct domain *d, int relinquish_shared_pages(struct domain *d); #else +struct domctl; #define mem_sharing_enabled(d) false @@ -147,4 +148,7 @@ static inline int mem_sharing_fork_reset(struct domain *d, bool reset_state, #endif +int mem_sharing_domctl(struct domain *d, + struct xen_domctl_mem_sharing_op *mec); + #endif /* __MEM_SHARING_H__ */ diff --git a/xen/arch/x86/include/asm/p2m.h b/xen/arch/x86/include/asm/p2m.h index 9016e88411..b2721f8c11 100644 --- a/xen/arch/x86/include/asm/p2m.h +++ b/xen/arch/x86/include/asm/p2m.h @@ -806,12 +806,10 @@ static inline void p2m_pt_init(struct p2m_domain *p2m) {} void *map_domain_gfn(struct p2m_domain *p2m, gfn_t gfn, mfn_t *mfn, p2m_query_t q, uint32_t *pfec); -#if P2M_AUDIT -extern void audit_p2m(struct domain *d, - uint64_t *orphans, - uint64_t *m2p_bad, - uint64_t *p2m_bad); -#endif /* P2M_AUDIT */ +void audit_p2m(struct domain *d, + uint64_t *orphans, + uint64_t *m2p_bad, + uint64_t *p2m_bad); /* Printouts */ #define P2M_PRINTK(f, a...) \ base-commit: 2fa468919c39aac189623b6c580ce4ff8592d799 -- 2.43.0
