From patchwork Thu Apr 7 11:57:24 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Cooper X-Patchwork-Id: 8771631 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 99F0D9FC82 for ; Thu, 7 Apr 2016 12:01:02 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 87D0620222 for ; Thu, 7 Apr 2016 12:01:01 +0000 (UTC) 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.kernel.org (Postfix) with ESMTPS id B502D201CD for ; Thu, 7 Apr 2016 12:00:58 +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 1ao8aN-0000Bt-OK; Thu, 07 Apr 2016 11:58:55 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ao8aM-0000Aa-8o for xen-devel@lists.xen.org; Thu, 07 Apr 2016 11:58:54 +0000 Received: from [85.158.139.211] by server-6.bemta-5.messagelabs.com id B3/57-02479-D7B46075; Thu, 07 Apr 2016 11:58:53 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFupnkeJIrShJLcpLzFFi42JxWrrBXrfGmy3 coGWPpcWSj4tZHBg9ju7+zRTAGMWamZeUX5HAmjFvVT9jwS3biqWfvrE0MG7X7WLk5JAQ8Jc4 cHIHC4jNJqAvsfvFJyYQW0RAXeJ0x0VWEJtZIFziUF8LM4gtLBAmce/OCjCbRUBF4vOC/2A2r 4CXxPcF79ggZspJnD/+EyzOCRRvevoazBYS8JR4v+Y5I4StJnGt/xI7RK+gxMmZT1ggdklIHH zxAqieA2gOt8TfbvsJjHyzkFTNQlK1gJFpFaN6cWpRWWqRrrFeUlFmekZJbmJmjq6hgalebmp xcWJ6ak5iUrFecn7uJkZgQDEAwQ7Gvf+cDjFKcjApifJOd2ULF+JLyk+pzEgszogvKs1JLT7E KMPBoSTBa+QFlBMsSk1PrUjLzAGGNkxagoNHSYQ3HiTNW1yQmFucmQ6ROsWoKCXOGwCSEABJZ JTmwbXB4ukSo6yUMC8j0CFCPAWpRbmZJajyrxjFORiVhCG282TmlcBNfwW0mAlo8QV+sMUliQ gpqQbGFWWnw0OytJPrts7tUhMX+aw1uXqpUM3NQysjmiwsL31J9/y0oZRhzYzGGwYeMezXXKc x1oudtnA6sjDxzwKznb9sPBWvXzyjKs3kPNPpa/ujXXwzpWbs09hgcTzk5dE5gmVrQ5RjPz+y 4O4SyQ78Innn7P9/POIdr1sreQ4eia9WmGewSzZUiaU4I9FQi7moOBEArFO7j6ICAAA= X-Env-Sender: prvs=898633312=Andrew.Cooper3@citrix.com X-Msg-Ref: server-16.tower-206.messagelabs.com!1460030330!19032702!2 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: 8.28; banners=-,-,- X-VirusChecked: Checked Received: (qmail 34687 invoked from network); 7 Apr 2016 11:58:52 -0000 Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63) by server-16.tower-206.messagelabs.com with RC4-SHA encrypted SMTP; 7 Apr 2016 11:58:52 -0000 X-IronPort-AV: E=Sophos;i="5.24,449,1454976000"; d="scan'208";a="352170378" From: Andrew Cooper To: Xen-devel Date: Thu, 7 Apr 2016 12:57:24 +0100 Message-ID: <1460030246-30153-20-git-send-email-andrew.cooper3@citrix.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1460030246-30153-1-git-send-email-andrew.cooper3@citrix.com> References: <1460030246-30153-1-git-send-email-andrew.cooper3@citrix.com> MIME-Version: 1.0 X-DLP: MIA1 Cc: Andrew Cooper , Ian Jackson Subject: [Xen-devel] [PATCH v5 19/21] tools/libxc: Wire a featureset through to cpuid policy logic 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: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" 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 Jackson 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 3715f51..f5a034a 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -1985,7 +1985,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 0cffb36..a92f5e4 100644 --- a/tools/libxc/xc_cpuid_x86.c +++ b/tools/libxc/xc_cpuid_x86.c @@ -166,6 +166,9 @@ struct cpuid_domain_info bool pvh; uint64_t xfeature_mask; + uint32_t *featureset; + unsigned int nr_features; + /* PV-only information. */ bool pv64; @@ -197,11 +200,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); @@ -223,6 +229,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; @@ -247,6 +270,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 { @@ -257,11 +288,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) @@ -789,16 +833,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; @@ -821,7 +867,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. */ @@ -849,7 +895,9 @@ int xc_cpuid_apply_policy(xc_interface *xch, domid_t domid) break; } - return 0; + out: + free_cpuid_domain_info(&info); + return rc; } /* @@ -938,9 +986,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); @@ -991,7 +1039,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++ ) @@ -999,5 +1047,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 e87f14f..22741d5 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 d53870f..812a905 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);