From: Adrian Pop <apop@bitdefender.com>
To: xen-devel@lists.xenproject.org
Cc: Tamas K Lengyel <tamas@tklengyel.com>,
Wei Liu <wei.liu2@citrix.com>,
Razvan Cojocaru <rcojocaru@bitdefender.com>,
Adrian Pop <apop@bitdefender.com>,
George Dunlap <george.dunlap@eu.citrix.com>,
Andrew Cooper <andrew.cooper3@citrix.com>,
Ian Jackson <ian.jackson@eu.citrix.com>,
Jan Beulich <jbeulich@suse.com>
Subject: [PATCH 2/2] x86/altp2m: Add a hvmop for setting the suppress #VE bit
Date: Fri, 9 Jun 2017 19:51:54 +0300 [thread overview]
Message-ID: <20170609165154.23577-3-apop@bitdefender.com> (raw)
In-Reply-To: <20170609165154.23577-1-apop@bitdefender.com>
Introduce a new hvmop, HVMOP_altp2m_set_suppress_ve, which allows a
privileged domain to change the value of the #VE suppress bit for a
page.
Add a libxc wrapper for invoking this hvmop.
Signed-off-by: Adrian Pop <apop@bitdefender.com>
---
tools/libxc/include/xenctrl.h | 2 ++
tools/libxc/xc_altp2m.c | 24 +++++++++++++++++++
xen/arch/x86/hvm/hvm.c | 14 +++++++++++
xen/arch/x86/mm/mem_access.c | 52 +++++++++++++++++++++++++++++++++++++++++
xen/include/public/hvm/hvm_op.h | 15 ++++++++++++
xen/include/xen/mem_access.h | 3 +++
6 files changed, 110 insertions(+)
diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h
index 1629f412dd..f6ba8635bf 100644
--- a/tools/libxc/include/xenctrl.h
+++ b/tools/libxc/include/xenctrl.h
@@ -1926,6 +1926,8 @@ int xc_altp2m_destroy_view(xc_interface *handle, domid_t domid,
/* Switch all vCPUs of the domain to the specified altp2m view */
int xc_altp2m_switch_to_view(xc_interface *handle, domid_t domid,
uint16_t view_id);
+int xc_altp2m_set_suppress_ve(xc_interface *handle, domid_t domid,
+ uint16_t view_id, xen_pfn_t gfn, bool sve);
int xc_altp2m_set_mem_access(xc_interface *handle, domid_t domid,
uint16_t view_id, xen_pfn_t gfn,
xenmem_access_t access);
diff --git a/tools/libxc/xc_altp2m.c b/tools/libxc/xc_altp2m.c
index 0639632477..4710133918 100644
--- a/tools/libxc/xc_altp2m.c
+++ b/tools/libxc/xc_altp2m.c
@@ -163,6 +163,30 @@ int xc_altp2m_switch_to_view(xc_interface *handle, domid_t domid,
return rc;
}
+int xc_altp2m_set_suppress_ve(xc_interface *handle, domid_t domid,
+ uint16_t view_id, xen_pfn_t gfn, bool sve)
+{
+ int rc;
+ DECLARE_HYPERCALL_BUFFER(xen_hvm_altp2m_op_t, arg);
+
+ arg = xc_hypercall_buffer_alloc(handle, arg, sizeof(*arg));
+ if ( arg == NULL )
+ return -1;
+
+ arg->version = HVMOP_ALTP2M_INTERFACE_VERSION;
+ arg->cmd = HVMOP_altp2m_set_suppress_ve;
+ arg->domain = domid;
+ arg->u.set_suppress_ve.view = view_id;
+ arg->u.set_suppress_ve.gfn = gfn;
+ arg->u.set_suppress_ve.suppress_ve = sve;
+
+ rc = xencall2(handle->xcall, __HYPERVISOR_hvm_op, HVMOP_altp2m,
+ HYPERCALL_BUFFER_AS_ARG(arg));
+
+ xc_hypercall_buffer_free(handle, arg);
+ return rc;
+}
+
int xc_altp2m_set_mem_access(xc_interface *handle, domid_t domid,
uint16_t view_id, xen_pfn_t gfn,
xenmem_access_t access)
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 70ddc81d44..dd8e205551 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -4358,6 +4358,7 @@ static int do_altp2m_op(
case HVMOP_altp2m_destroy_p2m:
case HVMOP_altp2m_switch_p2m:
case HVMOP_altp2m_set_mem_access:
+ case HVMOP_altp2m_set_suppress_ve:
case HVMOP_altp2m_change_gfn:
break;
default:
@@ -4475,6 +4476,19 @@ static int do_altp2m_op(
a.u.set_mem_access.view);
break;
+ case HVMOP_altp2m_set_suppress_ve:
+ if ( a.u.set_suppress_ve.pad1 || a.u.set_suppress_ve.pad2 )
+ rc = -EINVAL;
+ else
+ {
+ gfn_t gfn = _gfn(a.u.set_mem_access.gfn);
+ unsigned int altp2m_idx = a.u.set_mem_access.view;
+ bool suppress_ve = a.u.set_suppress_ve.suppress_ve;
+
+ rc = p2m_set_suppress_ve(d, gfn, suppress_ve, altp2m_idx);
+ }
+ break;
+
case HVMOP_altp2m_change_gfn:
if ( a.u.change_gfn.pad1 || a.u.change_gfn.pad2 )
rc = -EINVAL;
diff --git a/xen/arch/x86/mm/mem_access.c b/xen/arch/x86/mm/mem_access.c
index d0b0767855..8c39db13e3 100644
--- a/xen/arch/x86/mm/mem_access.c
+++ b/xen/arch/x86/mm/mem_access.c
@@ -466,6 +466,58 @@ int p2m_get_mem_access(struct domain *d, gfn_t gfn, xenmem_access_t *access)
}
/*
+ * Set/clear the #VE suppress bit for a page. Only available on VMX.
+ */
+int p2m_set_suppress_ve(struct domain *d, gfn_t gfn, bool suppress_ve,
+ unsigned int altp2m_idx)
+{
+ struct p2m_domain *host_p2m = p2m_get_hostp2m(d);
+ struct p2m_domain *ap2m = NULL;
+ struct p2m_domain *p2m;
+ mfn_t mfn;
+ p2m_access_t a;
+ p2m_type_t t;
+ int rc;
+
+ if ( !cpu_has_vmx_virt_exceptions )
+ return -EOPNOTSUPP;
+
+ /* This subop should only be used from a privileged domain. */
+ if ( !current->domain->is_privileged )
+ return -EINVAL;
+
+ /* #VE should be enabled for this vcpu. */
+ if ( gfn_eq(vcpu_altp2m(current).veinfo_gfn, INVALID_GFN) )
+ return -EINVAL;
+
+ if ( altp2m_idx > 0 )
+ {
+ if ( altp2m_idx >= MAX_ALTP2M ||
+ d->arch.altp2m_eptp[altp2m_idx] == mfn_x(INVALID_MFN) )
+ return -EINVAL;
+
+ p2m = ap2m = d->arch.altp2m_p2m[altp2m_idx];
+ }
+ else
+ p2m = host_p2m;
+
+ gfn_lock(host_p2m, gfn, 0);
+ if ( ap2m )
+ p2m_lock(ap2m);
+
+ mfn = p2m->get_entry(p2m, gfn_x(gfn), &t, &a, 0, NULL, NULL);
+ if ( !mfn_valid(mfn) )
+ return -ESRCH;
+ rc = p2m->set_entry(p2m, gfn_x(gfn), mfn, PAGE_ORDER_4K, t, a,
+ suppress_ve);
+ if ( ap2m )
+ p2m_unlock(ap2m);
+ gfn_unlock(host_p2m, gfn, 0);
+
+ return rc;
+}
+
+/*
* Local variables:
* mode: C
* c-file-style: "BSD"
diff --git a/xen/include/public/hvm/hvm_op.h b/xen/include/public/hvm/hvm_op.h
index 0bdafdf59a..f0b3d8e4d3 100644
--- a/xen/include/public/hvm/hvm_op.h
+++ b/xen/include/public/hvm/hvm_op.h
@@ -237,6 +237,18 @@ struct xen_hvm_altp2m_set_mem_access {
typedef struct xen_hvm_altp2m_set_mem_access xen_hvm_altp2m_set_mem_access_t;
DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_set_mem_access_t);
+struct xen_hvm_altp2m_set_suppress_ve {
+ /* view */
+ uint16_t view;
+ uint8_t suppress_ve;
+ uint8_t pad1;
+ uint32_t pad2;
+ /* gfn */
+ uint64_t gfn;
+};
+typedef struct xen_hvm_altp2m_set_suppress_ve xen_hvm_altp2m_set_suppress_ve_t;
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_set_suppress_ve_t);
+
struct xen_hvm_altp2m_change_gfn {
/* view */
uint16_t view;
@@ -268,6 +280,8 @@ struct xen_hvm_altp2m_op {
#define HVMOP_altp2m_set_mem_access 7
/* Change a p2m entry to have a different gfn->mfn mapping */
#define HVMOP_altp2m_change_gfn 8
+/* Set the "Suppress #VE" bit on a page */
+#define HVMOP_altp2m_set_suppress_ve 9
domid_t domain;
uint16_t pad1;
uint32_t pad2;
@@ -276,6 +290,7 @@ struct xen_hvm_altp2m_op {
struct xen_hvm_altp2m_vcpu_enable_notify enable_notify;
struct xen_hvm_altp2m_view view;
struct xen_hvm_altp2m_set_mem_access set_mem_access;
+ struct xen_hvm_altp2m_set_suppress_ve set_suppress_ve;
struct xen_hvm_altp2m_change_gfn change_gfn;
uint8_t pad[64];
} u;
diff --git a/xen/include/xen/mem_access.h b/xen/include/xen/mem_access.h
index 5ab34c1553..0c6717d80f 100644
--- a/xen/include/xen/mem_access.h
+++ b/xen/include/xen/mem_access.h
@@ -78,6 +78,9 @@ long p2m_set_mem_access_multi(struct domain *d,
*/
int p2m_get_mem_access(struct domain *d, gfn_t gfn, xenmem_access_t *access);
+int p2m_set_suppress_ve(struct domain *d, gfn_t gfn, bool suppress_ve,
+ unsigned int altp2m_idx);
+
#ifdef CONFIG_HAS_MEM_ACCESS
int mem_access_memop(unsigned long cmd,
XEN_GUEST_HANDLE_PARAM(xen_mem_access_op_t) arg);
--
2.13.0
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel
next prev parent reply other threads:[~2017-06-09 16:52 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-09 16:51 [PATCH 0/2] x86: Add a hvmop for setting the #VE suppress bit Adrian Pop
2017-06-09 16:51 ` [PATCH 1/2] x86/mm: Change default value for suppress #VE in set_mem_access() Adrian Pop
2017-06-15 18:49 ` Tamas K Lengyel
2017-07-20 14:38 ` George Dunlap
2017-07-20 16:14 ` Tamas K Lengyel
2017-06-09 16:51 ` Adrian Pop [this message]
2017-06-12 15:51 ` [PATCH 2/2] x86/altp2m: Add a hvmop for setting the suppress #VE bit Wei Liu
2017-06-12 17:30 ` Adrian Pop
2017-06-20 10:29 ` Adrian Pop
2017-06-15 19:01 ` Tamas K Lengyel
2017-06-16 8:39 ` Jan Beulich
2017-06-22 12:04 ` Adrian Pop
2017-06-22 12:13 ` Jan Beulich
2017-06-22 13:16 ` Adrian Pop
2017-06-22 15:53 ` Adrian Pop
2017-06-22 13:17 ` Adrian Pop
2017-07-20 15:11 ` George Dunlap
2017-07-20 16:26 ` Tamas K Lengyel
2017-06-16 15:29 ` Jan Beulich
2017-06-20 10:28 ` Adrian Pop
2017-06-12 15:46 ` [PATCH v2 0/2] x86: Add a hvmop for setting the #VE suppress bit Adrian Pop
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170609165154.23577-3-apop@bitdefender.com \
--to=apop@bitdefender.com \
--cc=andrew.cooper3@citrix.com \
--cc=george.dunlap@eu.citrix.com \
--cc=ian.jackson@eu.citrix.com \
--cc=jbeulich@suse.com \
--cc=rcojocaru@bitdefender.com \
--cc=tamas@tklengyel.com \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.