From patchwork Wed Aug 9 20:34:09 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "lan,Tianyu" X-Patchwork-Id: 9892665 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 3465860350 for ; Thu, 10 Aug 2017 02:44:14 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 040AC28174 for ; Thu, 10 Aug 2017 02:44:14 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id ECCBA28497; Thu, 10 Aug 2017 02:44:13 +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=-2.7 required=2.0 tests=BAYES_00, DATE_IN_PAST_06_12, RCVD_IN_DNSWL_MED 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 76B9228174 for ; Thu, 10 Aug 2017 02:44:13 +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 1dfdPc-00015L-9k; Thu, 10 Aug 2017 02:41: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 1dfdPa-00013t-KE for xen-devel@lists.xen.org; Thu, 10 Aug 2017 02:41:26 +0000 Received: from [85.158.143.35] by server-3.bemta-6.messagelabs.com id 8D/A8-03044-6D7CB895; Thu, 10 Aug 2017 02:41:26 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrLLMWRWlGSWpSXmKPExsXS1tYhr3v1eHe kQftHaYslHxezODB6HN39mymAMYo1My8pvyKBNePS+ZnMBduNKpZ/d2tgXKjWxcjJISRQKXHl +Tl2EFtCgFfiyLIZrBC2v8SsS21AcS6gmg5GiZednSwgCTYBdYkTiycygtgiAtIS1z5fZgQpY ha4yihxett85i5GDg5hgRSJ2VN0QEwWAVWJyzfVQcp5BVwkDuzugtqlIDHl4XtmEJtTwFVi6p atTBD3uEisWz6NcQIj7wJGhlWM6sWpRWWpRbrGeklFmekZJbmJmTm6hgZmermpxcWJ6ak5iUn Fesn5uZsYgYHAAAQ7GDv+OR1ilORgUhLl7WjojhTiS8pPqcxILM6ILyrNSS0+xCjDwaEkwdt9 DCgnWJSanlqRlpkDDEmYtAQHj5IIrxFImre4IDG3ODMdInWK0Zhjw+r1X5g4Xk34/41JiCUvP y9VSpx3CUipAEhpRmke3CBYrFxilJUS5mUEOk2IpyC1KDezBFX+FaM4B6OSMO8nkCk8mXklcP teAZ3CBHRKhG8nyCkliQgpqQbG+P6E1HvfFAM9dz9ntvkefeqYffLZTZn78jSWepyweZAc0ZF xJetCrfDniX5r/v5m7Qk6kbolhW1X18z/zJ9Ke3e/tFmnZ/307b+ZF7SqEg/rSnhfXChTWjXj tSdjwZm32/XLHLKUhd9FzzT32jWz3bp2379+k/cz4q1PltZ2PawLELAwWXFeiaU4I9FQi7moO BEAwxUNUZACAAA= X-Env-Sender: tianyu.lan@intel.com X-Msg-Ref: server-8.tower-21.messagelabs.com!1502332873!77126429!3 X-Originating-IP: [134.134.136.31] X-SpamReason: No, hits=1.3 required=7.0 tests=BODY_RANDOM_LONG, DATE_IN_PAST_06_12 X-StarScan-Received: X-StarScan-Version: 9.4.45; banners=-,-,- X-VirusChecked: Checked Received: (qmail 63095 invoked from network); 10 Aug 2017 02:41:25 -0000 Received: from mga06.intel.com (HELO mga06.intel.com) (134.134.136.31) by server-8.tower-21.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 10 Aug 2017 02:41:25 -0000 Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga104.jf.intel.com with ESMTP; 09 Aug 2017 19:41:24 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.41,349,1498546800"; d="scan'208";a="298209012" Received: from sky-ws.sh.intel.com (HELO localhost) ([10.239.48.141]) by fmsmga004.fm.intel.com with ESMTP; 09 Aug 2017 19:41:22 -0700 From: Lan Tianyu To: xen-devel@lists.xen.org Date: Wed, 9 Aug 2017 16:34:09 -0400 Message-Id: <1502310866-10450-9-git-send-email-tianyu.lan@intel.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1502310866-10450-1-git-send-email-tianyu.lan@intel.com> References: <1502310866-10450-1-git-send-email-tianyu.lan@intel.com> Cc: Lan Tianyu , kevin.tian@intel.com, wei.liu2@citrix.com, andrew.cooper3@citrix.com, ian.jackson@eu.citrix.com, julien.grall@arm.com, jbeulich@suse.com, Chao Gao Subject: [Xen-devel] [PATCH V2 8/25] tools/libxl: Add a user configurable parameter to control vIOMMU attributes 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 From: Chao Gao A field, viommu_info, is added to struct libxl_domain_build_info. Several attributes can be specified by guest config file for virtual IOMMU. These attributes are used for DMAR construction and vIOMMU creation. Signed-off-by: Chao Gao Signed-off-by: Lan Tianyu --- docs/man/xl.cfg.pod.5.in | 34 ++++++++++++++++++++++- tools/libxl/libxl_types.idl | 16 +++++++++++ tools/xl/xl_parse.c | 66 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 115 insertions(+), 1 deletion(-) diff --git a/docs/man/xl.cfg.pod.5.in b/docs/man/xl.cfg.pod.5.in index 79cb2ea..f259e22 100644 --- a/docs/man/xl.cfg.pod.5.in +++ b/docs/man/xl.cfg.pod.5.in @@ -1545,7 +1545,39 @@ Do not provide a VM generation ID. See also "Virtual Machine Generation ID" by Microsoft: L -=back +=back + +=item B + +Specifies the vIOMMU which are to be provided to the guest. + +B has the form C where: + +=over 4 + +=item B + +Possible Bs are: + +=over 4 + +=item B + +Currently there is only one valid type: + +(x86 only) "intel_vtd" means providing a emulated Intel VT-d to the guest. + +=item B + +Specifies whether the vIOMMU should support interrupt remapping +and default 'true'. + +=item B + +Specifies whether the vIOMMU should support x2apic mode and default 'true'. +Only valid for "intel_vtd". + +=back =head3 Guest Virtual Time Controls diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index 8a9849c..7abd70c 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -450,6 +450,21 @@ libxl_altp2m_mode = Enumeration("altp2m_mode", [ (3, "limited"), ], init_val = "LIBXL_ALTP2M_MODE_DISABLED") +libxl_viommu_type = Enumeration("viommu_type", [ + (1, "intel_vtd"), + ]) + +libxl_viommu_info = Struct("viommu_info", [ + ("u", KeyedUnion(None, libxl_viommu_type, "type", + [("intel_vtd", Struct(None, [ + ("x2apic", libxl_defbool)])) + ])), + ("intremap", libxl_defbool), + ("cap", uint64), + ("base_addr", uint64), + ("len", uint64), + ]) + libxl_domain_build_info = Struct("domain_build_info",[ ("max_vcpus", integer), ("avail_vcpus", libxl_bitmap), @@ -506,6 +521,7 @@ libxl_domain_build_info = Struct("domain_build_info",[ # 65000 which is reserved by the toolstack. ("device_tree", string), ("acpi", libxl_defbool), + ("viommu", libxl_viommu_info), ("u", KeyedUnion(None, libxl_domain_type, "type", [("hvm", Struct(None, [("firmware", string), ("bios", libxl_bios_type), diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c index 5c2bf17..11c4eb2 100644 --- a/tools/xl/xl_parse.c +++ b/tools/xl/xl_parse.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -30,6 +31,9 @@ extern void set_default_nic_values(libxl_device_nic *nic); +#define VIOMMU_VTD_BASE_ADDR 0xfed90000ULL +#define VIOMMU_VTD_REGISTER_LEN 0x1000ULL + #define ARRAY_EXTEND_INIT__CORE(array,count,initfn,more) \ ({ \ typeof((count)) array_extend_old_count = (count); \ @@ -804,6 +808,61 @@ int parse_usbdev_config(libxl_device_usbdev *usbdev, char *token) return 0; } +/* Parses viommu data and adds info into viommu + * Returns 1 if the input doesn't form a valid viommu + * or parsed values are not correct. Successful parse returns 0 */ +static int parse_viommu_config(libxl_viommu_info *viommu, const char *info) +{ + char *ptr, *oparg, *saveptr = NULL, *buf = xstrdup(info); + + ptr = strtok_r(buf, ",", &saveptr); + if (MATCH_OPTION("type", ptr, oparg)) { + if (!strcmp(oparg, "intel_vtd")) { + viommu->type = LIBXL_VIOMMU_TYPE_INTEL_VTD; + } else { + fprintf(stderr, "Invalid viommu type: %s\n", oparg); + return 1; + } + } else { + fprintf(stderr, "viommu type should be set first: %s\n", oparg); + return 1; + } + + ptr = strtok_r(NULL, ",", &saveptr); + if (MATCH_OPTION("intremap", ptr, oparg)) { + libxl_defbool_set(&viommu->intremap, !!strtoul(oparg, NULL, 0)); + } + + if (viommu->type == LIBXL_VIOMMU_TYPE_INTEL_VTD) { + for (ptr = strtok_r(NULL, ",", &saveptr); ptr; + ptr = strtok_r(NULL, ",", &saveptr)) { + if (MATCH_OPTION("x2apic", ptr, oparg)) { + libxl_defbool_set(&viommu->u.intel_vtd.x2apic, + !!strtoul(oparg, NULL, 0)); + } else { + fprintf(stderr, "Unknown string `%s' in viommu spec\n", ptr); + return 1; + } + } + + if (libxl_defbool_is_default(viommu->intremap)) + libxl_defbool_set(&viommu->intremap, true); + + if (!libxl_defbool_val(viommu->intremap)) { + fprintf(stderr, "Cannot create one virtual VTD without intremap\n"); + return 1; + } + + /* Set default values to unexposed fields */ + viommu->base_addr = VIOMMU_VTD_BASE_ADDR; + viommu->len = VIOMMU_VTD_REGISTER_LEN; + + /* Set desired capbilities */ + viommu->cap = VIOMMU_CAP_IRQ_REMAPPING; + } + return 0; +} + void parse_config_data(const char *config_source, const char *config_data, int config_len, @@ -1037,6 +1096,13 @@ void parse_config_data(const char *config_source, xlu_cfg_get_defbool(config, "driver_domain", &c_info->driver_domain, 0); xlu_cfg_get_defbool(config, "acpi", &b_info->acpi, 0); + if (!xlu_cfg_get_string(config, "viommu", &buf, 0)) { + if (parse_viommu_config(&b_info->viommu, buf)) { + fprintf(stderr, "ERROR: invalid viommu setting\n"); + exit (1); + } + } + switch(b_info->type) { case LIBXL_DOMAIN_TYPE_HVM: kernel_basename = libxl_basename(b_info->kernel);