Introduce an interface that returns a specific MSR entry from a cpu policy in xen_msr_entry_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. Signed-off-by: Roger Pau Monné <roger....@citrix.com> --- tools/include/xenctrl.h | 2 ++ tools/libs/guest/xg_cpuid_x86.c | 41 +++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/tools/include/xenctrl.h b/tools/include/xenctrl.h index 983e4c11d93..ab34df1dc98 100644 --- a/tools/include/xenctrl.h +++ b/tools/include/xenctrl.h @@ -2611,6 +2611,8 @@ int xc_cpu_policy_serialise(xc_interface *xch, const xc_cpu_policy_t policy, 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_cpu_policy_get_msr(xc_interface *xch, const xc_cpu_policy_t policy, + uint32_t msr, xen_msr_entry_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 a1e1bf10d5c..091aeb70c9c 100644 --- a/tools/libs/guest/xg_cpuid_x86.c +++ b/tools/libs/guest/xg_cpuid_x86.c @@ -925,3 +925,44 @@ int xc_cpu_policy_get_cpuid(xc_interface *xch, const xc_cpu_policy_t policy, free(leaves); return rc; } + +int xc_cpu_policy_get_msr(xc_interface *xch, const xc_cpu_policy_t policy, + uint32_t msr, xen_msr_entry_t *out) +{ + unsigned int nr_leaves, nr_msrs, i; + xen_msr_entry_t *msrs; + int rc = xc_cpu_policy_get_size(xch, &nr_leaves, &nr_msrs); + + if ( rc ) + { + PERROR("Failed to obtain policy info size"); + return -1; + } + + msrs = calloc(nr_msrs, sizeof(*msrs)); + if ( !msrs ) + { + PERROR("Failed to allocate resources"); + errno = ENOMEM; + return -1; + } + + rc = xc_cpu_policy_serialise(xch, policy, NULL, 0, msrs, &nr_msrs); + if ( rc ) + goto out; + + for ( i = 0; i < nr_msrs; i++ ) + if ( msrs[i].idx == msr ) + { + *out = msrs[i]; + goto out; + } + + /* Unable to find a matching MSR. */ + errno = ENOENT; + rc = -1; + + out: + free(msrs); + return rc; +} -- 2.30.1