[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v3 02/13] libs/guest: allow fetching a specific CPUID leaf from a cpu policy
Introduce an interface that returns a specific leaf/subleaf from a cpu policy in xen_cpuid_leaf_t format. This is useful to callers can peek data from the opaque xc_cpu_policy_t type. No caller of the interface introduced on this patch. Note that callers of find_leaf need to be slightly adjusted to use the new helper parameters. Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> --- Changes since v1: - Use find leaf. --- tools/include/xenctrl.h | 3 +++ tools/libs/guest/xg_cpuid_x86.c | 38 ++++++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/tools/include/xenctrl.h b/tools/include/xenctrl.h index 27cec1b93ff..cbca7209e34 100644 --- a/tools/include/xenctrl.h +++ b/tools/include/xenctrl.h @@ -2608,6 +2608,9 @@ int xc_cpu_policy_set_domain(xc_interface *xch, uint32_t domid, int xc_cpu_policy_serialise(xc_interface *xch, const xc_cpu_policy_t policy, xen_cpuid_leaf_t *leaves, uint32_t *nr_leaves, xen_msr_entry_t *msrs, uint32_t *nr_msrs); +int xc_cpu_policy_get_cpuid(xc_interface *xch, const xc_cpu_policy_t policy, + uint32_t leaf, uint32_t subleaf, + xen_cpuid_leaf_t *out); int xc_get_cpu_levelling_caps(xc_interface *xch, uint32_t *caps); int xc_get_cpu_featureset(xc_interface *xch, uint32_t index, diff --git a/tools/libs/guest/xg_cpuid_x86.c b/tools/libs/guest/xg_cpuid_x86.c index 0c9b3a960f0..de27826f415 100644 --- a/tools/libs/guest/xg_cpuid_x86.c +++ b/tools/libs/guest/xg_cpuid_x86.c @@ -280,9 +280,9 @@ static int compare_leaves(const void *l, const void *r) static xen_cpuid_leaf_t *find_leaf( xen_cpuid_leaf_t *leaves, unsigned int nr_leaves, - const struct xc_xend_cpuid *xend) + unsigned int leaf, unsigned int subleaf) { - const xen_cpuid_leaf_t key = { xend->leaf, xend->subleaf }; + const xen_cpuid_leaf_t key = { leaf, subleaf }; return bsearch(&key, leaves, nr_leaves, sizeof(*leaves), compare_leaves); } @@ -365,9 +365,12 @@ static int xc_cpuid_xend_policy( rc = -EINVAL; for ( ; xend->leaf != XEN_CPUID_INPUT_UNUSED; ++xend ) { - xen_cpuid_leaf_t *cur_leaf = find_leaf(cur, nr_cur, xend); - const xen_cpuid_leaf_t *def_leaf = find_leaf(def, nr_def, xend); - const xen_cpuid_leaf_t *host_leaf = find_leaf(host, nr_host, xend); + xen_cpuid_leaf_t *cur_leaf = find_leaf(cur, nr_cur, + xend->leaf, xend->subleaf); + const xen_cpuid_leaf_t *def_leaf = find_leaf(def, nr_def, + xend->leaf, xend->subleaf); + const xen_cpuid_leaf_t *host_leaf = find_leaf(host, nr_host, xend->leaf, + xend->subleaf); if ( cur_leaf == NULL || def_leaf == NULL || host_leaf == NULL ) { @@ -822,3 +825,28 @@ int xc_cpu_policy_serialise(xc_interface *xch, const xc_cpu_policy_t p, errno = 0; return 0; } + +int xc_cpu_policy_get_cpuid(xc_interface *xch, const xc_cpu_policy_t policy, + uint32_t leaf, uint32_t subleaf, + xen_cpuid_leaf_t *out) +{ + unsigned int nr_leaves = ARRAY_SIZE(policy->leaves); + xen_cpuid_leaf_t *tmp; + int rc; + + rc = xc_cpu_policy_serialise(xch, policy, policy->leaves, &nr_leaves, + NULL, 0); + if ( rc ) + return rc; + + tmp = find_leaf(policy->leaves, nr_leaves, leaf, subleaf); + if ( !tmp ) + { + /* Unable to find a matching leaf. */ + errno = ENOENT; + return -1; + } + + *out = *tmp; + return 0; +} -- 2.31.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |