From patchwork Tue Jun 6 17:25:21 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bhupinder Thakur X-Patchwork-Id: 103172 Delivered-To: patch@linaro.org Received: by 10.140.91.77 with SMTP id y71csp1536655qgd; Tue, 6 Jun 2017 10:27:46 -0700 (PDT) X-Received: by 10.36.29.150 with SMTP id 144mr17613737itj.71.1496770066179; Tue, 06 Jun 2017 10:27:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1496770066; cv=none; d=google.com; s=arc-20160816; b=GeFv/3LEHgzVLqbAoh/xTTIj1Ai/Bo8Lep9gNZDkJYtcncFRGXc1P66T/gopLTQvd0 48otzKMy0w87ToSxvswTLCzUnpGAFP4OkKsUxwgFRMSk2rJvqoQEnM8t+whxHTrqfD56 TE+jlj02p9J6oUprqFuWK2LD8ciyhlY576PPQncRrWOBDn+xT5fkA1JtjUP54rxbOfkG gJdpc9izeX+VVU8oFywVXiUO2w/tMinAI6gfe2o5m2H1zIISTX83S/FtJH859F6twZFh A5QklUYvbV1M1j/XZ69m2LM/YS11A2KIz2kS0wuXgTSrxHd742spP/2IXjAzww4nh625 wCrg== 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=7TIcO2o0NiLMdhRqY2J0lA0ZZitdcMt8Um6Wj+oP6Ww=; b=eCINzYkql0DVGme2x7kYjhL7rA19ysvewtAh9D6gQrMNW/iIyETUWGviGd1nF/Qmze vz4P4Rbyxf12wx8lkOSO6jlUg1PqgrlhVvJdXABgw/5p/2KbZ+RhPFtgeAD4kUZWP8GW KQl186E5rJapAlZHgC3iMPdIBFNRBJY2EBQv4rqqF9iiH7DwH9Dm04zFfLg4mXA29GYA R42M1FADYhfqFmMF/Vpu7UK1P/lTvB2y99pYmrgtOHiEU/J4tGZxSEDk7ZHynWXRmo7L EHpzckoLmjUoe6AtQ2uDdor7I78KZcrJUy1AAppXOFPtp2TnLgCEd6eItil1nNesE8JW 63pw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org; 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 88si12351846iol.215.2017.06.06.10.27.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 06 Jun 2017 10:27:46 -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; 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 1dIIEv-0001eD-PQ; Tue, 06 Jun 2017 17:25:57 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dIIEt-0001cu-W3 for xen-devel@lists.xenproject.org; Tue, 06 Jun 2017 17:25:56 +0000 Received: from [85.158.137.68] by server-7.bemta-3.messagelabs.com id 30/46-02196-3A5E6395; Tue, 06 Jun 2017 17:25:55 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrGIsWRWlGSWpSXmKPExsVyMfTAat1FT80 iDQ52yFp83zKZyYHR4/CHKywBjFGsmXlJ+RUJrBmfXyxjLpgYWnFsVTNjA+Mb2y5GLg4hgRmM Eme//WQEcVgE5jFLPDvfwgriSAj0s0r83nuIpYuRA8hJk/j7xLeLkRPIrJR40rCRHcQWEtCSO HpqNivEpGYmicvdV8Dq2QRMJGZ1SIDUiAgoSdxbNZkJpIZZYD6jRNOkXjaQhLBAiMTqBe2MID aLgKrE2nmzwGxeAW+JxYv+sUIsk5O4ea6TGcTmFPCRmHl+CSPEYm+JPQ1tjBMYBRYwMqxi1Ch OLSpLLdI1MtVLKspMzyjJTczM0TU0MNbLTS0uTkxPzUlMKtZLzs/dxAgMrXoGBsYdjK0n/A4x SnIwKYnyRl4yixTiS8pPqcxILM6ILyrNSS0+xCjDwaEkwXv/CVBOsCg1PbUiLTMHGOQwaQkOH iUR3skPgNK8xQWJucWZ6RCpU4zGHFeurPvCxDHlwPYvTEIsefl5qVLivCtAJgmAlGaU5sENgk XfJUZZKWFeRgYGBiGegtSi3MwSVPlXjOIcjErCvCkgU3gy80rg9r0COoUJ6BS+SyYgp5QkIqS kGhh7LNImndq0Zv2nA3M3vak/sMzko/GHV6+rBPP5V294dubfzysLujWP12zNCCiXdTXfaGi4 bmpsUbaDat2lLQfjGpMPfUv4pW7KMcNi74FYAcVLMX9O/1qjF2pQdOTgdF+Og+mHT8ZWTLt5v SVmQ4hT1g6GsBOPm8K7n7BHxTTp7S+Z2xjUJ3VSiaU4I9FQi7moOBEAd/Ue47kCAAA= X-Env-Sender: bhupinder.thakur@linaro.org X-Msg-Ref: server-2.tower-31.messagelabs.com!1496769953!92673486!1 X-Originating-IP: [209.85.192.171] X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG X-StarScan-Received: X-StarScan-Version: 9.4.19; banners=-,-,- X-VirusChecked: Checked Received: (qmail 24600 invoked from network); 6 Jun 2017 17:25:54 -0000 Received: from mail-pf0-f171.google.com (HELO mail-pf0-f171.google.com) (209.85.192.171) by server-2.tower-31.messagelabs.com with AES128-GCM-SHA256 encrypted SMTP; 6 Jun 2017 17:25:54 -0000 Received: by mail-pf0-f171.google.com with SMTP id 9so100034631pfj.1 for ; Tue, 06 Jun 2017 10:25:54 -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=7Jt2e94WLGukUYgBe9hFM67FAHDdWS9/aM+xrVXX5CI=; b=fGYQbob4z15YWCo2LrwCIcmcx0ElCjarWjkBvZxegv11GkWgZp1CCHveQLijFwQiuj uYtSTwoa+rz6RbPBWJgGA8xV76BhMKaq9Waw11YmejAmWRUSCUlYJrHOXN6BuwgWa/DB I3HECcqDbpQZbP8Ebn3VEqXVcPJiC8ca9KO1E= 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=7Jt2e94WLGukUYgBe9hFM67FAHDdWS9/aM+xrVXX5CI=; b=OpOyaijbTJ8cLV88wEhP24b1v1lRadUauPuTU9lK77KdwbDkxNfH2qohKqbQeo4yR/ o6aM6Sblzo1awa0s6r6dUWgcTMoH/AOTmJglF+90ZPdCd+YEuoNBFSxtj43sULyBfiVW tGouIxrVV1n+GFOThtunGeFCHueMebjjUEDkG8MUOKU1pjrqom1t3Y8w+GHvJFyVrYyz WHZxyPD9tfkaGWf1wXGJt7WYd+jGwyQHLnLGo1FqyilQPjSdKDwZIm57ng+Hjj6JbQuR 8iqT6SMZ42FjAhNwfo1vg0U+2aS/nsX14LoUWHSR4xuNX9Kvq7qTGrOcqtiGlVY2gCL1 a0QQ== X-Gm-Message-State: AODbwcAD3A67tfMtu/4FTmjZgAZjZoLDrbNeZ7PbHG+X/XjdxmySwrdc kIMLT76+y8tL8cvN+eR3mQ== X-Received: by 10.98.200.66 with SMTP id z63mr15072469pff.18.1496769952461; Tue, 06 Jun 2017 10:25:52 -0700 (PDT) Received: from blr-ubuntu-linaro.wlan.qualcomm.com ([103.5.19.18]) by smtp.gmail.com with ESMTPSA id 62sm6031632pfr.90.2017.06.06.10.25.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 06 Jun 2017 10:25:52 -0700 (PDT) From: Bhupinder Thakur To: xen-devel@lists.xenproject.org Date: Tue, 6 Jun 2017 22:55:21 +0530 Message-Id: <1496769929-23355-7-git-send-email-bhupinder.thakur@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1496769929-23355-1-git-send-email-bhupinder.thakur@linaro.org> References: <1496769929-23355-1-git-send-email-bhupinder.thakur@linaro.org> Cc: Wei Liu , Julien Grall , Stefano Stabellini , Ian Jackson Subject: [Xen-devel] [PATCH 06/14 v4] 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: ij CC: wl CC: ss CC: jg 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 | 17 +++++++++++++++++ tools/libxc/xc_domain.c | 23 ++++++++++++++++++++++ tools/libxl/libxl_arch.h | 7 +++++++ tools/libxl/libxl_arm.c | 19 +++++++++++++++++++ tools/libxl/libxl_dom.c | 6 +++++- tools/libxl/libxl_x86.c | 8 ++++++++ xen/arch/arm/domain.c | 2 ++ xen/arch/arm/domctl.c | 44 ++++++++++++++++++++++++++++++++++++++++--- xen/include/public/domctl.h | 12 ++++++++++++ 9 files changed, 134 insertions(+), 4 deletions(-) diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index 1629f41..77425dd 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -884,6 +884,23 @@ int xc_vcpu_getcontext(xc_interface *xch, uint32_t domid, uint32_t vcpu, vcpu_guest_context_any_t *ctxt); +/** + * 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); /** * This function returns information about the XSAVE state of a particular diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c index 00909ad4..a8efd5e 100644 --- a/tools/libxc/xc_domain.c +++ b/tools/libxc/xc_domain.c @@ -343,6 +343,29 @@ int xc_domain_get_guest_width(xc_interface *xch, uint32_t domid, return 0; } +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; +} + 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..d1ca9c6 100644 --- a/tools/libxl/libxl_arch.h +++ b/tools/libxl/libxl_arch.h @@ -32,6 +32,13 @@ _hidden int libxl__arch_domain_create(libxl__gc *gc, libxl_domain_config *d_config, uint32_t domid); +/* arch specific internal domain creation finish function */ +_hidden +int libxl__arch_domain_create_finish(libxl__gc *gc, + libxl_domain_build_info *info, + uint32_t domid, + libxl__domain_build_state *state); + /* setup arch specific hardware description, i.e. DTB on ARM */ _hidden int libxl__arch_domain_init_hw_description(libxl__gc *gc, diff --git a/tools/libxl/libxl_arm.c b/tools/libxl/libxl_arm.c index d842d88..b60dfa9 100644 --- a/tools/libxl/libxl_arm.c +++ b/tools/libxl/libxl_arm.c @@ -106,6 +106,25 @@ int libxl__arch_domain_create(libxl__gc *gc, libxl_domain_config *d_config, return 0; } +int libxl__arch_domain_create_finish(libxl__gc *gc, + libxl_domain_build_info *info, + uint32_t domid, + libxl__domain_build_state *state) +{ + int ret = 0; + + if ( info->arch_arm.vuart && + (ret = xc_dom_vpl011_init(CTX->xch, + domid, + state->console_domid, + xc_get_vuart_gfn(), + &state->vuart_port)) != 0 ) { + LOG(ERROR, "xc_dom_vpl011_init failed\n"); + } + + return ret; +} + int libxl__arch_extra_memory(libxl__gc *gc, const libxl_domain_build_info *info, uint64_t *out) diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index 5d914a5..187c5bd 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -587,7 +587,10 @@ retry_transaction: goto retry_transaction; xs_introduce_domain(ctx->xsh, domid, state->store_mfn, state->store_port); free(vm_path); - return 0; + + rc = libxl__arch_domain_create_finish(gc, info, domid, state); + + return rc; } static int set_vnuma_info(libxl__gc *gc, uint32_t domid, @@ -788,6 +791,7 @@ int libxl__build_pv(libxl__gc *gc, uint32_t domid, if (xc_dom_translated(dom)) { state->console_mfn = dom->console_pfn; state->store_mfn = dom->xenstore_pfn; + state->vuart_gfn = dom->vuart_gfn; } else { state->console_mfn = xc_dom_p2m(dom, dom->console_pfn); state->store_mfn = xc_dom_p2m(dom, dom->xenstore_pfn); diff --git a/tools/libxl/libxl_x86.c b/tools/libxl/libxl_x86.c index 455f6f0..3544028 100644 --- a/tools/libxl/libxl_x86.c +++ b/tools/libxl/libxl_x86.c @@ -358,6 +358,14 @@ out: return ret; } +int libxl__arch_domain_create_finish(libxl__gc *gc, + libxl_domain_build_info *info, + uint32_t domid, + libxl__domain_build_state *state) +{ + return 0; +} + int libxl__arch_extra_memory(libxl__gc *gc, const libxl_domain_build_info *info, uint64_t *out) diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index 76310ed..9e150ba 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -665,6 +665,8 @@ fail: void arch_domain_destroy(struct domain *d) { + 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 971caec..741679b 100644 --- a/xen/arch/arm/domctl.c +++ b/xen/arch/arm/domctl.c @@ -5,13 +5,15 @@ */ #include -#include +#include #include -#include +#include #include #include +#include +#include +#include #include -#include void arch_get_domain_info(const struct domain *d, struct xen_domctl_getdomaininfo *info) @@ -119,6 +121,42 @@ 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 e6cf211..c6ff458 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 0x0000000d @@ -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; };