[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC XEN PATCH v4 09/41] xen/pmem: add framework for hypercall XEN_SYSCTL_nvdimm_op
XEN_SYSCTL_nvdimm_op will support a set of sub-commands to manage the physical NVDIMM devices. This commit just adds the framework for this hypercall, and does not implement any sub-commands. Signed-off-by: Haozhong Zhang <haozhong.zhang@xxxxxxxxx> --- Cc: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Cc: Wei Liu <wei.liu2@xxxxxxxxxx> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Cc: George Dunlap <George.Dunlap@xxxxxxxxxxxxx> Cc: Jan Beulich <jbeulich@xxxxxxxx> Cc: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx> Cc: Tim Deegan <tim@xxxxxxx> Changes in v4: * Remove unnecessary 'pad' field in struct xen_sysctl_nvdimm_op. --- tools/flask/policy/modules/dom0.te | 2 +- xen/common/pmem.c | 18 ++++++++++++++++++ xen/common/sysctl.c | 9 +++++++++ xen/include/public/sysctl.h | 16 +++++++++++++++- xen/include/xen/pmem.h | 2 ++ xen/xsm/flask/hooks.c | 4 ++++ xen/xsm/flask/policy/access_vectors | 2 ++ 7 files changed, 51 insertions(+), 2 deletions(-) diff --git a/tools/flask/policy/modules/dom0.te b/tools/flask/policy/modules/dom0.te index 1643b400f0..7379222f18 100644 --- a/tools/flask/policy/modules/dom0.te +++ b/tools/flask/policy/modules/dom0.te @@ -16,7 +16,7 @@ allow dom0_t xen_t:xen { allow dom0_t xen_t:xen2 { resource_op psr_cmt_op psr_cat_op pmu_ctrl get_symbol get_cpu_levelling_caps get_cpu_featureset livepatch_op - gcov_op set_parameter + gcov_op set_parameter nvdimm_op }; # Allow dom0 to use all XENVER_ subops that have checks. diff --git a/xen/common/pmem.c b/xen/common/pmem.c index 699f8a3322..c3b26dd02d 100644 --- a/xen/common/pmem.c +++ b/xen/common/pmem.c @@ -123,6 +123,24 @@ int pmem_register(unsigned long smfn, unsigned long emfn, unsigned int pxm) return rc; } +/** + * Top-level hypercall handler of XEN_SYSCTL_nvdimm_pmem_*. + * + * Parameters: + * nvdimm: the hypercall parameters + * + * Return: + * On success, return 0. Otherwise, return a non-zero error code. + */ +int pmem_do_sysctl(struct xen_sysctl_nvdimm_op *nvdimm) +{ + int rc = -ENOSYS; + + nvdimm->err = -rc; + + return rc; +} + #ifdef CONFIG_X86 int __init pmem_dom0_setup_permission(struct domain *d) diff --git a/xen/common/sysctl.c b/xen/common/sysctl.c index 08198b7150..f533875c5c 100644 --- a/xen/common/sysctl.c +++ b/xen/common/sysctl.c @@ -28,6 +28,7 @@ #include <xen/pmstat.h> #include <xen/livepatch.h> #include <xen/gcov.h> +#include <xen/pmem.h> long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl) { @@ -504,6 +505,14 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl) break; } +#ifdef CONFIG_NVDIMM_PMEM + case XEN_SYSCTL_nvdimm_op: + ret = pmem_do_sysctl(&op->u.nvdimm); + if ( ret != -ENOSYS ) + copyback = 1; + break; +#endif + default: ret = arch_do_sysctl(op, u_sysctl); copyback = 0; diff --git a/xen/include/public/sysctl.h b/xen/include/public/sysctl.h index 6140f1a059..7f0e56f73a 100644 --- a/xen/include/public/sysctl.h +++ b/xen/include/public/sysctl.h @@ -36,7 +36,7 @@ #include "physdev.h" #include "tmem.h" -#define XEN_SYSCTL_INTERFACE_VERSION 0x00000010 +#define XEN_SYSCTL_INTERFACE_VERSION 0x00000011 /* * Read console content from Xen buffer ring. @@ -1045,6 +1045,18 @@ struct xen_sysctl_set_parameter { uint16_t pad[3]; /* IN: MUST be zero. */ }; +/* + * Interface for NVDIMM management. + */ + +struct xen_sysctl_nvdimm_op { + uint32_t cmd; /* IN: XEN_SYSCTL_nvdimm_*; none is implemented yet. */ + uint32_t err; /* OUT: error code */ + union { + /* Parameters of XEN_SYSCTL_nvdimm_* will be added here. */ + } u; +}; + struct xen_sysctl { uint32_t cmd; #define XEN_SYSCTL_readconsole 1 @@ -1074,6 +1086,7 @@ struct xen_sysctl { #define XEN_SYSCTL_get_cpu_featureset 26 #define XEN_SYSCTL_livepatch_op 27 #define XEN_SYSCTL_set_parameter 28 +#define XEN_SYSCTL_nvdimm_op 29 uint32_t interface_version; /* XEN_SYSCTL_INTERFACE_VERSION */ union { struct xen_sysctl_readconsole readconsole; @@ -1103,6 +1116,7 @@ struct xen_sysctl { struct xen_sysctl_cpu_featureset cpu_featureset; struct xen_sysctl_livepatch_op livepatch; struct xen_sysctl_set_parameter set_parameter; + struct xen_sysctl_nvdimm_op nvdimm; uint8_t pad[128]; } u; }; diff --git a/xen/include/xen/pmem.h b/xen/include/xen/pmem.h index d5bd54ff19..922b12f570 100644 --- a/xen/include/xen/pmem.h +++ b/xen/include/xen/pmem.h @@ -20,9 +20,11 @@ #define __XEN_PMEM_H__ #ifdef CONFIG_NVDIMM_PMEM +#include <public/sysctl.h> #include <xen/types.h> int pmem_register(unsigned long smfn, unsigned long emfn, unsigned int pxm); +int pmem_do_sysctl(struct xen_sysctl_nvdimm_op *nvdimm); #ifdef CONFIG_X86 diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c index f01b4cfaaa..f677755512 100644 --- a/xen/xsm/flask/hooks.c +++ b/xen/xsm/flask/hooks.c @@ -835,6 +835,10 @@ static int flask_sysctl(int cmd) return avc_current_has_perm(SECINITSID_XEN, SECCLASS_XEN2, XEN2__SET_PARAMETER, NULL); + case XEN_SYSCTL_nvdimm_op: + return avc_current_has_perm(SECINITSID_XEN, SECCLASS_XEN2, + XEN2__NVDIMM_OP, NULL); + default: return avc_unknown_permission("sysctl", cmd); } diff --git a/xen/xsm/flask/policy/access_vectors b/xen/xsm/flask/policy/access_vectors index 3a2d863b8f..3bfbb892c7 100644 --- a/xen/xsm/flask/policy/access_vectors +++ b/xen/xsm/flask/policy/access_vectors @@ -103,6 +103,8 @@ class xen2 gcov_op # XEN_SYSCTL_set_parameter set_parameter +# XEN_SYSCTL_nvdimm_op + nvdimm_op } # Classes domain and domain2 consist of operations that a domain performs on -- 2.15.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 |