[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] x86/altp2m: Allow setting the #VE info page for an arbitrary VCPU
The intended use-case of this patch is to allow either Dom0 or a control domain to activate #VE for an introspected guest, and not having to do this necessarily from an in-guest agent. Signed-off-by: Adrian Pop <apop@xxxxxxxxxxxxxxx> --- tools/libxc/xc_altp2m.c | 1 - xen/arch/x86/hvm/hvm.c | 47 +++++++++++++++++++++++++++++++++-------- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/tools/libxc/xc_altp2m.c b/tools/libxc/xc_altp2m.c index 1c9b572e2b..be5bfd28ed 100644 --- a/tools/libxc/xc_altp2m.c +++ b/tools/libxc/xc_altp2m.c @@ -68,7 +68,6 @@ int xc_altp2m_set_domain_state(xc_interface *handle, uint32_t dom, bool state) return rc; } -/* This is a bit odd to me that it acts on current.. */ int xc_altp2m_set_vcpu_enable_notify(xc_interface *handle, uint32_t domid, uint32_t vcpuid, xen_pfn_t gfn) { diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 4e318cede4..0157611384 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -4467,6 +4467,30 @@ static int hvmop_get_param( return rc; } +/* + * Find the struct vcpu given a dom_id and vcpu_id. + * Return NULL if not found. + */ +static struct vcpu *__get_vcpu(domid_t domain_id, uint32_t vcpu_id) +{ + struct domain *dom; + struct vcpu *v; + + dom = rcu_lock_domain_by_id(domain_id); + + for_each_vcpu( dom, v ) + { + if ( vcpu_id == v->vcpu_id ) + { + rcu_unlock_domain(dom); + return v; + } + } + + rcu_unlock_domain(dom); + return NULL; +} + static int do_altp2m_op( XEN_GUEST_HANDLE_PARAM(void) arg) { @@ -4504,8 +4528,7 @@ static int do_altp2m_op( return -EOPNOTSUPP; } - d = ( a.cmd != HVMOP_altp2m_vcpu_enable_notify ) ? - rcu_lock_domain_by_any_id(a.domain) : rcu_lock_current_domain(); + d = rcu_lock_domain_by_any_id(a.domain); if ( d == NULL ) return -ESRCH; @@ -4576,26 +4599,32 @@ static int do_altp2m_op( case HVMOP_altp2m_vcpu_enable_notify: { - struct vcpu *curr = current; + struct vcpu *v; p2m_type_t p2mt; - if ( a.u.enable_notify.pad || a.domain != DOMID_SELF || - a.u.enable_notify.vcpu_id != curr->vcpu_id ) + if ( a.u.enable_notify.pad ) { rc = -EINVAL; break; } - if ( !gfn_eq(vcpu_altp2m(curr).veinfo_gfn, INVALID_GFN) || - mfn_eq(get_gfn_query_unlocked(curr->domain, + v = __get_vcpu(a.domain, a.u.enable_notify.vcpu_id); + if ( !v ) + { + rc = -EFAULT; + break; + } + + if ( !gfn_eq(vcpu_altp2m(v).veinfo_gfn, INVALID_GFN) || + mfn_eq(get_gfn_query_unlocked(v->domain, a.u.enable_notify.gfn, &p2mt), INVALID_MFN) ) { rc = -EINVAL; break; } - vcpu_altp2m(curr).veinfo_gfn = _gfn(a.u.enable_notify.gfn); - altp2m_vcpu_update_vmfunc_ve(curr); + vcpu_altp2m(v).veinfo_gfn = _gfn(a.u.enable_notify.gfn); + altp2m_vcpu_update_vmfunc_ve(v); break; } -- 2.17.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |