]> xenbits.xensource.com Git - xen.git/commitdiff
x86/cpuid: prevent shrinking migrated policies max leaves
authorRoger Pau Monne <roger.pau@citrix.com>
Wed, 10 Nov 2021 17:40:59 +0000 (18:40 +0100)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Fri, 12 Nov 2021 13:57:04 +0000 (13:57 +0000)
CPUID policies from guest being migrated shouldn't have the maximum
leaves shrink, as that would be a guest visible change. The hypervisor
has no knowledge on whether a guest has been migrated or is build from
scratch, and hence it must not blindly shrink the CPUID policy in
recalculate_cpuid_policy. Remove the
x86_cpuid_policy_shrink_max_leaves call from recalculate_cpuid_policy.
Removing such call could be seen as a partial revert of 540d911c28.

Instead let the toolstack shrink the policies for newly created
guests, while keeping the previous values for guests that are migrated
in. Note that guests migrated in without a CPUID policy won't get any
kind of shrinking applied.

Fixes: 540d911c28 ('x86/CPUID: shrink max_{,sub}leaf fields according to actual leaf contents')
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
Release-Acked-by: Ian Jackson <iwj@xenproject.org>
tools/libs/guest/xg_cpuid_x86.c
xen/arch/x86/cpuid.c

index 198892ebdf45d7aeb37720995ceabff19bf7b027..3ffd5f683becedd2700b59b9133775445ff2d291 100644 (file)
@@ -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 )
     {
index 2079a30ae443a514fac85fc19b34972bccc43a69..8ac55f0806d05696a90e916845264c93e569c62b 100644 (file)
@@ -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)