|
[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 |