From patchwork Thu Jun 22 07:38:43 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bhupinder Thakur X-Patchwork-Id: 106164 Delivered-To: patch@linaro.org Received: by 10.140.91.2 with SMTP id y2csp2327117qgd; Thu, 22 Jun 2017 00:41:16 -0700 (PDT) X-Received: by 10.36.123.86 with SMTP id q83mr696983itc.65.1498117276490; Thu, 22 Jun 2017 00:41:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1498117276; cv=none; d=google.com; s=arc-20160816; b=T5BtP+UY3wMucYoQ9NgYO2osecrmeOaCDV0QlNY1LOcBV5lCLHzIVxfImf/GG0jPg6 VYBAz7C7BC8qdspWTDdN1jxGkQ4l/J1eL8BgtGE78dvb5gktaplNrlt5Pql93NQAUNW/ yryxP5d1aP3gJsVUU+NkQKb06PoxToG21u0JGzJlhGumzd6RH5PNuDRH2w/2OCTdwJRn n9kjgsnGlBrrVmKiVygVm2RIxcL1PZY9yCACgtTIe1gw7J6wVxpTaFKarih/wwznW7vS ILh7YdS9nEDFdHsCOgPnPmc3jk6QJgzMUUSh25a4MJKc2H/QKfv+Iq/hjlWPLthhVyEJ Kgww== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version :list-subscribe:list-help:list-post:list-unsubscribe:list-id :precedence:subject:cc:references:in-reply-to:message-id:date:to :from:dkim-signature:arc-authentication-results; bh=FpfuG3rpGi65cDXjkBDgJgs8ljiHilg5rEghskoJkjc=; b=z0Oapnbv6Og5goJ0sBmG+jjRo2CQIt7N9u2Ip+eRitO8iUek/b+sC8HwAWZ5VdHvLo M7NHf030tnZhLZjHgk8Ywl6hPW+yA8xOaVaG1mVDRLc5G/CetxEyqB39TVopOLQib8pj Z0kz84dI9HjZMv1ZDFpeC2sLtIuHANu0nt8vQEHjxBCtXIoFR5PSctpNRFEN03wUFPZE PU91G4zQvtVqfit2a8BH79919HyWSR3gJXAHO6mdec29kEPZyv0qCS3T+oAL4RRAtqFO fcHAUZBMXFdgn3YofTMxVp9jcYgGTCrIOyncEXponBJH9vgi9NbxKOeZH0Xvhpph6EF7 mZgQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.b=LJMVqb6H; spf=neutral (google.com: 192.237.175.120 is neither permitted nor denied by best guess record for domain of xen-devel-bounces@lists.xen.org) smtp.mailfrom=xen-devel-bounces@lists.xen.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org. [192.237.175.120]) by mx.google.com with ESMTPS id w2si370678itf.83.2017.06.22.00.41.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 22 Jun 2017 00:41:16 -0700 (PDT) Received-SPF: neutral (google.com: 192.237.175.120 is neither permitted nor denied by best guess record for domain of xen-devel-bounces@lists.xen.org) client-ip=192.237.175.120; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.b=LJMVqb6H; spf=neutral (google.com: 192.237.175.120 is neither permitted nor denied by best guess record for domain of xen-devel-bounces@lists.xen.org) smtp.mailfrom=xen-devel-bounces@lists.xen.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dNwi8-0005ZE-0p; Thu, 22 Jun 2017 07:39:28 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dNwi6-0005Xv-9i for xen-devel@lists.xenproject.org; Thu, 22 Jun 2017 07:39:26 +0000 Received: from [193.109.254.147] by server-8.bemta-6.messagelabs.com id E8/E9-03696-D247B495; Thu, 22 Jun 2017 07:39:25 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrGIsWRWlGSWpSXmKPExsVyMfTASl2dEu9 Ig3NrLS2+b5nM5MDocfjDFZYAxijWzLyk/IoE1ozrq7+zFMwKq7i6/QdjA2OLfRcjF4eQwAxG iV1njjGCOCwC85glZn/qYAFxJAT6WSXm9K0AynACOWkSM/r2skPY5RL/F6wGs4UEtCSOnprNC mHvY5L4/ku5i5GDg03ARGJWhwRIWERASeLeqslMIDOZBeYzSjRN6mUDSQgLhEicbm0G62URUJ WYvOYY2C5eAW+JZa9fMkPskpO4ea4TzOYU8JFYsWMh1F5voKsns0xgFFjAyLCKUaM4tagstUj XyFwvqSgzPaMkNzEzR9fQwEwvN7W4ODE9NScxqVgvOT93EyMwtBiAYAfj4rWBhxglOZiURHn/ 53lHCvEl5adUZiQWZ8QXleakFh9ilOHgUJLgnVcElBMsSk1PrUjLzAEGOUxagoNHSYS3BaSVt 7ggMbc4Mx0idYrRmOPKlXVfmDimHNj+hUmIJS8/L1VKnFe0GKhUAKQ0ozQPbhAs+i4xykoJ8z ICnSbEU5BalJtZgir/ilGcg1FJmFcf5B6ezLwSuH2vgE5hAjrlxREPkFNKEhFSUg2Mm8Vctsx 3Mb6lwzV1q4JSy9eSvYGu7gmMW37qKDpNnOxxnXnfbP+PNV8nzQ7cOJch1H9uJ1/jg2t9BU6u lY5WTA+Emzp/GvzoPLZh0wuDH+rh+zSZuy5MCOSTqpaavvQgt9LaeYu3MJQv+X2g2rK41d5TW fF+kdm+x2eumMW+F1l+NO+K4b9TSizFGYmGWsxFxYkAjeu1urkCAAA= X-Env-Sender: bhupinder.thakur@linaro.org X-Msg-Ref: server-9.tower-27.messagelabs.com!1498117163!109018071!1 X-Originating-IP: [209.85.192.169] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 9.4.19; banners=-,-,- X-VirusChecked: Checked Received: (qmail 11513 invoked from network); 22 Jun 2017 07:39:24 -0000 Received: from mail-pf0-f169.google.com (HELO mail-pf0-f169.google.com) (209.85.192.169) by server-9.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted SMTP; 22 Jun 2017 07:39:24 -0000 Received: by mail-pf0-f169.google.com with SMTP id s66so5119268pfs.1 for ; Thu, 22 Jun 2017 00:39:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=OHe+jEk0KfLdo3wQD0Hbms4XIlaFN8a09YH5SErCB4o=; b=LJMVqb6H8PWSv6kgE9MVXxaEMcCNeAaOSSmsj8JCU3eVWpysci+8Y/OR3pOcSgNLa/ VXJE4nqCt1RRo0RCA9R7LQAzl+kePAq51j7Qgazp5U7JfqQusvzqPCrqvuifnZJHm0wT FY9nGPeD/EqFd0mQg+YnUCLzTlJDA2bMUWC6E= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=OHe+jEk0KfLdo3wQD0Hbms4XIlaFN8a09YH5SErCB4o=; b=mlwinYulG08sPWrWxo6hM3vNN19v8/ZVS7xgB8qDRvEnztpIpTlfkUpRnOAEerKZe6 MuM29TWnjPL/n41UaJJLZ/scpleyqGCCNMkkQmiW7v/mnImMfza3QWGTI6w2hy5XNA0G 3o2XihRu9P2XdE7xapNNp1gOwKj9juA925Rvcq8pcSOusHVH9fi0xGf29DcubBCq1Tyk VoAhr3eq8katF6wuREM7HAzM1V9W4oryVdioHrIewYpDim3kCSJrxeUV1E2zSkYK3OeQ cOzWbGLGKdgW2WULtAOEZNpbH0Nxex1SBECaT4JG3z1eVYJjhfgJrtIiEFBCt8a/f7Jr lI4Q== X-Gm-Message-State: AKS2vOxXFQxB/10hDWcoizG7bBmm2m+QE0aOqxIOirUVXfJTom22xBPh icB8LNLEsfFUO9Q2V70aBg== X-Received: by 10.84.224.8 with SMTP id r8mr1413406plj.235.1498117162899; Thu, 22 Jun 2017 00:39:22 -0700 (PDT) Received: from blr-ubuntu-linaro.wlan.qualcomm.com (blr-bdr-fw-01_globalnat_allzones-outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id w69sm1883591pfk.107.2017.06.22.00.39.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 22 Jun 2017 00:39:22 -0700 (PDT) From: Bhupinder Thakur To: xen-devel@lists.xenproject.org Date: Thu, 22 Jun 2017 13:08:43 +0530 Message-Id: <1498117132-27139-9-git-send-email-bhupinder.thakur@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1498117132-27139-1-git-send-email-bhupinder.thakur@linaro.org> References: <1498117132-27139-1-git-send-email-bhupinder.thakur@linaro.org> Cc: Wei Liu , Julien Grall , Stefano Stabellini , Ian Jackson Subject: [Xen-devel] [PATCH 08/17 v5] xen/arm: vpl011: Add a new domctl API to initialize vpl011 X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" Add a new domctl API to initialize vpl011. It takes the GFN and console backend domid as input and returns an event channel to be used for sending and receiving events from Xen. Xen will communicate with xenconsole using GFN as the ring buffer and the event channel to transmit and receive pl011 data on the guest domain's behalf. Signed-off-by: Bhupinder Thakur --- CC: Ian Jackson CC: Wei Liu CC: Stefano Stabellini CC: Julien Grall Changes since v4: - Removed libxl__arch_domain_create_finish(). - Added a new function libxl__arch_build_dom_finish(), which is called at the last in libxl__build_dom(). This function calls the vpl011 initialization function now. Changes since v3: - Added a new arch specific function libxl__arch_domain_create_finish(), which calls the vpl011 initialization function. For x86 this function does not do anything. - domain_vpl011_init() takes a pointer to a structure which contains all the required information such as console_domid, gfn instead of passing parameters separately. - Dropped a DOMCTL API defined for de-initializing vpl011 as that should be taken care when the domain is destroyed (and not dependent on userspace libraries/applications). Changes since v2: - Replaced the DOMCTL APIs defined for get/set of event channel and GFN with a set of DOMCTL APIs for initializing and de-initializing vpl011 emulation. tools/libxc/include/xenctrl.h | 20 ++++++++++++++++++++ tools/libxc/xc_domain.c | 25 +++++++++++++++++++++++++ tools/libxl/libxl_arch.h | 6 ++++++ tools/libxl/libxl_arm.c | 22 ++++++++++++++++++++++ tools/libxl/libxl_dom.c | 4 ++++ tools/libxl/libxl_x86.c | 8 ++++++++ xen/arch/arm/domain.c | 5 +++++ xen/arch/arm/domctl.c | 37 +++++++++++++++++++++++++++++++++++++ xen/include/public/domctl.h | 12 ++++++++++++ 9 files changed, 139 insertions(+) diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index 1629f41..26f3d1e 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -885,6 +885,26 @@ int xc_vcpu_getcontext(xc_interface *xch, uint32_t vcpu, vcpu_guest_context_any_t *ctxt); +#if defined (__arm__) || defined(__aarch64__) +/** + * This function initializes the vpl011 emulation and returns + * the event to be used by the backend for communicating with + * the emulation code. + * + * @parm xch a handle to an open hypervisor interface + * @parm domid the domain to get information from + * @parm console_domid the domid of the backend console + * @parm gfn the guest pfn to be used as the ring buffer + * @parm evtchn the event channel to be used for events + * @return 0 on success, negative error on failure + */ +int xc_dom_vpl011_init(xc_interface *xch, + uint32_t domid, + uint32_t console_domid, + xen_pfn_t gfn, + evtchn_port_t *evtchn); +#endif + /** * This function returns information about the XSAVE state of a particular * vcpu of a domain. If extstate->size and extstate->xfeature_mask are 0, diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c index 5d192ea..55de408 100644 --- a/tools/libxc/xc_domain.c +++ b/tools/libxc/xc_domain.c @@ -343,6 +343,31 @@ int xc_domain_get_guest_width(xc_interface *xch, uint32_t domid, return 0; } +#if defined (__arm__) || defined(__aarch64__) +int xc_dom_vpl011_init(xc_interface *xch, + uint32_t domid, + uint32_t console_domid, + xen_pfn_t gfn, + evtchn_port_t *evtchn) +{ + DECLARE_DOMCTL; + int rc = 0; + + domctl.cmd = XEN_DOMCTL_vuart_op; + domctl.domain = (domid_t)domid; + domctl.u.vuart_op.cmd = XEN_DOMCTL_VUART_OP_INIT_VPL011; + domctl.u.vuart_op.console_domid = console_domid; + domctl.u.vuart_op.gfn = gfn; + + if ( (rc = do_domctl(xch, &domctl)) < 0 ) + return rc; + + *evtchn = domctl.u.vuart_op.evtchn; + + return rc; +} +#endif + int xc_domain_getinfo(xc_interface *xch, uint32_t first_domid, unsigned int max_doms, diff --git a/tools/libxl/libxl_arch.h b/tools/libxl/libxl_arch.h index 5e1fc60..118b92c 100644 --- a/tools/libxl/libxl_arch.h +++ b/tools/libxl/libxl_arch.h @@ -44,6 +44,12 @@ int libxl__arch_domain_finalise_hw_description(libxl__gc *gc, libxl_domain_build_info *info, struct xc_dom_image *dom); +/* perform any pending hardware initialization */ +int libxl__arch_build_dom_finish(libxl__gc *gc, + libxl_domain_build_info *info, + struct xc_dom_image *dom, + libxl__domain_build_state *state); + /* build vNUMA vmemrange with arch specific information */ _hidden int libxl__arch_vnuma_build_vmemrange(libxl__gc *gc, diff --git a/tools/libxl/libxl_arm.c b/tools/libxl/libxl_arm.c index d842d88..9d6448e 100644 --- a/tools/libxl/libxl_arm.c +++ b/tools/libxl/libxl_arm.c @@ -1038,6 +1038,28 @@ int libxl__arch_domain_finalise_hw_description(libxl__gc *gc, return 0; } +int libxl__arch_build_dom_finish(libxl__gc *gc, + libxl_domain_build_info *info, + struct xc_dom_image *dom, + libxl__domain_build_state *state) +{ + int ret = 0; + + if ( info->arch_arm.vuart ) { + ret = xc_dom_vpl011_init(CTX->xch, + dom->guest_domid, + dom->console_domid, + dom->vuart_gfn, + &state->vuart_port); + if ( ret < 0 ) + { + LOG(ERROR, "xc_dom_vpl011_init failed\n"); + } + } + + return ret; +} + int libxl__arch_vnuma_build_vmemrange(libxl__gc *gc, uint32_t domid, libxl_domain_build_info *info, diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index c98af60..9b42205 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -687,6 +687,10 @@ static int libxl__build_dom(libxl__gc *gc, uint32_t domid, LOGE(ERROR, "xc_dom_gnttab_init failed"); goto out; } + if ( (ret = libxl__arch_build_dom_finish(gc, info, dom, state)) != 0 ) { + LOGE(ERROR, "libxl__arch_build_dom_finish failed"); + goto out; + } out: return ret != 0 ? ERROR_FAIL : 0; diff --git a/tools/libxl/libxl_x86.c b/tools/libxl/libxl_x86.c index 455f6f0..0aaeded 100644 --- a/tools/libxl/libxl_x86.c +++ b/tools/libxl/libxl_x86.c @@ -391,6 +391,14 @@ int libxl__arch_domain_finalise_hw_description(libxl__gc *gc, return rc; } +int libxl__arch_build_dom_finish(libxl__gc *gc, + libxl_domain_build_info *info, + struct xc_dom_image *dom, + libxl__domain_build_state *state) +{ + return 0; +} + /* Return 0 on success, ERROR_* on failure. */ int libxl__arch_vnuma_build_vmemrange(libxl__gc *gc, uint32_t domid, diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index 76310ed..f1b24cc 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -665,6 +665,11 @@ fail: void arch_domain_destroy(struct domain *d) { + /* + * vpl011 is initialized via a DOMCTL call XEN_DOMCTL_vuart_op. + */ + domain_vpl011_deinit(d); + /* IOMMU page table is shared with P2M, always call * iommu_domain_destroy() before p2m_teardown(). */ diff --git a/xen/arch/arm/domctl.c b/xen/arch/arm/domctl.c index 86fa102..280c412 100644 --- a/xen/arch/arm/domctl.c +++ b/xen/arch/arm/domctl.c @@ -6,9 +6,11 @@ #include #include +#include #include #include #include +#include #include #include #include @@ -119,6 +121,41 @@ long arch_do_domctl(struct xen_domctl *domctl, struct domain *d, d->disable_migrate = domctl->u.disable_migrate.disable; return 0; + case XEN_DOMCTL_vuart_op: + { + int rc; + struct xen_domctl_vuart_op *vuart_op = &domctl->u.vuart_op; + + switch(vuart_op->cmd) + { + case XEN_DOMCTL_VUART_OP_INIT_VPL011: + + if ( !d->creation_finished ) + { + struct vpl011_init_info info; + + info.console_domid = vuart_op->console_domid; + info.gfn = _gfn(vuart_op->gfn); + + rc = domain_vpl011_init(d, &info); + if ( !rc ) + { + vuart_op->evtchn = info.evtchn; + rc = __copy_to_guest(u_domctl, domctl, 1); + } + } + else + rc = - EPERM; + + break; + + default: + rc = -EINVAL; + break; + } + + return rc; + } default: { int rc; diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h index f7cbc0a..0da8aa6 100644 --- a/xen/include/public/domctl.h +++ b/xen/include/public/domctl.h @@ -36,6 +36,7 @@ #include "grant_table.h" #include "hvm/save.h" #include "memory.h" +#include "event_channel.h" #define XEN_DOMCTL_INTERFACE_VERSION 0x0000000e @@ -1138,6 +1139,15 @@ struct xen_domctl_psr_cat_op { uint32_t target; /* IN */ uint64_t data; /* IN/OUT */ }; + +struct xen_domctl_vuart_op { +#define XEN_DOMCTL_VUART_OP_INIT_VPL011 0 + uint32_t cmd; /* XEN_DOMCTL_VUART_OP_* */ + uint32_t console_domid; /* IN */ + xen_pfn_t gfn; /* IN */ + evtchn_port_t evtchn; /* OUT */ +}; + typedef struct xen_domctl_psr_cat_op xen_domctl_psr_cat_op_t; DEFINE_XEN_GUEST_HANDLE(xen_domctl_psr_cat_op_t); @@ -1218,6 +1228,7 @@ struct xen_domctl { #define XEN_DOMCTL_monitor_op 77 #define XEN_DOMCTL_psr_cat_op 78 #define XEN_DOMCTL_soft_reset 79 +#define XEN_DOMCTL_vuart_op 80 #define XEN_DOMCTL_gdbsx_guestmemio 1000 #define XEN_DOMCTL_gdbsx_pausevcpu 1001 #define XEN_DOMCTL_gdbsx_unpausevcpu 1002 @@ -1280,6 +1291,7 @@ struct xen_domctl { struct xen_domctl_psr_cmt_op psr_cmt_op; struct xen_domctl_monitor_op monitor_op; struct xen_domctl_psr_cat_op psr_cat_op; + struct xen_domctl_vuart_op vuart_op; uint8_t pad[128]; } u; };