diff --git a/tools/libs/guest/xg_cpuid_x86.c b/tools/libs/guest/xg_cpuid_x86.c index 198892ebdf..3ffd5f683b 100644 --- a/tools/libs/guest/xg_cpuid_x86.c +++ b/tools/libs/guest/xg_cpuid_x86.c @@ -638,6 +638,13 @@ int xc_cpuid_apply_policy(xc_interface *xch, uint32_t domid, bool restore, } } + /* + * Do not try to shrink the policy if restoring, as that could cause + * guest visible changes in the maximum leaf fields. + */ + if ( !restore ) + x86_cpuid_policy_shrink_max_leaves(p); + rc = x86_cpuid_copy_to_buffer(p, leaves, &nr_leaves); if ( rc ) { diff --git a/xen/arch/x86/cpuid.c b/xen/arch/x86/cpuid.c index 2079a30ae4..8ac55f0806 100644 --- a/xen/arch/x86/cpuid.c +++ b/xen/arch/x86/cpuid.c @@ -719,8 +719,6 @@ void recalculate_cpuid_policy(struct domain *d) if ( !p->extd.page1gb ) p->extd.raw[0x19] = EMPTY_LEAF; - - x86_cpuid_policy_shrink_max_leaves(p); } int init_domain_cpuid_policy(struct domain *d)