From patchwork Wed Sep 27 06:13:15 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bhupinder Thakur X-Patchwork-Id: 114343 Delivered-To: patch@linaro.org Received: by 10.140.106.117 with SMTP id d108csp4665533qgf; Tue, 26 Sep 2017 23:17:12 -0700 (PDT) X-Received: by 10.36.199.7 with SMTP id t7mr897261itg.65.1506493031984; Tue, 26 Sep 2017 23:17:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1506493031; cv=none; d=google.com; s=arc-20160816; b=oqVVuTdKIt8s04KO6xemppGEh8wgnQJANTQI4F+gLd+Q9/KPiob3V+f+n03zvF9sCD MKZEGifLgFhjOUDJTwWWTB5KufX+IXJZpeeYGd5OufGXT0kAvuyziY8NN3XHbtQaCSKz fPqH3L8kw2GCINi7XrCo5aF+lv/EuD2KTy1VidQNjj21op53YJA2630nQzVE20Xw4Nzj 0ZXu2mtM6zqSShL7QUi7R5j8e25cIRVeyj316KmPbZQNtcLbQIwWYOi4fwCa5JEw0LBw kL+HUOz6eC0sNvO5IuOiFCwTiNgvO+ftC0UAONAWXSfCv09Zdc9wMbYbGUULCZrmykMc 6mvw== 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=31xVjx3Gt3m+HoSg3xcv/D+A6NsG19giXqfllTn982g=; b=vvu6VjOMkD6M7wVA43CKyt3u+7ibLpMK8xQ8Pm1QHK1nS40kWGqE4UmTIvBs/TZDFY 8x2+g0caklPCXPKD2KoaLgRqFY8DXpKIycAsl3lKccQ0HlxkIoynoukGXDVnSeYEsQBv DFRULCcwMsuP7hJNZu4XU/wkED63JRAMkNbUaJ6ILZ6zgl+w6acO3mAZIcyOJVgg97BV ascQrpDqHalyHZ/i7lWm5FaVrkOASL50hrK7GNBywzEZS8nc2QmH+yFcCGw1JrvxbpJL 4oktKUuzOUGODSVjTMI5EIdkqAMR34PI4K+9TWUrKwk7H77wq5QLYNXHjxrlqqYN+3HG 1WNg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=ggsri5wG; 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 g67si9076888iof.390.2017.09.26.23.17.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 26 Sep 2017 23:17:11 -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.s=google header.b=ggsri5wG; 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 1dx5bU-0002UY-1A; Wed, 27 Sep 2017 06:13: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 1dx5bS-0002TE-UH for xen-devel@lists.xenproject.org; Wed, 27 Sep 2017 06:13:51 +0000 Received: from [85.158.139.211] by server-4.bemta-5.messagelabs.com id F8/79-09852-E914BC95; Wed, 27 Sep 2017 06:13:50 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrDIsWRWlGSWpSXmKPExsVyMfTAZt25jqc jDW7PFbP4vmUykwOjx+EPV1gCGKNYM/OS8isSWDNWfFzPVtCYXdGz+wJbA2ODXxcjF4eQwExG iQ8zfrN0MXJysAjMY5aYcpgXJCEh0M8q8exkAztIQkIgT+LX6jtQdprE1bl/GLsYOYDsConXh +tAwkICWhJHT81mhRi6gklizolfYDVsAiYSszokQGpEBJQk7q2azARiMws8Z5KYdkkHxBYWCJ VYe3gvG8QNqhKTFnxlBrF5Bbwl3s9ZyQaxVk7i5rlOsDingI/E6f7bbBB7vSUurexnncAouIC RYRWjRnFqUVlqka6hhV5SUWZ6RkluYmaOrqGBqV5uanFxYnpqTmJSsV5yfu4mRmC4MQDBDsam 7Z6HGCU5mJREeWv+n4oU4kvKT6nMSCzOiC8qzUktPsQow8GhJME7z+F0pJBgUWp6akVaZg4w8 GHSEhw8SiK810DSvMUFibnFmekQqVOM9hwX7lz6w8TxpfcGkDyw5xaQ7Lh59w+TEEtefl6qlD hvFUibAEhbRmke3FBYpF5ilJUS5mUEOlOIpyC1KDezBFX+FaM4B6OSMO9CkCk8mXklcLtfAZ3 FBHRW79QTIGeVJCKkpBoYDys833dpvdX9pVtEvrkazLmYnG53Z+/RPaGpops/hL53U6nZ/tep YOo73jQRHmbWW//vyfF5bd8gGxlfq6nSdY3xlLDkUtNvq64e1DvaPbXgssmJw0+mM/of2la6Z PXThV9nfcuYImx4lNHwovMmj4q5D5Wr8g6+qiupP1/zIUsxN+t90uOzl5VYijMSDbWYi4oTAc 1v8yPPAgAA X-Env-Sender: bhupinder.thakur@linaro.org X-Msg-Ref: server-5.tower-206.messagelabs.com!1506492828!111798189!1 X-Originating-IP: [209.85.192.179] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 9.4.45; banners=-,-,- X-VirusChecked: Checked Received: (qmail 10861 invoked from network); 27 Sep 2017 06:13:49 -0000 Received: from mail-pf0-f179.google.com (HELO mail-pf0-f179.google.com) (209.85.192.179) by server-5.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted SMTP; 27 Sep 2017 06:13:49 -0000 Received: by mail-pf0-f179.google.com with SMTP id g65so6739178pfe.13 for ; Tue, 26 Sep 2017 23:13:48 -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=R8iGMRMxgah35e8ImX4XxbhwshQ9CzZ+FqewgVRBYg8=; b=ggsri5wGl7agGYK80ACVW28VIzLaZP1AeY/IZuJO41kNf+nvTXnuWfAEx2s75/b+14 Hwnui5hf3G+H1LvE8D4tW/zuk3H3AeLnJW7tBmzjuwPR1EtRJ7jKp/qNPN1j7dt5kVzr u2Cwfkdkc+Lu/TogyBM9YamImMATFXpnqJ5P8= 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=R8iGMRMxgah35e8ImX4XxbhwshQ9CzZ+FqewgVRBYg8=; b=dfmrtZrSZExNEviaW5/UrI9BBTNFtYqNU5u/c77UDmlxuYZeLeZM8n5AH8+1yRbY/4 Uus63NuemgoWHC6K5twW4CmKArImtLTdOemqkbmzgPexI9jOUKqwGIMYivL4Tw31mgiX LFMhmhsSxnac9pweS0DhZ/6tjaVD4jXLhnDmUCJr2gYVV38UKDAB+XU1nYSpPk4QuxMr HNaPLgCqQhUvj+p3tQD+WsNTtpdESjlu9VG7O4pcwVfkJde0GKDRn5WQWgUKfbCzQNRL XhnGTcl6ZIuBj2aQKBmPvOnJBz4STqriBJ0XLJyS4Z30h3cfqQfMCKv359Kczej+LXpH 7rHw== X-Gm-Message-State: AHPjjUhCvQuHS1iqUV3cBWR23xxNEceCL/4uiSo0STCUjlGIG0hJI69o b9RcJQauKkU/M1OP26L4Y5r2yl0iI/A= X-Google-Smtp-Source: AOwi7QDzP0dkd5IBti1lOQsOkaC2r8mHyyEGCXTsx0izkiVajpwvt+4ksJMq9KqxTq2qJZE8HDChRQ== X-Received: by 10.99.181.23 with SMTP id y23mr333800pge.189.1506492827306; Tue, 26 Sep 2017 23:13:47 -0700 (PDT) Received: from blr-ubuntu-linaro.wlan.qualcomm.com (h3.248.139.40.ip.windstream.net. [40.139.248.3]) by smtp.gmail.com with ESMTPSA id s187sm18013485pgb.82.2017.09.26.23.13.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 26 Sep 2017 23:13:46 -0700 (PDT) From: Bhupinder Thakur To: xen-devel@lists.xenproject.org Date: Wed, 27 Sep 2017 11:43:15 +0530 Message-Id: <1506492816-25954-7-git-send-email-bhupinder.thakur@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1506492816-25954-1-git-send-email-bhupinder.thakur@linaro.org> References: <1506492816-25954-1-git-send-email-bhupinder.thakur@linaro.org> Cc: Stefano Stabellini , Wei Liu , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Jan Beulich Subject: [Xen-devel] [PATCH 06/27 v11] 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 Reviewed-by: Stefano Stabellini Acked-by: Wei Liu --- CC: Ian Jackson CC: Wei Liu CC: Andrew Cooper CC: George Dunlap CC: Jan Beulich CC: Konrad Rzeszutek Wilk CC: Stefano Stabellini CC: Tim Deegan CC: Julien Grall Changes since v9: - Initialized local variable in libxl__arch_build_dom_finish - Replaced __copy_to_guest with copy_to_guest - Added comment for console_domid field in vuart_op structure Changes since v8: - Added explicit padding in the vuart_op structure - Moved vuart_op structure after the PSR structure definition - The input fields moved before the output fields in vuart_op structure - Checking explicitly that padding fields are initialized to 0 Changes since v6: - Renamed the vuart initialization function to a generic name xc_dom_vuart_init - Used domid_t as a type instead of uint32_t for domid - Checking the vuart type explicitly against vpl011 enum value Changes since v5: - xc_dom_vpl011_init() will be compiled for both x86/arm architectures as there is nothing architecture specific in this function. This function will return error when called for x86. - Fixed coding style issues in libxl. 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 | 27 ++++++++++++++++++++++ tools/libxl/libxl_arch.h | 7 ++++++ tools/libxl/libxl_arm.c | 27 ++++++++++++++++++++++ tools/libxl/libxl_dom.c | 4 ++++ tools/libxl/libxl_x86.c | 8 +++++++ xen/arch/arm/domain.c | 6 +++++ xen/arch/arm/domctl.c | 52 +++++++++++++++++++++++++++++++++++++++++++ xen/include/public/domctl.h | 24 ++++++++++++++++++++ 9 files changed, 175 insertions(+) diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index 073fbc9..2086e71 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -886,6 +886,26 @@ int xc_vcpu_getcontext(xc_interface *xch, vcpu_guest_context_any_t *ctxt); /** + * This function initializes the vuart 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 type type of vuart + * @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_vuart_init(xc_interface *xch, + uint32_t type, + domid_t domid, + domid_t console_domid, + xen_pfn_t gfn, + evtchn_port_t *evtchn); + +/** * This function returns information about the XSAVE state of a particular * vcpu of a domain. If extstate->size and extstate->xfeature_mask are 0, * the call is considered a query to retrieve them and the buffer is not diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c index f40dc4f..f2e9f0c 100644 --- a/tools/libxc/xc_domain.c +++ b/tools/libxc/xc_domain.c @@ -343,6 +343,33 @@ int xc_domain_get_guest_width(xc_interface *xch, uint32_t domid, return 0; } +int xc_dom_vuart_init(xc_interface *xch, + uint32_t type, + domid_t domid, + domid_t console_domid, + xen_pfn_t gfn, + evtchn_port_t *evtchn) +{ + DECLARE_DOMCTL; + int rc = 0; + + memset(&domctl, 0, sizeof(domctl)); + + domctl.cmd = XEN_DOMCTL_vuart_op; + domctl.domain = domid; + domctl.u.vuart_op.cmd = XEN_DOMCTL_VUART_OP_INIT; + domctl.u.vuart_op.type = type; + 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..784ec7f 100644 --- a/tools/libxl/libxl_arch.h +++ b/tools/libxl/libxl_arch.h @@ -44,6 +44,13 @@ 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 */ +_hidden +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..6f5bc3c 100644 --- a/tools/libxl/libxl_arm.c +++ b/tools/libxl/libxl_arm.c @@ -1038,6 +1038,33 @@ 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 rc = 0, ret; + + if (info->arch_arm.vuart != LIBXL_VUART_TYPE_SBSA_UART) { + rc = 0; + goto out; + } + + ret = xc_dom_vuart_init(CTX->xch, + XEN_DOMCTL_VUART_TYPE_VPL011, + dom->guest_domid, + dom->console_domid, + dom->vuart_gfn, + &state->vuart_port); + if (ret < 0) { + rc = ERROR_FAIL; + LOG(ERROR, "xc_dom_vuart_init failed\n"); + } + +out: + return rc; +} + 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 e0f0d78..5f92023 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -702,6 +702,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 784ae39..0779087 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -874,6 +874,12 @@ int domain_relinquish_resources(struct domain *d) if ( ret ) return ret; + /* + * Release the resources allocated for vpl011 which were + * allocated via a DOMCTL call XEN_DOMCTL_vuart_op. + */ + domain_vpl011_deinit(d); + d->arch.relmem = RELMEM_xen; /* Fallthrough */ diff --git a/xen/arch/arm/domctl.c b/xen/arch/arm/domctl.c index 8232f44..4587c75 100644 --- a/xen/arch/arm/domctl.c +++ b/xen/arch/arm/domctl.c @@ -5,9 +5,11 @@ */ #include +#include #include #include #include +#include #include #include #include @@ -20,6 +22,29 @@ void arch_get_domain_info(const struct domain *d, info->flags |= XEN_DOMINF_hap; } +static int handle_vuart_init(struct domain *d, + struct xen_domctl_vuart_op *vuart_op) +{ + int rc; + struct vpl011_init_info info; + + info.console_domid = vuart_op->console_domid; + info.gfn = _gfn(vuart_op->gfn); + + if ( d->creation_finished ) + return -EPERM; + + if ( vuart_op->type != XEN_DOMCTL_VUART_TYPE_VPL011 ) + return -EOPNOTSUPP; + + rc = domain_vpl011_init(d, &info); + + if ( !rc ) + vuart_op->evtchn = info.evtchn; + + return rc; +} + long arch_do_domctl(struct xen_domctl *domctl, struct domain *d, XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) { @@ -119,6 +144,33 @@ 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; + unsigned int i; + struct xen_domctl_vuart_op *vuart_op = &domctl->u.vuart_op; + + /* check that structure padding must be 0. */ + for ( i = 0; i < sizeof(vuart_op->pad); i++ ) + if ( vuart_op->pad[i] ) + return -EINVAL; + + switch( vuart_op->cmd ) + { + case XEN_DOMCTL_VUART_OP_INIT: + rc = handle_vuart_init(d, vuart_op); + break; + + default: + rc = -EINVAL; + break; + } + + if ( !rc ) + rc = copy_to_guest(u_domctl, domctl, 1); + + return rc; + } default: { int rc; diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h index e2fd685..9dcc969 100644 --- a/xen/include/public/domctl.h +++ b/xen/include/public/domctl.h @@ -33,6 +33,7 @@ #endif #include "xen.h" +#include "event_channel.h" #include "grant_table.h" #include "hvm/save.h" #include "memory.h" @@ -1077,6 +1078,27 @@ struct xen_domctl_set_gnttab_limits { uint32_t maptrack_frames; /* IN */ }; +/* XEN_DOMCTL_vuart_op */ +struct xen_domctl_vuart_op { +#define XEN_DOMCTL_VUART_OP_INIT 0 + uint32_t cmd; /* XEN_DOMCTL_VUART_OP_* */ +#define XEN_DOMCTL_VUART_TYPE_VPL011 0 + uint32_t type; /* IN - type of vuart. + * Currently only vpl011 supported. + */ + uint64_aligned_t gfn; /* IN - guest gfn to be used as a + * ring buffer. + */ + domid_t console_domid; /* IN - domid of domain running the + * backend console. + */ + uint8_t pad[2]; + evtchn_port_t evtchn; /* OUT - remote port of the event + * channel used for sending + * ring buffer events. + */ +}; + struct xen_domctl { uint32_t cmd; #define XEN_DOMCTL_createdomain 1 @@ -1155,6 +1177,7 @@ struct xen_domctl { #define XEN_DOMCTL_psr_cat_op 78 #define XEN_DOMCTL_soft_reset 79 #define XEN_DOMCTL_set_gnttab_limits 80 +#define XEN_DOMCTL_vuart_op 81 #define XEN_DOMCTL_gdbsx_guestmemio 1000 #define XEN_DOMCTL_gdbsx_pausevcpu 1001 #define XEN_DOMCTL_gdbsx_unpausevcpu 1002 @@ -1218,6 +1241,7 @@ struct xen_domctl { struct xen_domctl_monitor_op monitor_op; struct xen_domctl_psr_cat_op psr_cat_op; struct xen_domctl_set_gnttab_limits set_gnttab_limits; + struct xen_domctl_vuart_op vuart_op; uint8_t pad[128]; } u; };