Add a new array field to libxl_cpuid_policy in order to store the MSR policies.
Note that libxl_cpuid_policy_list_{copy,length,parse_json,gen_json} are not adjusted to deal with the new MSR array now part of libxl_cpuid_policy_list. Adding the MSR data in the libxl_cpuid_policy_list type is done so that existing users can seamlessly pass MSR features as part of the CPUID data, without requiring the introduction of a separate domain_build_info field, and a new set of handlers functions. Signed-off-by: Roger Pau Monné <roger....@citrix.com> --- tools/include/libxl.h | 1 + tools/libs/light/libxl_cpuid.c | 31 +++++++++++++++++++------------ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/tools/include/libxl.h b/tools/include/libxl.h index 41e19f2af7f5..4e7b08ab5027 100644 --- a/tools/include/libxl.h +++ b/tools/include/libxl.h @@ -1461,6 +1461,7 @@ void libxl_bitmap_dispose(libxl_bitmap *map); */ typedef struct libxl_cpu_policy { struct xc_xend_cpuid *cpuid; + struct xc_msr *msr; } libxl_cpuid_policy; typedef libxl_cpuid_policy libxl_cpuid_policy_list; void libxl_cpuid_dispose(libxl_cpuid_policy_list *cpuid_list); diff --git a/tools/libs/light/libxl_cpuid.c b/tools/libs/light/libxl_cpuid.c index ded0d0b8bc15..7261c1f1fd82 100644 --- a/tools/libs/light/libxl_cpuid.c +++ b/tools/libs/light/libxl_cpuid.c @@ -21,20 +21,26 @@ int libxl__cpuid_policy_is_empty(libxl_cpuid_policy_list *pl) void libxl_cpuid_dispose(libxl_cpuid_policy_list *policy) { - int i, j; struct xc_xend_cpuid *cpuid_list = policy->cpuid; - if (cpuid_list == NULL) - return; - for (i = 0; cpuid_list[i].input[0] != XEN_CPUID_INPUT_UNUSED; i++) { - for (j = 0; j < 4; j++) - if (cpuid_list[i].policy[j] != NULL) { - free(cpuid_list[i].policy[j]); - cpuid_list[i].policy[j] = NULL; - } + if (cpuid_list) { + unsigned int i, j; + + for (i = 0; cpuid_list[i].input[0] != XEN_CPUID_INPUT_UNUSED; i++) { + for (j = 0; j < 4; j++) + if (cpuid_list[i].policy[j] != NULL) { + free(cpuid_list[i].policy[j]); + cpuid_list[i].policy[j] = NULL; + } + } + free(policy->cpuid); + policy->cpuid = NULL; + } + + if (policy->msr) { + free(policy->msr); + policy->msr = NULL; } - free(policy->cpuid); - policy->cpuid = NULL; return; } @@ -503,7 +509,8 @@ int libxl__cpuid_legacy(libxl_ctx *ctx, uint32_t domid, bool restore, info->tsc_mode == LIBXL_TSC_MODE_ALWAYS_EMULATE); r = xc_cpuid_apply_policy(ctx->xch, domid, restore, NULL, 0, - pae, itsc, nested_virt, info->cpuid.cpuid, NULL); + pae, itsc, nested_virt, info->cpuid.cpuid, + info->cpuid.msr); if (r) LOGEVD(ERROR, -r, domid, "Failed to apply CPUID policy"); -- 2.40.0