From: Ed White <edmund.h.white@intel.com>
To: xen-devel@lists.xen.org
Cc: Ravi Sahita <ravi.sahita@intel.com>,
Wei Liu <wei.liu2@citrix.com>,
George Dunlap <george.dunlap@eu.citrix.com>,
Ian Jackson <ian.jackson@eu.citrix.com>, Tim Deegan <tim@xen.org>,
Jan Beulich <jbeulich@suse.com>,
Andrew Cooper <andrew.cooper3@citrix.com>,
tlengyel@novetta.com, Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: [PATCH v3 13/13] x86/altp2m: XSM hooks for altp2m HVM ops
Date: Wed, 1 Jul 2015 11:09:37 -0700 [thread overview]
Message-ID: <1435774177-6345-14-git-send-email-edmund.h.white@intel.com> (raw)
In-Reply-To: <1435774177-6345-1-git-send-email-edmund.h.white@intel.com>
From: Ravi Sahita <ravi.sahita@intel.com>
Signed-off-by: Ravi Sahita <ravi.sahita@intel.com>
---
tools/flask/policy/policy/modules/xen/xen.if | 4 +-
xen/arch/x86/hvm/hvm.c | 118 ++++++++++++++++-----------
xen/include/xsm/dummy.h | 12 +++
xen/include/xsm/xsm.h | 12 +++
xen/xsm/dummy.c | 2 +
xen/xsm/flask/hooks.c | 12 +++
xen/xsm/flask/policy/access_vectors | 7 ++
7 files changed, 119 insertions(+), 48 deletions(-)
diff --git a/tools/flask/policy/policy/modules/xen/xen.if b/tools/flask/policy/policy/modules/xen/xen.if
index f4cde11..6177fe9 100644
--- a/tools/flask/policy/policy/modules/xen/xen.if
+++ b/tools/flask/policy/policy/modules/xen/xen.if
@@ -8,7 +8,7 @@
define(`declare_domain_common', `
allow $1 $2:grant { query setup };
allow $1 $2:mmu { adjust physmap map_read map_write stat pinpage updatemp mmuext_op };
- allow $1 $2:hvm { getparam setparam };
+ allow $1 $2:hvm { getparam setparam altp2mhvm_op };
allow $1 $2:domain2 get_vnumainfo;
')
@@ -58,7 +58,7 @@ define(`create_domain_common', `
allow $1 $2:mmu { map_read map_write adjust memorymap physmap pinpage mmuext_op updatemp };
allow $1 $2:grant setup;
allow $1 $2:hvm { cacheattr getparam hvmctl irqlevel pciroute sethvmc
- setparam pcilevel trackdirtyvram nested };
+ setparam pcilevel trackdirtyvram nested altp2mhvm altp2mhvm_op };
')
# create_domain(priv, target)
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 92c123c..cc0c7b3 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -5891,6 +5891,9 @@ static int hvmop_set_param(
nestedhvm_vcpu_destroy(v);
break;
case HVM_PARAM_ALTP2MHVM:
+ rc = xsm_hvm_param_altp2mhvm(XSM_PRIV, d);
+ if ( rc )
+ break;
if ( a.value > 1 )
rc = -EINVAL;
if ( a.value &&
@@ -6471,12 +6474,15 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg)
if ( d == NULL )
return -ESRCH;
- rc = -EINVAL;
- if ( is_hvm_domain(d) && hvm_altp2m_supported() &&
- d->arch.hvm_domain.params[HVM_PARAM_ALTP2MHVM] )
+ if ( !(rc = xsm_hvm_altp2mhvm_op(XSM_TARGET, d)) )
{
- a.state = altp2m_active(d);
- rc = __copy_to_guest(arg, &a, 1) ? -EFAULT : 0;
+ rc = -EINVAL;
+ if ( is_hvm_domain(d) && hvm_altp2m_supported() &&
+ d->arch.hvm_domain.params[HVM_PARAM_ALTP2MHVM] )
+ {
+ a.state = altp2m_active(d);
+ rc = __copy_to_guest(arg, &a, 1) ? -EFAULT : 0;
+ }
}
rcu_unlock_domain(d);
@@ -6497,31 +6503,34 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg)
if ( d == NULL )
return -ESRCH;
- rc = -EINVAL;
- if ( is_hvm_domain(d) && hvm_altp2m_supported() &&
- d->arch.hvm_domain.params[HVM_PARAM_ALTP2MHVM] &&
- !nestedhvm_enabled(d) )
+ if ( !(rc = xsm_hvm_altp2mhvm_op(XSM_TARGET, d)) )
{
- ostate = d->arch.altp2m_active;
- d->arch.altp2m_active = !!a.state;
+ rc = -EINVAL;
+ if ( is_hvm_domain(d) && hvm_altp2m_supported() &&
+ d->arch.hvm_domain.params[HVM_PARAM_ALTP2MHVM] &&
+ !nestedhvm_enabled(d) )
+ {
+ ostate = d->arch.altp2m_active;
+ d->arch.altp2m_active = !!a.state;
- rc = 0;
+ rc = 0;
- /* If the alternate p2m state has changed, handle appropriately */
- if ( d->arch.altp2m_active != ostate )
- {
- if ( ostate || !(rc = p2m_init_altp2m_by_id(d, 0)) )
+ /* If the alternate p2m state has changed, handle appropriately */
+ if ( d->arch.altp2m_active != ostate )
{
- for_each_vcpu( d, v )
+ if ( ostate || !(rc = p2m_init_altp2m_by_id(d, 0)) )
{
- if ( !ostate )
- altp2m_vcpu_initialise(v);
- else
- altp2m_vcpu_destroy(v);
+ for_each_vcpu( d, v )
+ {
+ if ( !ostate )
+ altp2m_vcpu_initialise(v);
+ else
+ altp2m_vcpu_destroy(v);
+ }
+
+ if ( ostate )
+ p2m_flush_altp2m(d);
}
-
- if ( ostate )
- p2m_flush_altp2m(d);
}
}
}
@@ -6540,6 +6549,9 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg)
if ( copy_from_guest(&a, arg, 1) )
return -EFAULT;
+ if ( (rc = xsm_hvm_altp2mhvm_op(XSM_TARGET, curr_d)) )
+ return rc;
+
if ( !is_hvm_domain(curr_d) || !hvm_altp2m_supported() ||
!curr_d->arch.altp2m_active ||
gfn_x(vcpu_altp2m(curr).veinfo_gfn) != INVALID_GFN)
@@ -6568,11 +6580,14 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg)
if ( d == NULL )
return -ESRCH;
- rc = -EINVAL;
- if ( is_hvm_domain(d) && hvm_altp2m_supported() &&
- d->arch.altp2m_active &&
- !(rc = p2m_init_next_altp2m(d, &a.view)) )
- rc = __copy_to_guest(arg, &a, 1) ? -EFAULT : 0;
+ if ( !(rc = xsm_hvm_altp2mhvm_op(XSM_TARGET, d)) )
+ {
+ rc = -EINVAL;
+ if ( is_hvm_domain(d) && hvm_altp2m_supported() &&
+ d->arch.altp2m_active &&
+ !(rc = p2m_init_next_altp2m(d, &a.view)) )
+ rc = __copy_to_guest(arg, &a, 1) ? -EFAULT : 0;
+ }
rcu_unlock_domain(d);
break;
@@ -6590,10 +6605,13 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg)
if ( d == NULL )
return -ESRCH;
- rc = -EINVAL;
- if ( is_hvm_domain(d) && hvm_altp2m_supported() &&
- d->arch.altp2m_active )
- rc = p2m_destroy_altp2m_by_id(d, a.view);
+ if ( !(rc = xsm_hvm_altp2mhvm_op(XSM_TARGET, d)) )
+ {
+ rc = -EINVAL;
+ if ( is_hvm_domain(d) && hvm_altp2m_supported() &&
+ d->arch.altp2m_active )
+ rc = p2m_destroy_altp2m_by_id(d, a.view);
+ }
rcu_unlock_domain(d);
break;
@@ -6611,10 +6629,13 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg)
if ( d == NULL )
return -ESRCH;
- rc = -EINVAL;
- if ( is_hvm_domain(d) && hvm_altp2m_supported() &&
- d->arch.altp2m_active )
- rc = p2m_switch_domain_altp2m_by_id(d, a.view);
+ if ( !(rc = xsm_hvm_altp2mhvm_op(XSM_TARGET, d)) )
+ {
+ rc = -EINVAL;
+ if ( is_hvm_domain(d) && hvm_altp2m_supported() &&
+ d->arch.altp2m_active )
+ rc = p2m_switch_domain_altp2m_by_id(d, a.view);
+ }
rcu_unlock_domain(d);
break;
@@ -6631,11 +6652,13 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg)
d = rcu_lock_domain_by_any_id(a.domid);
if ( d == NULL )
return -ESRCH;
-
- rc = -EINVAL;
- if ( is_hvm_domain(d) && hvm_altp2m_supported() &&
- d->arch.altp2m_active )
- rc = p2m_set_altp2m_mem_access(d, a.view, _gfn(a.gfn), a.hvmmem_access);
+ if ( !(rc = xsm_hvm_altp2mhvm_op(XSM_TARGET, d)) )
+ {
+ rc = -EINVAL;
+ if ( is_hvm_domain(d) && hvm_altp2m_supported() &&
+ d->arch.altp2m_active )
+ rc = p2m_set_altp2m_mem_access(d, a.view, _gfn(a.gfn), a.hvmmem_access);
+ }
rcu_unlock_domain(d);
break;
@@ -6653,10 +6676,13 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg)
if ( d == NULL )
return -ESRCH;
- rc = -EINVAL;
- if ( is_hvm_domain(d) && hvm_altp2m_supported() &&
- d->arch.altp2m_active )
- rc = p2m_change_altp2m_gfn(d, a.view, _gfn(a.old_gfn), _gfn(a.new_gfn));
+ if ( !(rc = xsm_hvm_altp2mhvm_op(XSM_TARGET, d)) )
+ {
+ rc = -EINVAL;
+ if ( is_hvm_domain(d) && hvm_altp2m_supported() &&
+ d->arch.altp2m_active )
+ rc = p2m_change_altp2m_gfn(d, a.view, _gfn(a.old_gfn), _gfn(a.new_gfn));
+ }
rcu_unlock_domain(d);
break;
diff --git a/xen/include/xsm/dummy.h b/xen/include/xsm/dummy.h
index f044c0f..e0b561d 100644
--- a/xen/include/xsm/dummy.h
+++ b/xen/include/xsm/dummy.h
@@ -548,6 +548,18 @@ static XSM_INLINE int xsm_hvm_param_nested(XSM_DEFAULT_ARG struct domain *d)
return xsm_default_action(action, current->domain, d);
}
+static XSM_INLINE int xsm_hvm_param_altp2mhvm(XSM_DEFAULT_ARG struct domain *d)
+{
+ XSM_ASSERT_ACTION(XSM_PRIV);
+ return xsm_default_action(action, current->domain, d);
+}
+
+static XSM_INLINE int xsm_hvm_altp2mhvm_op(XSM_DEFAULT_ARG struct domain *d)
+{
+ XSM_ASSERT_ACTION(XSM_TARGET);
+ return xsm_default_action(action, current->domain, d);
+}
+
static XSM_INLINE int xsm_vm_event_control(XSM_DEFAULT_ARG struct domain *d, int mode, int op)
{
XSM_ASSERT_ACTION(XSM_PRIV);
diff --git a/xen/include/xsm/xsm.h b/xen/include/xsm/xsm.h
index c872d44..dc48d23 100644
--- a/xen/include/xsm/xsm.h
+++ b/xen/include/xsm/xsm.h
@@ -147,6 +147,8 @@ struct xsm_operations {
int (*hvm_param) (struct domain *d, unsigned long op);
int (*hvm_control) (struct domain *d, unsigned long op);
int (*hvm_param_nested) (struct domain *d);
+ int (*hvm_param_altp2mhvm) (struct domain *d);
+ int (*hvm_altp2mhvm_op) (struct domain *d);
int (*get_vnumainfo) (struct domain *d);
int (*vm_event_control) (struct domain *d, int mode, int op);
@@ -586,6 +588,16 @@ static inline int xsm_hvm_param_nested (xsm_default_t def, struct domain *d)
return xsm_ops->hvm_param_nested(d);
}
+static inline int xsm_hvm_param_altp2mhvm (xsm_default_t def, struct domain *d)
+{
+ return xsm_ops->hvm_param_altp2mhvm(d);
+}
+
+static inline int xsm_hvm_altp2mhvm_op (xsm_default_t def, struct domain *d)
+{
+ return xsm_ops->hvm_altp2mhvm_op(d);
+}
+
static inline int xsm_get_vnumainfo (xsm_default_t def, struct domain *d)
{
return xsm_ops->get_vnumainfo(d);
diff --git a/xen/xsm/dummy.c b/xen/xsm/dummy.c
index e84b0e4..3461d4f 100644
--- a/xen/xsm/dummy.c
+++ b/xen/xsm/dummy.c
@@ -116,6 +116,8 @@ void xsm_fixup_ops (struct xsm_operations *ops)
set_to_dummy_if_null(ops, hvm_param);
set_to_dummy_if_null(ops, hvm_control);
set_to_dummy_if_null(ops, hvm_param_nested);
+ set_to_dummy_if_null(ops, hvm_param_altp2mhvm);
+ set_to_dummy_if_null(ops, hvm_altp2mhvm_op);
set_to_dummy_if_null(ops, do_xsm_op);
#ifdef CONFIG_COMPAT
diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c
index 6e37d29..2b998c9 100644
--- a/xen/xsm/flask/hooks.c
+++ b/xen/xsm/flask/hooks.c
@@ -1170,6 +1170,16 @@ static int flask_hvm_param_nested(struct domain *d)
return current_has_perm(d, SECCLASS_HVM, HVM__NESTED);
}
+static int flask_hvm_param_altp2mhvm(struct domain *d)
+{
+ return current_has_perm(d, SECCLASS_HVM, HVM__ALTP2MHVM);
+}
+
+static int flask_hvm_altp2mhvm_op(struct domain *d)
+{
+ return current_has_perm(d, SECCLASS_HVM, HVM__ALTP2MHVM_OP);
+}
+
static int flask_vm_event_control(struct domain *d, int mode, int op)
{
return current_has_perm(d, SECCLASS_DOMAIN2, DOMAIN2__VM_EVENT);
@@ -1654,6 +1664,8 @@ static struct xsm_operations flask_ops = {
.hvm_param = flask_hvm_param,
.hvm_control = flask_hvm_param,
.hvm_param_nested = flask_hvm_param_nested,
+ .hvm_param_altp2mhvm = flask_hvm_param_altp2mhvm,
+ .hvm_altp2mhvm_op = flask_hvm_altp2mhvm_op,
.do_xsm_op = do_flask_op,
.get_vnumainfo = flask_get_vnumainfo,
diff --git a/xen/xsm/flask/policy/access_vectors b/xen/xsm/flask/policy/access_vectors
index 68284d5..d168de2 100644
--- a/xen/xsm/flask/policy/access_vectors
+++ b/xen/xsm/flask/policy/access_vectors
@@ -272,6 +272,13 @@ class hvm
share_mem
# HVMOP_set_param setting HVM_PARAM_NESTEDHVM
nested
+# HVMOP_set_param setting HVM_PARAM_ALTP2MHVM
+ altp2mhvm
+# HVMOP_altp2m_set_domain_state HVMOP_altp2m_get_domain_state
+# HVMOP_altp2m_vcpu_enable_notify HVMOP_altp2m_create_p2m
+# HVMOP_altp2m_destroy_p2m HVMOP_altp2m_switch_p2m
+# HVMOP_altp2m_set_mem_access HVMOP_altp2m_change_gfn
+ altp2mhvm_op
}
# Class event describes event channels. Interdomain event channels have their
--
1.9.1
next prev parent reply other threads:[~2015-07-01 18:09 UTC|newest]
Thread overview: 91+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-01 18:09 [PATCH v3 00/12] Alternate p2m: support multiple copies of host p2m Ed White
2015-07-01 18:09 ` [PATCH v3 01/13] common/domain: Helpers to pause a domain while in context Ed White
2015-07-01 18:09 ` [PATCH v3 02/13] VMX: VMFUNC and #VE definitions and detection Ed White
2015-07-06 17:16 ` George Dunlap
2015-07-07 18:58 ` Nakajima, Jun
2015-07-01 18:09 ` [PATCH v3 03/13] VMX: implement suppress #VE Ed White
2015-07-06 17:26 ` George Dunlap
2015-07-07 18:59 ` Nakajima, Jun
2015-07-09 13:01 ` Jan Beulich
2015-07-10 19:30 ` Sahita, Ravi
2015-07-13 7:40 ` Jan Beulich
2015-07-13 23:39 ` Sahita, Ravi
2015-07-14 11:18 ` George Dunlap
2015-07-01 18:09 ` [PATCH v3 04/13] x86/HVM: Hardware alternate p2m support detection Ed White
2015-07-01 18:09 ` [PATCH v3 05/13] x86/altp2m: basic data structures and support routines Ed White
2015-07-03 16:22 ` Andrew Cooper
2015-07-06 9:56 ` Jan Beulich
2015-07-06 16:52 ` Ed White
2015-07-06 16:40 ` Ed White
2015-07-06 16:50 ` Ian Jackson
2015-07-07 6:48 ` Coding style (was Re: [PATCH v3 05/13] x86/altp2m: basic data structures and support routines.) Jan Beulich
2015-07-07 6:31 ` [PATCH v3 05/13] x86/altp2m: basic data structures and support routines Jan Beulich
2015-07-07 15:04 ` George Dunlap
2015-07-07 15:22 ` Tim Deegan
2015-07-07 16:19 ` Ed White
2015-07-08 13:52 ` George Dunlap
2015-07-09 17:05 ` Sahita, Ravi
2015-07-10 16:35 ` George Dunlap
2015-07-10 22:11 ` Sahita, Ravi
2015-07-09 13:29 ` Jan Beulich
2015-07-10 21:48 ` Sahita, Ravi
2015-07-13 8:01 ` Jan Beulich
2015-07-14 0:01 ` Sahita, Ravi
2015-07-14 8:53 ` Jan Beulich
2015-07-16 8:48 ` Sahita, Ravi
2015-07-16 9:02 ` Jan Beulich
2015-07-17 22:39 ` Sahita, Ravi
2015-07-20 6:18 ` Jan Beulich
2015-07-21 5:04 ` Sahita, Ravi
2015-07-21 6:24 ` Jan Beulich
2015-07-14 11:34 ` George Dunlap
2015-07-09 15:58 ` George Dunlap
2015-07-01 18:09 ` [PATCH v3 06/13] VMX/altp2m: add code to support EPTP switching and #VE Ed White
2015-07-03 16:29 ` Andrew Cooper
2015-07-07 14:28 ` Wei Liu
2015-07-07 19:02 ` Nakajima, Jun
2015-07-01 18:09 ` [PATCH v3 07/13] VMX: add VMFUNC leaf 0 (EPTP switching) to emulator Ed White
2015-07-03 16:40 ` Andrew Cooper
2015-07-06 19:56 ` Sahita, Ravi
2015-07-07 7:31 ` Jan Beulich
2015-07-09 14:05 ` Jan Beulich
2015-07-01 18:09 ` [PATCH v3 08/13] x86/altp2m: add control of suppress_ve Ed White
2015-07-03 16:43 ` Andrew Cooper
2015-07-01 18:09 ` [PATCH v3 09/13] x86/altp2m: alternate p2m memory events Ed White
2015-07-01 18:29 ` Lengyel, Tamas
2015-07-03 16:46 ` Andrew Cooper
2015-07-07 15:18 ` George Dunlap
2015-07-01 18:09 ` [PATCH v3 10/13] x86/altp2m: add remaining support routines Ed White
2015-07-03 16:56 ` Andrew Cooper
2015-07-09 15:07 ` George Dunlap
2015-07-01 18:09 ` [PATCH v3 11/13] x86/altp2m: define and implement alternate p2m HVMOP types Ed White
2015-07-06 10:09 ` Andrew Cooper
2015-07-06 16:49 ` Ed White
2015-07-06 17:08 ` Ian Jackson
2015-07-06 18:27 ` Ed White
2015-07-06 23:40 ` Lengyel, Tamas
2015-07-07 7:46 ` Jan Beulich
2015-07-07 7:41 ` Jan Beulich
2015-07-07 7:39 ` Jan Beulich
2015-07-07 7:33 ` Jan Beulich
2015-07-07 20:10 ` Sahita, Ravi
2015-07-07 20:25 ` Andrew Cooper
2015-07-09 14:34 ` Jan Beulich
2015-07-01 18:09 ` [PATCH v3 12/13] x86/altp2m: Add altp2mhvm HVM domain parameter Ed White
2015-07-06 10:16 ` Andrew Cooper
2015-07-06 17:49 ` Wei Liu
2015-07-06 18:01 ` Ed White
2015-07-06 18:18 ` Wei Liu
2015-07-06 22:59 ` Ed White
2015-07-01 18:09 ` Ed White [this message]
2015-07-02 19:17 ` [PATCH v3 13/13] x86/altp2m: XSM hooks for altp2m HVM ops Daniel De Graaf
2015-07-06 9:50 ` [PATCH v3 00/12] Alternate p2m: support multiple copies of host p2m Jan Beulich
2015-07-06 11:25 ` Tim Deegan
2015-07-06 11:38 ` Jan Beulich
2015-07-08 18:35 ` Sahita, Ravi
2015-07-09 11:49 ` Wei Liu
2015-07-09 14:14 ` Jan Beulich
2015-07-09 16:13 ` Sahita, Ravi
2015-07-09 16:20 ` Ian Campbell
2015-07-09 16:21 ` Wei Liu
2015-07-09 16:42 ` George Dunlap
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=1435774177-6345-14-git-send-email-edmund.h.white@intel.com \
--to=edmund.h.white@intel.com \
--cc=andrew.cooper3@citrix.com \
--cc=dgdegra@tycho.nsa.gov \
--cc=george.dunlap@eu.citrix.com \
--cc=ian.jackson@eu.citrix.com \
--cc=jbeulich@suse.com \
--cc=ravi.sahita@intel.com \
--cc=tim@xen.org \
--cc=tlengyel@novetta.com \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xen.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).