From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ed White Subject: [PATCH v5 14/15] tools/libxc: add support to altp2m hvmops Date: Mon, 13 Jul 2015 17:15:02 -0700 Message-ID: <1436832903-12639-15-git-send-email-edmund.h.white@intel.com> References: <1436832903-12639-1-git-send-email-edmund.h.white@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1436832903-12639-1-git-send-email-edmund.h.white@intel.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: Ravi Sahita , Wei Liu , George Dunlap , Ian Jackson , Tim Deegan , Jan Beulich , Andrew Cooper , tlengyel@novetta.com, Daniel De Graaf List-Id: xen-devel@lists.xenproject.org From: Tamas K Lengyel Wrappers to issue altp2m hvmops. Signed-off-by: Tamas K Lengyel Signed-off-by: Ravi Sahita Acked-by: Ian Campbell --- tools/libxc/Makefile | 1 + tools/libxc/include/xenctrl.h | 21 ++++ tools/libxc/xc_altp2m.c | 237 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 259 insertions(+) create mode 100644 tools/libxc/xc_altp2m.c diff --git a/tools/libxc/Makefile b/tools/libxc/Makefile index 153b79e..c2c2b1c 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 d1d2ab3..ecddf28 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -2316,6 +2316,27 @@ 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, 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..a4be36b --- /dev/null +++ b/tools/libxc/xc_altp2m.c @@ -0,0 +1,237 @@ +/****************************************************************************** + * + * xc_altp2m.c + * + * Interface to altp2m related HVMOPs + * + * Copyright (c) 2015 Tamas K Lengyel (tamas@tklengyel.com) + * + * 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 +#include + +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->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->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, 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->cmd = HVMOP_altp2m_vcpu_enable_notify; + 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->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->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->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->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->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