From: Roger Pau Monne <roger.pau@citrix.com>
To: <xen-devel@lists.xenproject.org>
Cc: Andrew Cooper <andrew.cooper3@citrix.com>,
Roger Pau Monne <roger.pau@citrix.com>,
Ian Jackson <iwj@xenproject.org>, Wei Liu <wl@xen.org>,
Anthony PERARD <anthony.perard@citrix.com>
Subject: [PATCH 21/21] libs/guest: (re)move xc_cpu_policy_apply_cpuid
Date: Tue, 23 Mar 2021 10:58:49 +0100 [thread overview]
Message-ID: <20210323095849.37858-22-roger.pau@citrix.com> (raw)
In-Reply-To: <20210323095849.37858-1-roger.pau@citrix.com>
Move the logic from xc_cpu_policy_apply_cpuid into libxl, now that the
xc_cpu_policy_* helpers allow modifying a cpu policy. Having xenguest
parsing CPUID data in xend format was a layering violation, and by
moving such parsing into libxl directly we can get rid of
xc_xend_cpuid, as libxl will now implement it's own private type for
storing CPUID information, which currently matches xc_xend_cpuid.
Note the function logic is moved as-is, but requires adapting to the
libxl coding style.
No functional change intended.
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
---
tools/include/libxl.h | 4 +-
tools/include/xenctrl.h | 30 -------
tools/libs/guest/xg_cpuid_x86.c | 125 ---------------------------
tools/libs/light/libxl_cpuid.c | 135 +++++++++++++++++++++++++++++-
tools/libs/light/libxl_internal.h | 26 ++++++
5 files changed, 160 insertions(+), 160 deletions(-)
diff --git a/tools/include/libxl.h b/tools/include/libxl.h
index ae7fe27c1f2..923a931fa67 100644
--- a/tools/include/libxl.h
+++ b/tools/include/libxl.h
@@ -1376,9 +1376,9 @@ void libxl_bitmap_dispose(libxl_bitmap *map);
/*
* libxl_cpuid_policy is opaque in the libxl ABI. Users of both libxl and
- * libxc may not make assumptions about xc_xend_cpuid.
+ * libxc may not make assumptions about libxl__cpuid_policy.
*/
-typedef struct xc_xend_cpuid libxl_cpuid_policy;
+typedef struct libxl__cpuid_policy libxl_cpuid_policy;
typedef libxl_cpuid_policy * libxl_cpuid_policy_list;
void libxl_cpuid_dispose(libxl_cpuid_policy_list *cpuid_list);
int libxl_cpuid_policy_list_length(const libxl_cpuid_policy_list *l);
diff --git a/tools/include/xenctrl.h b/tools/include/xenctrl.h
index 5a576f72b4d..a57e32513d4 100644
--- a/tools/include/xenctrl.h
+++ b/tools/include/xenctrl.h
@@ -1864,32 +1864,6 @@ int xc_domain_debug_control(xc_interface *xch,
#if defined(__i386__) || defined(__x86_64__)
-/*
- * CPUID policy data, expressed in the legacy XEND format.
- *
- * Policy is an array of strings, 32 chars long:
- * policy[0] = eax
- * policy[1] = ebx
- * policy[2] = ecx
- * policy[3] = edx
- *
- * The format of the string is the following:
- * '1' -> force to 1
- * '0' -> force to 0
- * 'x' -> we don't care (use default)
- * 'k' -> pass through host value
- * 's' -> legacy alias for 'k'
- */
-struct xc_xend_cpuid {
- union {
- struct {
- uint32_t leaf, subleaf;
- };
- uint32_t input[2];
- };
- char *policy[4];
-};
-
int xc_mca_op(xc_interface *xch, struct xen_mc *mc);
int xc_mca_op_inject_v2(xc_interface *xch, unsigned int flags,
xc_cpumap_t cpumap, unsigned int nr_cpus);
@@ -2617,10 +2591,6 @@ int xc_cpu_policy_make_compatible(xc_interface *xch, xc_cpu_policy_t policy,
int xc_cpu_policy_topology(xc_interface *xch, xc_cpu_policy_t policy,
bool hvm);
-/* Apply an xc_xend_cpuid object to the policy. */
-int xc_cpu_policy_apply_cpuid(xc_interface *xch, xc_cpu_policy_t policy,
- const struct xc_xend_cpuid *cpuid, bool hvm);
-
/* Apply a featureset to the policy. */
int xc_cpu_policy_apply_featureset(xc_interface *xch, xc_cpu_policy_t policy,
const uint32_t *featureset,
diff --git a/tools/libs/guest/xg_cpuid_x86.c b/tools/libs/guest/xg_cpuid_x86.c
index dffb9923b33..51b0ab66a80 100644
--- a/tools/libs/guest/xg_cpuid_x86.c
+++ b/tools/libs/guest/xg_cpuid_x86.c
@@ -258,131 +258,6 @@ static int set_domain_cpu_policy(xc_interface *xch, uint32_t domid,
return ret;
}
-int xc_cpu_policy_apply_cpuid(xc_interface *xch, xc_cpu_policy_t policy,
- const struct xc_xend_cpuid *cpuid, bool hvm)
-{
- int rc;
- xc_cpu_policy_t host = NULL, max = NULL;
-
- host = xc_cpu_policy_init();
- max = xc_cpu_policy_init();
- if ( !host || !max )
- {
- PERROR("Failed to init policies");
- rc = -ENOMEM;
- goto out;
- }
-
- /* Get the domain's max policy. */
- rc = xc_cpu_policy_get_system(xch, hvm ? XEN_SYSCTL_cpu_policy_hvm_max
- : XEN_SYSCTL_cpu_policy_pv_max,
- max);
- if ( rc )
- {
- PERROR("Failed to obtain %s max policy", hvm ? "hvm" : "pv");
- goto out;
- }
-
- /* Get the host policy. */
- rc = xc_cpu_policy_get_system(xch, XEN_SYSCTL_cpu_policy_host, host);
- if ( rc )
- {
- PERROR("Failed to obtain host policy");
- goto out;
- }
-
- rc = -EINVAL;
- for ( ; cpuid->leaf != XEN_CPUID_INPUT_UNUSED; ++cpuid )
- {
- xen_cpuid_leaf_t cur_leaf;
- xen_cpuid_leaf_t max_leaf;
- xen_cpuid_leaf_t host_leaf;
-
- rc = xc_cpu_policy_get_cpuid(xch, policy, cpuid->leaf, cpuid->subleaf,
- &cur_leaf);
- if ( rc )
- {
- ERROR("Failed to get current policy leaf %#x subleaf %#x",
- cpuid->leaf, cpuid->subleaf);
- goto out;
- }
- rc = xc_cpu_policy_get_cpuid(xch, max, cpuid->leaf, cpuid->subleaf,
- &max_leaf);
- if ( rc )
- {
- ERROR("Failed to get max policy leaf %#x subleaf %#x",
- cpuid->leaf, cpuid->subleaf);
- goto out;
- }
- rc = xc_cpu_policy_get_cpuid(xch, host, cpuid->leaf, cpuid->subleaf,
- &host_leaf);
- if ( rc )
- {
- ERROR("Failed to get host policy leaf %#x subleaf %#x",
- cpuid->leaf, cpuid->subleaf);
- goto out;
- }
-
- for ( unsigned int i = 0; i < ARRAY_SIZE(cpuid->policy); i++ )
- {
- uint32_t *cur_reg = &cur_leaf.a + i;
- const uint32_t *max_reg = &max_leaf.a + i;
- const uint32_t *host_reg = &host_leaf.a + i;
-
- if ( cpuid->policy[i] == NULL )
- continue;
-
- for ( unsigned int j = 0; j < 32; j++ )
- {
- bool val;
-
- switch ( cpuid->policy[i][j] )
- {
- case '1':
- val = true;
- break;
-
- case '0':
- val = false;
- break;
-
- case 'x':
- val = test_bit(31 - j, max_reg);
- break;
-
- case 'k':
- case 's':
- val = test_bit(31 - j, host_reg);
- break;
-
- default:
- ERROR("Bad character '%c' in policy[%d] string '%s'",
- cpuid->policy[i][j], i, cpuid->policy[i]);
- goto out;
- }
-
- clear_bit(31 - j, cur_reg);
- if ( val )
- set_bit(31 - j, cur_reg);
- }
- }
-
- rc = xc_cpu_policy_update_cpuid(xch, policy, &cur_leaf, 1);
- if ( rc )
- {
- PERROR("Failed to set policy leaf %#x subleaf %#x",
- cpuid->leaf, cpuid->subleaf);
- goto out;
- }
- }
-
- out:
- xc_cpu_policy_destroy(max);
- xc_cpu_policy_destroy(host);
-
- return rc;
-}
-
xc_cpu_policy_t xc_cpu_policy_init(void)
{
xc_cpu_policy_t policy = calloc(1, sizeof(*policy));
diff --git a/tools/libs/light/libxl_cpuid.c b/tools/libs/light/libxl_cpuid.c
index f1418382b62..ffa256b62e2 100644
--- a/tools/libs/light/libxl_cpuid.c
+++ b/tools/libs/light/libxl_cpuid.c
@@ -291,7 +291,7 @@ int libxl_cpuid_parse_config(libxl_cpuid_policy_list *cpuid, const char* str)
char *sep, *val, *endptr;
int i;
const struct cpuid_flags *flag;
- struct xc_xend_cpuid *entry;
+ struct libxl__cpuid_policy *entry;
unsigned long num;
char flags[33], *resstr;
@@ -369,7 +369,7 @@ int libxl_cpuid_parse_config_xend(libxl_cpuid_policy_list *cpuid,
char *endptr;
unsigned long value;
uint32_t leaf, subleaf = XEN_CPUID_INPUT_UNUSED;
- struct xc_xend_cpuid *entry;
+ struct libxl__cpuid_policy *entry;
/* parse the leaf number */
value = strtoul(str, &endptr, 0);
@@ -419,6 +419,135 @@ int libxl_cpuid_parse_config_xend(libxl_cpuid_policy_list *cpuid,
return 0;
}
+static int apply_cpuid(libxl_ctx *ctx, xc_cpu_policy_t policy,
+ libxl_cpuid_policy_list cpuid, bool hvm)
+{
+ GC_INIT(ctx);
+ int rc;
+ xc_cpu_policy_t host = NULL, max = NULL;
+
+ host = xc_cpu_policy_init();
+ max = xc_cpu_policy_init();
+ if (!host || !max) {
+ LOG(ERROR, "Failed to init policies");
+ rc = ERROR_FAIL;
+ goto out;
+ }
+
+ /* Get the domain's max policy. */
+ rc = xc_cpu_policy_get_system(ctx->xch, hvm ? XEN_SYSCTL_cpu_policy_hvm_max
+ : XEN_SYSCTL_cpu_policy_pv_max,
+ max);
+ if (rc) {
+ LOGE(ERROR, "Failed to obtain %s max policy", hvm ? "hvm" : "pv");
+ rc = ERROR_FAIL;
+ goto out;
+ }
+
+ /* Get the host policy. */
+ rc = xc_cpu_policy_get_system(ctx->xch, XEN_SYSCTL_cpu_policy_host, host);
+ if (rc) {
+ LOGE(ERROR, "Failed to obtain host policy");
+ rc = ERROR_FAIL;
+ goto out;
+ }
+
+ for (; cpuid->leaf != XEN_CPUID_INPUT_UNUSED; ++cpuid) {
+ xen_cpuid_leaf_t cur_leaf;
+ xen_cpuid_leaf_t max_leaf;
+ xen_cpuid_leaf_t host_leaf;
+
+ rc = xc_cpu_policy_get_cpuid(ctx->xch, policy, cpuid->leaf,
+ cpuid->subleaf, &cur_leaf);
+ if (rc) {
+ LOGE(ERROR, "Failed to get current policy leaf %#x subleaf %#x",
+ cpuid->leaf, cpuid->subleaf);
+ rc = ERROR_FAIL;
+ goto out;
+ }
+ rc = xc_cpu_policy_get_cpuid(ctx->xch, max, cpuid->leaf, cpuid->subleaf,
+ &max_leaf);
+ if (rc) {
+ LOGE(ERROR, "Failed to get max policy leaf %#x subleaf %#x",
+ cpuid->leaf, cpuid->subleaf);
+ rc = ERROR_FAIL;
+ goto out;
+ }
+ rc = xc_cpu_policy_get_cpuid(ctx->xch, host, cpuid->leaf,
+ cpuid->subleaf, &host_leaf);
+ if (rc) {
+ LOGE(ERROR,"Failed to get host policy leaf %#x subleaf %#x",
+ cpuid->leaf, cpuid->subleaf);
+ rc = ERROR_FAIL;
+ goto out;
+ }
+
+ for (unsigned int i = 0; i < ARRAY_SIZE(cpuid->policy); i++)
+ {
+ uint32_t *cur_reg = &cur_leaf.a + i;
+ const uint32_t *max_reg = &max_leaf.a + i;
+ const uint32_t *host_reg = &host_leaf.a + i;
+
+ if (cpuid->policy[i] == NULL)
+ continue;
+
+#define test_bit(i, r) !!(*(r) & (1u << (i)))
+#define set_bit(i, r) (*(r) |= (1u << (i)))
+#define clear_bit(i, r) (*(r) &= ~(1u << (i)))
+ for (unsigned int j = 0; j < 32; j++) {
+ bool val;
+
+ switch (cpuid->policy[i][j]) {
+ case '1':
+ val = true;
+ break;
+
+ case '0':
+ val = false;
+ break;
+
+ case 'x':
+ val = test_bit(31 - j, max_reg);
+ break;
+
+ case 'k':
+ case 's':
+ val = test_bit(31 - j, host_reg);
+ break;
+
+ default:
+ LOG(ERROR,"Bad character '%c' in policy[%d] string '%s'",
+ cpuid->policy[i][j], i, cpuid->policy[i]);
+ rc = ERROR_FAIL;
+ goto out;
+ }
+
+ clear_bit(31 - j, cur_reg);
+ if (val)
+ set_bit(31 - j, cur_reg);
+ }
+#undef clear_bit
+#undef set_bit
+#undef test_bit
+ }
+
+ rc = xc_cpu_policy_update_cpuid(ctx->xch, policy, &cur_leaf, 1);
+ if ( rc )
+ {
+ LOGE(ERROR,"Failed to set policy leaf %#x subleaf %#x",
+ cpuid->leaf, cpuid->subleaf);
+ rc = ERROR_FAIL;
+ goto out;
+ }
+ }
+
+ out:
+ xc_cpu_policy_destroy(max);
+ xc_cpu_policy_destroy(host);
+ GC_FREE;
+ return rc;
+}
+
int libxl__cpuid_legacy(libxl_ctx *ctx, uint32_t domid, bool restore,
libxl_domain_build_info *info)
{
@@ -535,7 +664,7 @@ int libxl__cpuid_legacy(libxl_ctx *ctx, uint32_t domid, bool restore,
}
/* Apply the bits from info->cpuid if any. */
- rc = xc_cpu_policy_apply_cpuid(ctx->xch, policy, info->cpuid, hvm);
+ rc = apply_cpuid(ctx, policy, info->cpuid, hvm);
if (rc) {
LOGE(ERROR, "Failed to apply CPUID changes");
rc = ERROR_FAIL;
diff --git a/tools/libs/light/libxl_internal.h b/tools/libs/light/libxl_internal.h
index 53b8939fb5a..5b9a220004a 100644
--- a/tools/libs/light/libxl_internal.h
+++ b/tools/libs/light/libxl_internal.h
@@ -2050,6 +2050,32 @@ typedef yajl_gen_status (*libxl__gen_json_callback)(yajl_gen hand, void *);
_hidden char *libxl__object_to_json(libxl_ctx *ctx, const char *type,
libxl__gen_json_callback gen, void *p);
+/*
+ * CPUID policy data, expressed in the internal libxl format.
+ *
+ * Policy is an array of strings, 32 chars long:
+ * policy[0] = eax
+ * policy[1] = ebx
+ * policy[2] = ecx
+ * policy[3] = edx
+ *
+ * The format of the string is the following:
+ * '1' -> force to 1
+ * '0' -> force to 0
+ * 'x' -> we don't care (use default)
+ * 'k' -> pass through host value
+ * 's' -> legacy alias for 'k'
+ */
+struct libxl__cpuid_policy {
+ union {
+ struct {
+ uint32_t leaf, subleaf;
+ };
+ uint32_t input[2];
+ };
+ char *policy[4];
+};
+
_hidden int libxl__cpuid_legacy(libxl_ctx *ctx, uint32_t domid, bool retore,
libxl_domain_build_info *info);
--
2.30.1
next prev parent reply other threads:[~2021-03-23 10:08 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-23 9:58 [PATCH 00/21] libs/guest: new CPUID/MSR interface Roger Pau Monne
2021-03-23 9:58 ` [PATCH 01/21] libxl: don't ignore the return value from xc_cpuid_apply_policy Roger Pau Monne
2021-03-30 15:21 ` Jan Beulich
2021-03-30 15:38 ` Andrew Cooper
2021-03-31 18:12 ` Andrew Cooper
2021-03-23 9:58 ` [PATCH 02/21] libs/guest: rename xc_get_cpu_policy_size to xc_cpu_policy_get_size Roger Pau Monne
2021-03-31 19:03 ` Andrew Cooper
2021-03-23 9:58 ` [PATCH 03/21] libs/guest: introduce xc_cpu_policy_t Roger Pau Monne
2021-03-31 20:10 ` Andrew Cooper
2021-04-01 8:48 ` Roger Pau Monné
2021-03-23 9:58 ` [PATCH 04/21] libs/guest: introduce helper to fetch a system cpu policy Roger Pau Monne
2021-03-30 15:35 ` Jan Beulich
2021-04-01 13:56 ` Andrew Cooper
2021-03-23 9:58 ` [PATCH 05/21] libs/guest: introduce helper to fetch a domain " Roger Pau Monne
2021-03-30 15:37 ` Jan Beulich
2021-03-31 11:06 ` Roger Pau Monné
2021-04-01 13:32 ` Andrew Cooper
2021-03-23 9:58 ` [PATCH 06/21] libs/guest: introduce helper to serialize a " Roger Pau Monne
2021-03-23 9:58 ` [PATCH 07/21] tools: switch existing users of xc_get_{system,domain}_cpu_policy Roger Pau Monne
2021-03-23 9:58 ` [PATCH 08/21] libs/guest: introduce a helper to apply a cpu policy to a domain Roger Pau Monne
2021-03-23 9:58 ` [PATCH 09/21] libs/guest: allow fetching a specific CPUID leaf from a cpu policy Roger Pau Monne
2021-04-01 14:47 ` Andrew Cooper
2021-04-08 15:53 ` Roger Pau Monné
2021-03-23 9:58 ` [PATCH 10/21] libs/guest: allow fetching a specific MSR entry " Roger Pau Monne
2021-03-23 9:58 ` [PATCH 11/21] libs/guest: allow updating a cpu policy CPUID data Roger Pau Monne
2021-03-30 15:56 ` Jan Beulich
2021-03-31 12:47 ` Roger Pau Monné
2021-04-01 14:55 ` Andrew Cooper
2021-03-23 9:58 ` [PATCH 12/21] libs/guest: allow updating a cpu policy MSR data Roger Pau Monne
2021-03-23 9:58 ` [PATCH 13/21] libs/guest: switch users of xc_set_domain_cpu_policy Roger Pau Monne
2021-04-01 15:04 ` Andrew Cooper
2021-03-23 9:58 ` [PATCH 14/21] libs/guest: introduce helper to check cpu policy compatibility Roger Pau Monne
2021-03-30 16:02 ` Jan Beulich
2021-03-31 12:40 ` Roger Pau Monné
2021-03-31 14:57 ` Jan Beulich
2021-04-01 16:14 ` Andrew Cooper
2021-03-23 9:58 ` [PATCH 15/21] libs/guest: obtain a compatible cpu policy from two input ones Roger Pau Monne
2021-03-31 15:24 ` Jan Beulich
2021-04-01 16:26 ` Andrew Cooper
2021-04-09 10:56 ` Roger Pau Monné
2021-03-23 9:58 ` [PATCH 16/21] libs/guest: make a cpu policy compatible with older Xen versions Roger Pau Monne
2021-03-31 15:29 ` Jan Beulich
2021-04-01 16:31 ` Andrew Cooper
2021-03-23 9:58 ` [PATCH 17/21] libs/guest: introduce helper set cpu topology in cpu policy Roger Pau Monne
2021-04-01 17:22 ` Andrew Cooper
2021-03-23 9:58 ` [PATCH 18/21] libs/guest: rework xc_cpuid_xend_policy Roger Pau Monne
2021-03-23 9:58 ` [PATCH 19/21] libs/guest: apply a featureset into a cpu policy Roger Pau Monne
2021-03-23 9:58 ` [PATCH 20/21] libs/{light,guest}: implement xc_cpuid_apply_policy in libxl Roger Pau Monne
2021-04-01 17:44 ` Andrew Cooper
2021-04-09 14:57 ` Roger Pau Monné
2021-03-23 9:58 ` Roger Pau Monne [this message]
2021-04-01 17:53 ` [PATCH 21/21] libs/guest: (re)move xc_cpu_policy_apply_cpuid Andrew Cooper
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210323095849.37858-22-roger.pau@citrix.com \
--to=roger.pau@citrix.com \
--cc=andrew.cooper3@citrix.com \
--cc=anthony.perard@citrix.com \
--cc=iwj@xenproject.org \
--cc=wl@xen.org \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).