From patchwork Tue Jun 6 10:03:39 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bhupinder Thakur X-Patchwork-Id: 9768451 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id AB02F60364 for ; Tue, 6 Jun 2017 10:06:02 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 93F7B268AE for ; Tue, 6 Jun 2017 10:06:02 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 885AF2841E; Tue, 6 Jun 2017 10:06:02 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 5D10F268AE for ; Tue, 6 Jun 2017 10:06:01 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dIBL6-0003p2-JW; Tue, 06 Jun 2017 10:03:52 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dIBL5-0003oF-A7 for xen-devel@lists.xenproject.org; Tue, 06 Jun 2017 10:03:51 +0000 Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id 62/33-01999-60E76395; Tue, 06 Jun 2017 10:03:50 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpnkeJIrShJLcpLzFFi42Lxqg3W1mWuM4s 0mC9q8X3LZCYHRo/DH66wBDBGsWbmJeVXJLBmvPvbzVzwNaTiw7r3rA2MN2y7GLk4hASmMUq0 7pvADuKwCLQzS8x79xbMkRB4xyLR9LSFuYuRE8hJk9h6chcThF0lcW7fb0YQW0hAS+LoqdmsE KP2MUnsPHAWyOHgYBMwkZjVIQFSIyKgJHFv1WQmkBpmgfmMEk2TetlAEsICIRKrF7SDDWIRUJ U4+3g62AJeAW+JA/evQS2Wk7h5rpN5AiPfAkaGVYzqxalFZalFuiZ6SUWZ6RkluYmZObqGBqZ 6uanFxYnpqTmJScV6yfm5mxiBgcIABDsYb/U5H2KU5GBSEuWtTTCLFOJLyk+pzEgszogvKs1J LT7EKMPBoSTBO6kGKCdYlJqeWpGWmQMMWZi0BAePkgivciVQmre4IDG3ODMdInWKUZdj0oHtX 5iEWPLy81KlxHkngMwQACnKKM2DGwGLn0uMslLCvIxARwnxFKQW5WaWoMq/YhTnYFQS5u2vBp rCk5lXArfpFdARTEBH8F0yATmiJBEhJdXA6KSgPf38FNeP70yfZm5Y/Wr3X/GkntIFa9dM6rz QqOsQu1/NSH/LpCS75ab/I9fLJMet9yrQW9LbYyBf2Lr6j9+3uoqzQouPb9n52CVqYtX255lh XkrH5sdEaLk7Hsub0xCsabD9XudJDReGHeUV755LT9+40sqmZt+uf717lpzhbDl+YeaTeUosx RmJhlrMRcWJAO6kEdmaAgAA X-Env-Sender: bhupinder.thakur@linaro.org X-Msg-Ref: server-2.tower-206.messagelabs.com!1496743425!81433119!1 X-Originating-IP: [74.125.83.43] 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 13104 invoked from network); 6 Jun 2017 10:03:46 -0000 Received: from mail-pg0-f43.google.com (HELO mail-pg0-f43.google.com) (74.125.83.43) by server-2.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted SMTP; 6 Jun 2017 10:03:46 -0000 Received: by mail-pg0-f43.google.com with SMTP id k71so319258pgd.2 for ; Tue, 06 Jun 2017 03:03:46 -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; bh=JZqm5a5QsA6YQIP8b2DQIt9iXyl7eMRkRvI9W4aWH3c=; b=FAGZzqCbPDSr40OC2yUPN5T9Es107vKe1+R4dB3aehdOB1zD4t9sXRdKTFSh0JvLDd vUIYKRJ/Z4dF4TBYuQFP05Qoa8Qq4HCW5z8W9W00xjghSOokHZdhy+1xIdRUVXRUJZhL HKIkZ6crU0dzaaN+vbGNf57tjtpf4YWaoF3Xo= 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; bh=JZqm5a5QsA6YQIP8b2DQIt9iXyl7eMRkRvI9W4aWH3c=; b=qRB5LZYaBm2xPFIL5uZGYPxbRyGbAzUvEDt0xcnh1chCXeRNiLeiZzhVWEVY6aEXw8 tJk9OA5eSqRfYL3WY16UfYwe/iP7OStQtFo0eDqN1/7xsp8ORKo+G/HcIBz8Xm7NcGI1 hCeYAN3hA1EqbkqkkibKXwJiJiaA5Q5S6mW5aS/2ERY3NehtcOtUwf5EpuUpfxm5GOMA oRg/jsBp0BRkhy4PPIvd74pCfJoZ91QynqJSw+jIiwKHeZ+jGAlS8qbMQSgkUylDGiKz fUkRcZyvpcjqUUXu1KUGQRz7QX/H2oMuoGvta6mzhRHmYHFOMvmR4d4cPBEljNUqTUfQ hjVg== X-Gm-Message-State: AODbwcAXwvHei7HTWPHeC/XYCS4rNxv1L2nK5R5QfrAUbEyZDzIL2XAv +50pFTC10yYUS9mJZNoNCw== X-Received: by 10.101.73.202 with SMTP id t10mr25269590pgs.28.1496743424801; Tue, 06 Jun 2017 03:03:44 -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 64sm62706409pfi.111.2017.06.06.03.03.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 06 Jun 2017 03:03:44 -0700 (PDT) From: Bhupinder Thakur To: xen-devel@lists.xenproject.org Date: Tue, 6 Jun 2017 15:33:39 +0530 Message-Id: <1496743419-15734-1-git-send-email-bhupinder.thakur@linaro.org> X-Mailer: git-send-email 2.7.4 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" X-Virus-Scanned: ClamAV using ClamSMTP 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 --- 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; };