mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
x86/domctl: Conditionalise x86 domctl using DCE rather than ifdef
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 <alejandro.garciavallejo@amd.com> Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
8173a23dd6
commit
5513bfd054
3 files changed
+29
-24
No files matched your search
+19
-14
@@ -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;
|
||||
|
||||
@@ -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 domain;
|
||||
|
||||
#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__ */
|
||||
@@ -806,12 +806,8 @@ 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...) \
|
||||
|
||||