From patchwork Fri Feb 5 13:42:21 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Cooper X-Patchwork-Id: 8234731 Return-Path: X-Original-To: patchwork-xen-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id D0C199F38B for ; Fri, 5 Feb 2016 14:04:30 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id B92DC203A1 for ; Fri, 5 Feb 2016 14:04:29 +0000 (UTC) Received: from lists.xen.org (lists.xenproject.org [50.57.142.19]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 3BABF20395 for ; Fri, 5 Feb 2016 14:04:28 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xen.org) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1aRgxi-0000Oj-Nq; Fri, 05 Feb 2016 14:02:14 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1aRgxf-0000Ih-DO for xen-devel@lists.xen.org; Fri, 05 Feb 2016 14:02:11 +0000 Received: from [85.158.139.211] by server-13.bemta-5.messagelabs.com id C3/11-09478-26BA4B65; Fri, 05 Feb 2016 14:02:10 +0000 X-Env-Sender: prvs=8364524b4=Andrew.Cooper3@citrix.com X-Msg-Ref: server-6.tower-206.messagelabs.com!1454680924!20279727!3 X-Originating-IP: [66.165.176.63] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAzMDYwNDg=\n, received_headers: No Received headers X-StarScan-Received: X-StarScan-Version: 7.35.1; banners=-,-,- X-VirusChecked: Checked Received: (qmail 58245 invoked from network); 5 Feb 2016 14:02:10 -0000 Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63) by server-6.tower-206.messagelabs.com with RC4-SHA encrypted SMTP; 5 Feb 2016 14:02:10 -0000 X-IronPort-AV: E=Sophos;i="5.22,400,1449532800"; d="scan'208";a="336333922" From: Andrew Cooper To: Xen-devel Date: Fri, 5 Feb 2016 13:42:21 +0000 Message-ID: <1454679743-18133-29-git-send-email-andrew.cooper3@citrix.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1454679743-18133-1-git-send-email-andrew.cooper3@citrix.com> References: <1454679743-18133-1-git-send-email-andrew.cooper3@citrix.com> MIME-Version: 1.0 X-DLP: MIA2 Cc: Andrew Cooper , Ian Jackson , Ian Campbell , Wei Liu Subject: [Xen-devel] [PATCH v2 28/30] tools/libxc: Wire a featureset through to cpuid policy logic X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Later changes will cause the cpuid generation logic to seed their information from a featureset. This patch adds the infrastructure to specify a featureset, and will obtain the appropriate default from Xen if omitted. Signed-off-by: Andrew Cooper Acked-by: Wei Liu --- CC: Ian Campbell CC: Ian Jackson CC: Wei Liu v2: * Modify existing call rather than introducing a new one. * Fix up in-tree callsites. --- tools/libxc/include/xenctrl.h | 4 ++- tools/libxc/xc_cpuid_x86.c | 69 ++++++++++++++++++++++++++++++++----- tools/libxl/libxl_cpuid.c | 2 +- tools/ocaml/libs/xc/xenctrl_stubs.c | 2 +- tools/python/xen/lowlevel/xc/xc.c | 2 +- 5 files changed, 66 insertions(+), 13 deletions(-) diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index 1da372d..230f834 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -1927,7 +1927,9 @@ int xc_cpuid_set(xc_interface *xch, const char **config, char **config_transformed); int xc_cpuid_apply_policy(xc_interface *xch, - domid_t domid); + domid_t domid, + uint32_t *featureset, + unsigned int nr_features); void xc_cpuid_to_str(const unsigned int *regs, char **strs); /* some strs[] may be NULL if ENOMEM */ int xc_mca_op(xc_interface *xch, struct xen_mc *mc); diff --git a/tools/libxc/xc_cpuid_x86.c b/tools/libxc/xc_cpuid_x86.c index 7ef37d2..e762d73 100644 --- a/tools/libxc/xc_cpuid_x86.c +++ b/tools/libxc/xc_cpuid_x86.c @@ -148,6 +148,9 @@ struct cpuid_domain_info bool pvh; uint64_t xfeature_mask; + uint32_t *featureset; + unsigned int nr_features; + /* PV-only information. */ bool pv64; @@ -179,11 +182,14 @@ static void cpuid(const unsigned int *input, unsigned int *regs) } static int get_cpuid_domain_info(xc_interface *xch, domid_t domid, - struct cpuid_domain_info *info) + struct cpuid_domain_info *info, + uint32_t *featureset, + unsigned int nr_features) { struct xen_domctl domctl = {}; xc_dominfo_t di; unsigned int in[2] = { 0, ~0U }, regs[4]; + unsigned int i, host_nr_features = xc_get_cpu_featureset_size(); int rc; cpuid(in, regs); @@ -205,6 +211,23 @@ static int get_cpuid_domain_info(xc_interface *xch, domid_t domid, info->hvm = di.hvm; info->pvh = di.pvh; + info->featureset = calloc(host_nr_features, sizeof(*info->featureset)); + if ( !info->featureset ) + return -ENOMEM; + + info->nr_features = host_nr_features; + + if ( featureset ) + { + memcpy(info->featureset, featureset, + min(host_nr_features, nr_features) * sizeof(*info->featureset)); + + /* Check for truncated set bits. */ + for ( i = nr_features; i < host_nr_features; ++i ) + if ( featureset[i] != 0 ) + return -EOPNOTSUPP; + } + /* Get xstate information. */ domctl.cmd = XEN_DOMCTL_getvcpuextstate; domctl.domain = domid; @@ -229,6 +252,14 @@ static int get_cpuid_domain_info(xc_interface *xch, domid_t domid, return rc; info->nestedhvm = !!val; + + if ( !featureset ) + { + rc = xc_get_cpu_featureset(xch, XEN_SYSCTL_cpu_featureset_hvm, + &host_nr_features, info->featureset); + if ( rc ) + return rc; + } } else { @@ -239,11 +270,24 @@ static int get_cpuid_domain_info(xc_interface *xch, domid_t domid, return rc; info->pv64 = (width == 8); + + if ( !featureset ) + { + rc = xc_get_cpu_featureset(xch, XEN_SYSCTL_cpu_featureset_pv, + &host_nr_features, info->featureset); + if ( rc ) + return rc; + } } return 0; } +static void free_cpuid_domain_info(struct cpuid_domain_info *info) +{ + free(info->featureset); +} + static void amd_xc_cpuid_policy(xc_interface *xch, const struct cpuid_domain_info *info, const unsigned int *input, unsigned int *regs) @@ -764,16 +808,18 @@ void xc_cpuid_to_str(const unsigned int *regs, char **strs) } } -int xc_cpuid_apply_policy(xc_interface *xch, domid_t domid) +int xc_cpuid_apply_policy(xc_interface *xch, domid_t domid, + uint32_t *featureset, + unsigned int nr_features) { struct cpuid_domain_info info = {}; unsigned int input[2] = { 0, 0 }, regs[4]; unsigned int base_max, ext_max; int rc; - rc = get_cpuid_domain_info(xch, domid, &info); + rc = get_cpuid_domain_info(xch, domid, &info, featureset, nr_features); if ( rc ) - return rc; + goto out; cpuid(input, regs); base_max = (regs[0] <= DEF_MAX_BASE) ? regs[0] : DEF_MAX_BASE; @@ -796,7 +842,7 @@ int xc_cpuid_apply_policy(xc_interface *xch, domid_t domid) { rc = xc_cpuid_do_domctl(xch, domid, input, regs); if ( rc ) - return rc; + goto out; } /* Intel cache descriptor leaves. */ @@ -824,7 +870,9 @@ int xc_cpuid_apply_policy(xc_interface *xch, domid_t domid) break; } - return 0; + out: + free_cpuid_domain_info(&info); + return rc; } /* @@ -913,9 +961,9 @@ int xc_cpuid_set( memset(config_transformed, 0, 4 * sizeof(*config_transformed)); - rc = get_cpuid_domain_info(xch, domid, &info); + rc = get_cpuid_domain_info(xch, domid, &info, NULL, 0); if ( rc ) - return rc; + goto out; cpuid(input, regs); @@ -966,7 +1014,7 @@ int xc_cpuid_set( rc = xc_cpuid_do_domctl(xch, domid, input, regs); if ( rc == 0 ) - return 0; + goto out; fail: for ( i = 0; i < 4; i++ ) @@ -974,5 +1022,8 @@ int xc_cpuid_set( free(config_transformed[i]); config_transformed[i] = NULL; } + + out: + free_cpuid_domain_info(&info); return rc; } diff --git a/tools/libxl/libxl_cpuid.c b/tools/libxl/libxl_cpuid.c index c66e912..fc20157 100644 --- a/tools/libxl/libxl_cpuid.c +++ b/tools/libxl/libxl_cpuid.c @@ -334,7 +334,7 @@ int libxl_cpuid_parse_config_xend(libxl_cpuid_policy_list *cpuid, void libxl_cpuid_apply_policy(libxl_ctx *ctx, uint32_t domid) { - xc_cpuid_apply_policy(ctx->xch, domid); + xc_cpuid_apply_policy(ctx->xch, domid, NULL, 0); } void libxl_cpuid_set(libxl_ctx *ctx, uint32_t domid, diff --git a/tools/ocaml/libs/xc/xenctrl_stubs.c b/tools/ocaml/libs/xc/xenctrl_stubs.c index e7adf37..5477df3 100644 --- a/tools/ocaml/libs/xc/xenctrl_stubs.c +++ b/tools/ocaml/libs/xc/xenctrl_stubs.c @@ -796,7 +796,7 @@ CAMLprim value stub_xc_domain_cpuid_apply_policy(value xch, value domid) #if defined(__i386__) || defined(__x86_64__) int r; - r = xc_cpuid_apply_policy(_H(xch), _D(domid)); + r = xc_cpuid_apply_policy(_H(xch), _D(domid), NULL, 0); if (r < 0) failwith_xc(_H(xch)); #else diff --git a/tools/python/xen/lowlevel/xc/xc.c b/tools/python/xen/lowlevel/xc/xc.c index c40a4e9..22a1c9f 100644 --- a/tools/python/xen/lowlevel/xc/xc.c +++ b/tools/python/xen/lowlevel/xc/xc.c @@ -731,7 +731,7 @@ static PyObject *pyxc_dom_set_policy_cpuid(XcObject *self, if ( !PyArg_ParseTuple(args, "i", &domid) ) return NULL; - if ( xc_cpuid_apply_policy(self->xc_handle, domid) ) + if ( xc_cpuid_apply_policy(self->xc_handle, domid, NULL, 0) ) return pyxc_error_to_exception(self->xc_handle); Py_INCREF(zero);