From: Andrew Cooper Date: Tue, 10 Sep 2019 15:59:20 +0000 (+0100) Subject: tools/libxc: Pre-cleanup for xc_cpuid_{set,apply_policy}() X-Git-Tag: archive/raspbian/4.14.0+80-gd101b417b7-1+rpi1^2~63^2~1451 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=53b4a87a4c32507d9db2d35c77bafb32fc3e0900;p=xen.git tools/libxc: Pre-cleanup for xc_cpuid_{set,apply_policy}() This patch is broken out just to simplify the following two. For xc_cpuid_set(), document how the 's' and 'k' options works because it is quite subtle. Replace a memset() with a for loop of 4 explicit NULL assigments. This mirrors the free()'s in the fail path. For xc_cpuid_apply_policy(), const-ify the featureset pointer. It isn't written to, and was never intended to be mutable. Drop three pieces of trailing whitespace. No functional change. Signed-off-by: Andrew Cooper Reviewed-by: Jan Beulich Release-acked-by: Juergen Gross --- diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index 0da437318e..f4431687b3 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -1800,7 +1800,7 @@ int xc_cpuid_set(xc_interface *xch, char **config_transformed); int xc_cpuid_apply_policy(xc_interface *xch, uint32_t domid, - uint32_t *featureset, + const uint32_t *featureset, unsigned int nr_features); int xc_mca_op(xc_interface *xch, struct xen_mc *mc); int xc_mca_op_inject_v2(xc_interface *xch, unsigned int flags, diff --git a/tools/libxc/xc_cpuid_x86.c b/tools/libxc/xc_cpuid_x86.c index b7f1940900..226edc0c34 100644 --- a/tools/libxc/xc_cpuid_x86.c +++ b/tools/libxc/xc_cpuid_x86.c @@ -1,5 +1,5 @@ /****************************************************************************** - * xc_cpuid_x86.c + * xc_cpuid_x86.c * * Compute cpuid of a domain. * @@ -336,7 +336,7 @@ static void cpuid(const unsigned int *input, unsigned int *regs) static int get_cpuid_domain_info(xc_interface *xch, uint32_t domid, struct cpuid_domain_info *info, - uint32_t *featureset, + const uint32_t *featureset, unsigned int nr_features) { struct xen_domctl domctl = {}; @@ -824,8 +824,7 @@ static void sanitise_featureset(struct cpuid_domain_info *info) } int xc_cpuid_apply_policy(xc_interface *xch, uint32_t domid, - uint32_t *featureset, - unsigned int nr_features) + const uint32_t *featureset, unsigned int nr_features) { struct cpuid_domain_info info = {}; unsigned int input[2] = { 0, 0 }, regs[4]; @@ -915,7 +914,7 @@ int xc_cpuid_apply_policy(xc_interface *xch, uint32_t domid, * 'k' -> pass through host value * 's' -> pass through the first time and then keep the same value * across save/restore and migration. - * + * * For 's' and 'x' the configuration is overwritten with the value applied. */ int xc_cpuid_set( @@ -926,7 +925,8 @@ int xc_cpuid_set( unsigned int i, j, regs[4], polregs[4]; struct cpuid_domain_info info = {}; - memset(config_transformed, 0, 4 * sizeof(*config_transformed)); + for ( i = 0; i < 4; ++i ) + config_transformed[i] = NULL; rc = get_cpuid_domain_info(xch, domid, &info, NULL, 0); if ( rc ) @@ -944,7 +944,7 @@ int xc_cpuid_set( regs[i] = polregs[i]; continue; } - + config_transformed[i] = calloc(33, 1); /* 32 bits, NUL terminator. */ if ( config_transformed[i] == NULL ) { @@ -952,6 +952,13 @@ int xc_cpuid_set( goto fail; } + /* + * Notes for following this algorithm: + * + * While it will accept any leaf data, it only makes sense to use on + * feature leaves. regs[] initially contains the host values. This, + * with the fall-through chain, is how the 's' and 'k' options work. + */ for ( j = 0; j < 32; j++ ) { unsigned char val = !!((regs[i] & (1U << (31 - j))));