[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v12 3/9] tools: provide interface for generic MSR access
Xen added a new sysctl hypercall for generic MSR access, and this is the tool side change to wrapper the hypercall into xc APIs. Signed-off-by: Dongxiao Xu <dongxiao.xu@xxxxxxxxx> --- tools/libxc/Makefile | 1 + tools/libxc/xc_private.h | 31 ++++++++++++++++++++++++++ tools/libxc/xc_resource.c | 53 +++++++++++++++++++++++++++++++++++++++++++++ tools/libxc/xenctrl.h | 5 +++++ 4 files changed, 90 insertions(+) create mode 100644 tools/libxc/xc_resource.c diff --git a/tools/libxc/Makefile b/tools/libxc/Makefile index 63be3d3..b8b28c1 100644 --- a/tools/libxc/Makefile +++ b/tools/libxc/Makefile @@ -34,6 +34,7 @@ CTRL_SRCS-y += xc_foreign_memory.c CTRL_SRCS-y += xc_kexec.c CTRL_SRCS-y += xtl_core.c CTRL_SRCS-y += xtl_logger_stdio.c +CTRL_SRCS-y += xc_resource.c CTRL_SRCS-$(CONFIG_X86) += xc_pagetab.c CTRL_SRCS-$(CONFIG_Linux) += xc_linux.c xc_linux_osdep.c CTRL_SRCS-$(CONFIG_FreeBSD) += xc_freebsd.c xc_freebsd_osdep.c diff --git a/tools/libxc/xc_private.h b/tools/libxc/xc_private.h index c7730f2..b1f1afa 100644 --- a/tools/libxc/xc_private.h +++ b/tools/libxc/xc_private.h @@ -46,6 +46,7 @@ #define DECLARE_SYSCTL struct xen_sysctl sysctl #define DECLARE_PHYSDEV_OP struct physdev_op physdev_op #define DECLARE_FLASK_OP struct xen_flask_op op +#define DECLARE_PLATFORM_OP struct xen_platform_op platform_op #undef PAGE_SHIFT #undef PAGE_SIZE @@ -310,6 +311,36 @@ static inline int do_sysctl(xc_interface *xch, struct xen_sysctl *sysctl) return ret; } +static inline int do_platform_op(xc_interface *xch, + struct xen_platform_op *platform_op) +{ + int ret = -1; + DECLARE_HYPERCALL; + DECLARE_HYPERCALL_BOUNCE(platform_op, sizeof(*platform_op), + XC_HYPERCALL_BUFFER_BOUNCE_BOTH); + + platform_op->interface_version = XENPF_INTERFACE_VERSION; + + if ( xc_hypercall_bounce_pre(xch, platform_op) ) + { + PERROR("Could not bounce buffer for platform_op hypercall"); + goto out1; + } + + hypercall.op = __HYPERVISOR_platform_op; + hypercall.arg[0] = HYPERCALL_BUFFER_AS_ARG(platform_op); + if ( (ret = do_xen_hypercall(xch, &hypercall)) < 0 ) + { + if ( errno == EACCES ) + DPRINTF("platform operation failed -- need to" + " rebuild the user-space tool set?\n"); + } + + xc_hypercall_bounce_post(xch, platform_op); + out1: + return ret; +} + int do_memory_op(xc_interface *xch, int cmd, void *arg, size_t len); void *xc_map_foreign_ranges(xc_interface *xch, uint32_t dom, diff --git a/tools/libxc/xc_resource.c b/tools/libxc/xc_resource.c new file mode 100644 index 0000000..bfecfdd --- /dev/null +++ b/tools/libxc/xc_resource.c @@ -0,0 +1,53 @@ +/* + * xc_resource.c + * + * Generic resource access API + * + * Copyright (C) 2014 Intel Corporation + * Author Dongxiao Xu <dongxiao.xu@xxxxxxxxx> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; version 2.1 only. with the special + * exception on linking described in file LICENSE. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + */ + +#include "xc_private.h" + +int xc_resource_op(xc_interface *xch, uint32_t nr, uint32_t type, + xc_resource_data_t *data) +{ + int rc; + DECLARE_PLATFORM_OP; + DECLARE_HYPERCALL_BOUNCE(data, nr * sizeof(*data), + XC_HYPERCALL_BUFFER_BOUNCE_BOTH); + + if ( xc_hypercall_bounce_pre(xch, data) ) + return -1; + + platform_op.cmd = XENPF_resource_op; + platform_op.u.resource_op.nr = nr; + platform_op.u.resource_op.type = type; + set_xen_guest_handle(platform_op.u.resource_op.data, data); + + rc = do_platform_op(xch, &platform_op); + + xc_hypercall_bounce_post(xch, data); + + return rc; +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h index af6f249..ca0b207 100644 --- a/tools/libxc/xenctrl.h +++ b/tools/libxc/xenctrl.h @@ -47,6 +47,7 @@ #include <xen/xsm/flask_op.h> #include <xen/tmem.h> #include <xen/kexec.h> +#include <xen/platform.h> #include "xentoollog.h" @@ -2603,6 +2604,10 @@ int xc_kexec_load(xc_interface *xch, uint8_t type, uint16_t arch, */ int xc_kexec_unload(xc_interface *xch, int type); +typedef xenpf_resource_data_t xc_resource_data_t; +int xc_resource_op(xc_interface *xch, uint32_t nr, + uint32_t type, xc_resource_data_t *data); + #endif /* XENCTRL_H */ /* -- 1.7.9.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |