|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC 6/9] x86/nested, xsm: add nested_hvm_op hypercall
Provides proxying to the host hypervisor for HVMOP_get_param and
HVMOP_set_param ops.
Signed-off-by: Christopher Clark <christopher.clark@xxxxxxxxxx>
---
tools/flask/policy/modules/dom0.te | 1 +
xen/arch/x86/guest/hypercall_page.S | 1 +
xen/arch/x86/guest/xen-nested.c | 42 +++++++++++++++++++++++++++++
xen/arch/x86/hypercall.c | 1 +
xen/arch/x86/pv/hypercall.c | 1 +
xen/include/public/xen.h | 1 +
xen/include/xen/hypercall.h | 4 +++
xen/include/xsm/dummy.h | 7 +++++
xen/include/xsm/xsm.h | 7 +++++
xen/xsm/dummy.c | 1 +
xen/xsm/flask/hooks.c | 22 +++++++++++++++
11 files changed, 88 insertions(+)
diff --git a/tools/flask/policy/modules/dom0.te
b/tools/flask/policy/modules/dom0.te
index 1f564ff83b..7d0f29f082 100644
--- a/tools/flask/policy/modules/dom0.te
+++ b/tools/flask/policy/modules/dom0.te
@@ -46,6 +46,7 @@ allow dom0_t dom0_t:resource { add remove };
# Allow dom0 to communicate with a nested Xen hypervisor
allow dom0_t nestedxen_t:version { xen_version xen_get_features };
allow dom0_t nestedxen_t:mmu physmap;
+allow dom0_t nestedxen_t:hvm { setparam getparam };
# These permissions allow using the FLASK security server to compute access
# checks locally, which could be used by a domain or service (such as xenstore)
diff --git a/xen/arch/x86/guest/hypercall_page.S
b/xen/arch/x86/guest/hypercall_page.S
index 1a8dd0ea4f..adbb82f4ec 100644
--- a/xen/arch/x86/guest/hypercall_page.S
+++ b/xen/arch/x86/guest/hypercall_page.S
@@ -62,6 +62,7 @@ DECLARE_HYPERCALL(argo_op)
DECLARE_HYPERCALL(xenpmu_op)
DECLARE_HYPERCALL(nested_xen_version)
DECLARE_HYPERCALL(nested_memory_op)
+DECLARE_HYPERCALL(nested_hvm_op)
DECLARE_HYPERCALL(arch_0)
DECLARE_HYPERCALL(arch_1)
diff --git a/xen/arch/x86/guest/xen-nested.c b/xen/arch/x86/guest/xen-nested.c
index a76983cc2d..82bd6885e6 100644
--- a/xen/arch/x86/guest/xen-nested.c
+++ b/xen/arch/x86/guest/xen-nested.c
@@ -22,6 +22,7 @@
#include <xen/lib.h>
#include <xen/sched.h>
+#include <public/hvm/hvm_op.h>
#include <public/memory.h>
#include <public/version.h>
#include <public/xen.h>
@@ -160,3 +161,44 @@ int compat_nested_memory_op(int cmd,
XEN_GUEST_HANDLE_PARAM(void) arg)
return nested_add_to_physmap(*nat);
}
#endif
+
+long do_nested_hvm_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
+{
+ struct xen_hvm_param a;
+ long ret;
+
+ if ( !xen_nested )
+ return -ENOSYS;
+
+ ret = xsm_nested_hvm_op(XSM_PRIV, current->domain, cmd);
+ if ( ret )
+ return ret;
+
+ switch ( cmd )
+ {
+ case HVMOP_set_param:
+ {
+ if ( copy_from_guest(&a, arg, 1) )
+ return -EFAULT;
+
+ return xen_hypercall_hvm_op(cmd, &a);
+ }
+
+ case HVMOP_get_param:
+ {
+ if ( copy_from_guest(&a, arg, 1) )
+ return -EFAULT;
+
+ ret = xen_hypercall_hvm_op(cmd, &a);
+
+ if ( !ret && __copy_to_guest(arg, &a, 1) )
+ return -EFAULT;
+
+ return ret;
+ }
+
+ default:
+ gprintk(XENLOG_ERR, "Nested hvm op %d not implemented.\n", cmd);
+ return -EOPNOTSUPP;
+ }
+}
diff --git a/xen/arch/x86/hypercall.c b/xen/arch/x86/hypercall.c
index 2aa8dc5ac6..268cc9450a 100644
--- a/xen/arch/x86/hypercall.c
+++ b/xen/arch/x86/hypercall.c
@@ -76,6 +76,7 @@ const hypercall_args_t hypercall_args_table[NR_hypercalls] =
#ifdef CONFIG_XEN_NESTED
ARGS(nested_xen_version, 2),
COMP(nested_memory_op, 2, 2),
+ ARGS(nested_hvm_op, 2),
#endif
ARGS(mca, 1),
ARGS(arch_1, 1),
diff --git a/xen/arch/x86/pv/hypercall.c b/xen/arch/x86/pv/hypercall.c
index 96198d3313..e88ecce222 100644
--- a/xen/arch/x86/pv/hypercall.c
+++ b/xen/arch/x86/pv/hypercall.c
@@ -87,6 +87,7 @@ const hypercall_table_t pv_hypercall_table[] = {
#ifdef CONFIG_XEN_NESTED
HYPERCALL(nested_xen_version),
COMPAT_CALL(nested_memory_op),
+ HYPERCALL(nested_hvm_op),
#endif
HYPERCALL(mca),
HYPERCALL(arch_1),
diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h
index e081f52fc4..1731409eb8 100644
--- a/xen/include/public/xen.h
+++ b/xen/include/public/xen.h
@@ -123,6 +123,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_ulong_t);
#define __HYPERVISOR_dm_op 41
#define __HYPERVISOR_nested_xen_version 42
#define __HYPERVISOR_nested_memory_op 43
+#define __HYPERVISOR_nested_hvm_op 44
/* Architecture-specific hypercall definitions. */
#define __HYPERVISOR_arch_0 48
diff --git a/xen/include/xen/hypercall.h b/xen/include/xen/hypercall.h
index d373bd1763..b09070539e 100644
--- a/xen/include/xen/hypercall.h
+++ b/xen/include/xen/hypercall.h
@@ -158,6 +158,10 @@ extern long do_nested_xen_version(
extern long do_nested_memory_op(
int cmd,
XEN_GUEST_HANDLE_PARAM(void) arg);
+
+extern long do_nested_hvm_op(
+ int cmd,
+ XEN_GUEST_HANDLE_PARAM(void) arg);
#endif
#ifdef CONFIG_COMPAT
diff --git a/xen/include/xsm/dummy.h b/xen/include/xsm/dummy.h
index 17375f6b9f..238b425c49 100644
--- a/xen/include/xsm/dummy.h
+++ b/xen/include/xsm/dummy.h
@@ -754,6 +754,13 @@ static XSM_INLINE int
xsm_nested_add_to_physmap(XSM_DEFAULT_ARG
XSM_ASSERT_ACTION(XSM_PRIV);
return xsm_default_action(action, d, NULL);
}
+
+static XSM_INLINE int xsm_nested_hvm_op(XSM_DEFAULT_ARG const struct domain *d,
+ unsigned int cmd)
+{
+ XSM_ASSERT_ACTION(XSM_PRIV);
+ return xsm_default_action(action, d, NULL);
+}
#endif
#include <public/version.h>
diff --git a/xen/include/xsm/xsm.h b/xen/include/xsm/xsm.h
index 920d2d9088..cc02bf18c7 100644
--- a/xen/include/xsm/xsm.h
+++ b/xen/include/xsm/xsm.h
@@ -190,6 +190,7 @@ struct xsm_operations {
#ifdef CONFIG_XEN_NESTED
int (*nested_xen_version) (const struct domain *d, unsigned int cmd);
int (*nested_add_to_physmap) (const struct domain *d);
+ int (*nested_hvm_op) (const struct domain *d, unsigned int cmd);
#endif
};
@@ -741,6 +742,12 @@ static inline int xsm_nested_add_to_physmap(xsm_default_t
def,
return xsm_ops->nested_add_to_physmap(d);
}
+static inline int xsm_nested_hvm_op(xsm_default_t def, const struct domain *d,
+ unsigned int cmd)
+{
+ return xsm_ops->nested_hvm_op(d, cmd);
+}
+
#endif /* CONFIG_XEN_NESTED */
#endif /* XSM_NO_WRAPPERS */
diff --git a/xen/xsm/dummy.c b/xen/xsm/dummy.c
index 5ce29bcfe5..909d41a81b 100644
--- a/xen/xsm/dummy.c
+++ b/xen/xsm/dummy.c
@@ -160,5 +160,6 @@ void __init xsm_fixup_ops (struct xsm_operations *ops)
#ifdef CONFIG_XEN_NESTED
set_to_dummy_if_null(ops, nested_xen_version);
set_to_dummy_if_null(ops, nested_add_to_physmap);
+ set_to_dummy_if_null(ops, nested_hvm_op);
#endif
}
diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c
index 17a81b85f9..f8d247e28f 100644
--- a/xen/xsm/flask/hooks.c
+++ b/xen/xsm/flask/hooks.c
@@ -1768,6 +1768,27 @@ static int flask_nested_xen_version(const struct domain
*d, unsigned int op)
return domain_has_xen_version(d, SECINITSID_NESTEDXEN, op);
}
+static int flask_nested_hvm_op(const struct domain *d, unsigned int op)
+{
+ u32 perm;
+
+ switch ( op )
+ {
+ case HVMOP_set_param:
+ perm = HVM__SETPARAM;
+ break;
+
+ case HVMOP_get_param:
+ perm = HVM__GETPARAM;
+ break;
+
+ default:
+ perm = HVM__HVMCTL;
+ }
+
+ return domain_has_nested_perm(d, SECCLASS_HVM, perm);
+}
+
#endif
long do_flask_op(XEN_GUEST_HANDLE_PARAM(xsm_op_t) u_flask_op);
@@ -1912,6 +1933,7 @@ static struct xsm_operations flask_ops = {
#ifdef CONFIG_XEN_NESTED
.nested_xen_version = flask_nested_xen_version,
.nested_add_to_physmap = flask_nested_add_to_physmap,
+ .nested_hvm_op = flask_nested_hvm_op,
#endif
};
--
2.17.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |