On Tue, Mar 30, 2021 at 05:56:35PM +0200, Jan Beulich wrote: > On 23.03.2021 10:58, Roger Pau Monne wrote: > > --- a/tools/libs/guest/xg_cpuid_x86.c > > +++ b/tools/libs/guest/xg_cpuid_x86.c > > @@ -966,3 +966,70 @@ int xc_cpu_policy_get_msr(xc_interface *xch, const > > xc_cpu_policy_t policy, > > free(msrs); > > return rc; > > } > > + > > +int xc_cpu_policy_update_cpuid(xc_interface *xch, xc_cpu_policy_t policy, > > + const xen_cpuid_leaf_t *leaves, > > + uint32_t nr) > > +{ > > + unsigned int err_leaf = -1, err_subleaf = -1; > > + unsigned int nr_leaves, nr_msrs, i, j; > > + xen_cpuid_leaf_t *current; > > + int rc = xc_cpu_policy_get_size(xch, &nr_leaves, &nr_msrs); > > + > > + if ( rc ) > > + { > > + PERROR("Failed to obtain policy info size"); > > + return -1; > > + } > > + > > + current = calloc(nr_leaves, sizeof(*current)); > > + if ( !current ) > > + { > > + PERROR("Failed to allocate resources"); > > + errno = ENOMEM; > > + return -1; > > + } > > + > > + rc = xc_cpu_policy_serialise(xch, policy, current, &nr_leaves, NULL, > > 0); > > + if ( rc ) > > + goto out; > > + > > + for ( i = 0; i < nr; i++ ) > > + { > > + const xen_cpuid_leaf_t *update = &leaves[i]; > > + > > + for ( j = 0; j < nr_leaves; j++ ) > > + if ( current[j].leaf == update->leaf && > > + current[j].subleaf == update->subleaf ) > > + { > > + /* > > + * NB: cannot use an assignation because of the const vs > > + * non-const difference. > > + */ > > + memcpy(¤t[j], update, sizeof(*update)); > > I'm having trouble understanding the comment. In > > current[j] = *update; > > the lvalue is xen_cpuid_leaf_t and the rvalue is const xen_cpuid_leaf_t. > That the usual (and permitted) arrangement afaics.
I'm sure I was doing something really stupid, and as a bonus I failed to properly parse the error message I got from the compiler. It's now fixed here and below. Thanks, Roger.