[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v6 14/15] tools/libxc: add support to altp2m hvmops
From: Tamas K Lengyel <tlengyel@xxxxxxxxxxx> Wrappers to issue altp2m hvmops. Signed-off-by: Tamas K Lengyel <tlengyel@xxxxxxxxxxx> Signed-off-by: Ravi Sahita <ravi.sahita@xxxxxxxxx> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- tools/libxc/Makefile | 1 + tools/libxc/include/xenctrl.h | 22 ++++ tools/libxc/xc_altp2m.c | 248 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 271 insertions(+) create mode 100644 tools/libxc/xc_altp2m.c diff --git a/tools/libxc/Makefile b/tools/libxc/Makefile index 1aec848..b0a3e05 100644 --- a/tools/libxc/Makefile +++ b/tools/libxc/Makefile @@ -10,6 +10,7 @@ override CONFIG_MIGRATE := n endif CTRL_SRCS-y := +CTRL_SRCS-y += xc_altp2m.c CTRL_SRCS-y += xc_core.c CTRL_SRCS-$(CONFIG_X86) += xc_core_x86.c CTRL_SRCS-$(CONFIG_ARM) += xc_core_arm.c diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index ce9029c..f869390 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -2304,6 +2304,28 @@ void xc_tmem_save_done(xc_interface *xch, int dom); int xc_tmem_restore(xc_interface *xch, int dom, int fd); int xc_tmem_restore_extra(xc_interface *xch, int dom, int fd); +/** + * altp2m operations + */ + +int xc_altp2m_get_domain_state(xc_interface *handle, domid_t dom, bool *state); +int xc_altp2m_set_domain_state(xc_interface *handle, domid_t dom, bool state); +int xc_altp2m_set_vcpu_enable_notify(xc_interface *handle, domid_t domid, + uint32_t vcpuid, xen_pfn_t gfn); +int xc_altp2m_create_view(xc_interface *handle, domid_t domid, + xenmem_access_t default_access, uint16_t *view_id); +int xc_altp2m_destroy_view(xc_interface *handle, domid_t domid, + uint16_t view_id); +/* 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_mem_access(xc_interface *handle, domid_t domid, + uint16_t view_id, xen_pfn_t gfn, + xenmem_access_t access); +int xc_altp2m_change_gfn(xc_interface *handle, domid_t domid, + uint16_t view_id, xen_pfn_t old_gfn, + xen_pfn_t new_gfn); + /** * Mem paging operations. * Paging is supported only on the x86 architecture in 64 bit mode, with diff --git a/tools/libxc/xc_altp2m.c b/tools/libxc/xc_altp2m.c new file mode 100644 index 0000000..0f3c5ed --- /dev/null +++ b/tools/libxc/xc_altp2m.c @@ -0,0 +1,248 @@ +/****************************************************************************** + * + * xc_altp2m.c + * + * Interface to altp2m related HVMOPs + * + * Copyright (c) 2015 Tamas K Lengyel (tamas@xxxxxxxxxxxxx) + * + * This library 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; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "xc_private.h" +#include <stdbool.h> +#include <xen/hvm/hvm_op.h> + +int xc_altp2m_get_domain_state(xc_interface *handle, domid_t dom, bool *state) +{ + int rc; + DECLARE_HYPERCALL; + DECLARE_HYPERCALL_BUFFER(xen_hvm_altp2m_op_t, arg); + + arg = xc_hypercall_buffer_alloc(handle, arg, sizeof(*arg)); + if ( arg == NULL ) + return -1; + + hypercall.op = __HYPERVISOR_hvm_op; + hypercall.arg[0] = HVMOP_altp2m; + hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg); + + arg->version = HVMOP_ALTP2M_INTERFACE_VERSION; + arg->cmd = HVMOP_altp2m_get_domain_state; + arg->domain = dom; + + rc = do_xen_hypercall(handle, &hypercall); + + if ( !rc ) + *state = arg->u.domain_state.state; + + xc_hypercall_buffer_free(handle, arg); + return rc; +} + +int xc_altp2m_set_domain_state(xc_interface *handle, domid_t dom, bool state) +{ + int rc; + DECLARE_HYPERCALL; + DECLARE_HYPERCALL_BUFFER(xen_hvm_altp2m_op_t, arg); + + arg = xc_hypercall_buffer_alloc(handle, arg, sizeof(*arg)); + if ( arg == NULL ) + return -1; + + hypercall.op = __HYPERVISOR_hvm_op; + hypercall.arg[0] = HVMOP_altp2m; + hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg); + + arg->version = HVMOP_ALTP2M_INTERFACE_VERSION; + arg->cmd = HVMOP_altp2m_set_domain_state; + arg->domain = dom; + arg->u.domain_state.state = state; + + rc = do_xen_hypercall(handle, &hypercall); + + xc_hypercall_buffer_free(handle, arg); + return rc; +} + +/* This is a bit odd to me that it acts on current.. */ +int xc_altp2m_set_vcpu_enable_notify(xc_interface *handle, domid_t domid, + uint32_t vcpuid, xen_pfn_t gfn) +{ + int rc; + DECLARE_HYPERCALL; + DECLARE_HYPERCALL_BUFFER(xen_hvm_altp2m_op_t, arg); + + arg = xc_hypercall_buffer_alloc(handle, arg, sizeof(*arg)); + if ( arg == NULL ) + return -1; + + hypercall.op = __HYPERVISOR_hvm_op; + hypercall.arg[0] = HVMOP_altp2m; + hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg); + + arg->version = HVMOP_ALTP2M_INTERFACE_VERSION; + arg->cmd = HVMOP_altp2m_vcpu_enable_notify; + arg->domain = domid; + arg->u.enable_notify.vcpu_id = vcpuid; + arg->u.enable_notify.gfn = gfn; + + rc = do_xen_hypercall(handle, &hypercall); + + xc_hypercall_buffer_free(handle, arg); + return rc; +} + +int xc_altp2m_create_view(xc_interface *handle, domid_t domid, + xenmem_access_t default_access, uint16_t *view_id) +{ + int rc; + DECLARE_HYPERCALL; + DECLARE_HYPERCALL_BUFFER(xen_hvm_altp2m_op_t, arg); + + arg = xc_hypercall_buffer_alloc(handle, arg, sizeof(*arg)); + if ( arg == NULL ) + return -1; + + hypercall.op = __HYPERVISOR_hvm_op; + hypercall.arg[0] = HVMOP_altp2m; + hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg); + + arg->version = HVMOP_ALTP2M_INTERFACE_VERSION; + arg->cmd = HVMOP_altp2m_create_p2m; + arg->domain = domid; + arg->u.view.view = -1; + arg->u.view.hvmmem_default_access = default_access; + + rc = do_xen_hypercall(handle, &hypercall); + + if ( !rc ) + *view_id = arg->u.view.view; + + xc_hypercall_buffer_free(handle, arg); + return rc; +} + +int xc_altp2m_destroy_view(xc_interface *handle, domid_t domid, + uint16_t view_id) +{ + int rc; + DECLARE_HYPERCALL; + DECLARE_HYPERCALL_BUFFER(xen_hvm_altp2m_op_t, arg); + + arg = xc_hypercall_buffer_alloc(handle, arg, sizeof(*arg)); + if ( arg == NULL ) + return -1; + + hypercall.op = __HYPERVISOR_hvm_op; + hypercall.arg[0] = HVMOP_altp2m; + hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg); + + arg->version = HVMOP_ALTP2M_INTERFACE_VERSION; + arg->cmd = HVMOP_altp2m_destroy_p2m; + arg->domain = domid; + arg->u.view.view = view_id; + + rc = do_xen_hypercall(handle, &hypercall); + + xc_hypercall_buffer_free(handle, arg); + return rc; +} + +/* 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 rc; + DECLARE_HYPERCALL; + DECLARE_HYPERCALL_BUFFER(xen_hvm_altp2m_op_t, arg); + + arg = xc_hypercall_buffer_alloc(handle, arg, sizeof(*arg)); + if ( arg == NULL ) + return -1; + + hypercall.op = __HYPERVISOR_hvm_op; + hypercall.arg[0] = HVMOP_altp2m; + hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg); + + arg->version = HVMOP_ALTP2M_INTERFACE_VERSION; + arg->cmd = HVMOP_altp2m_switch_p2m; + arg->domain = domid; + arg->u.view.view = view_id; + + rc = do_xen_hypercall(handle, &hypercall); + + 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) +{ + int rc; + DECLARE_HYPERCALL; + DECLARE_HYPERCALL_BUFFER(xen_hvm_altp2m_op_t, arg); + + arg = xc_hypercall_buffer_alloc(handle, arg, sizeof(*arg)); + if ( arg == NULL ) + return -1; + + hypercall.op = __HYPERVISOR_hvm_op; + hypercall.arg[0] = HVMOP_altp2m; + hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg); + + arg->version = HVMOP_ALTP2M_INTERFACE_VERSION; + arg->cmd = HVMOP_altp2m_set_mem_access; + arg->domain = domid; + arg->u.set_mem_access.view = view_id; + arg->u.set_mem_access.hvmmem_access = access; + arg->u.set_mem_access.gfn = gfn; + + rc = do_xen_hypercall(handle, &hypercall); + + xc_hypercall_buffer_free(handle, arg); + return rc; +} + +int xc_altp2m_change_gfn(xc_interface *handle, domid_t domid, + uint16_t view_id, xen_pfn_t old_gfn, + xen_pfn_t new_gfn) +{ + int rc; + DECLARE_HYPERCALL; + DECLARE_HYPERCALL_BUFFER(xen_hvm_altp2m_op_t, arg); + + arg = xc_hypercall_buffer_alloc(handle, arg, sizeof(*arg)); + if ( arg == NULL ) + return -1; + + hypercall.op = __HYPERVISOR_hvm_op; + hypercall.arg[0] = HVMOP_altp2m; + hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg); + + arg->version = HVMOP_ALTP2M_INTERFACE_VERSION; + arg->cmd = HVMOP_altp2m_change_gfn; + arg->domain = domid; + arg->u.change_gfn.view = view_id; + arg->u.change_gfn.old_gfn = old_gfn; + arg->u.change_gfn.new_gfn = new_gfn; + + rc = do_xen_hypercall(handle, &hypercall); + + xc_hypercall_buffer_free(handle, arg); + return rc; +} + -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |