Revert "x86/CPUID: shrink max_{,sub}leaf fields according to actual leaf contents"
authorAndrew Cooper <andrew.cooper3@citrix.com>
Wed, 24 Nov 2021 19:06:02 +0000 (19:06 +0000)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Thu, 25 Nov 2021 17:14:18 +0000 (17:14 +0000)
commit0e6c87b93e1d35fedf9cebd65395c2f79b4af11a
tree6e3b3f1dd30fc15efbedb3e36bb51a8e1cdf6e91
parent5449ba84e99849ee2339fd79f9717e10113d702d
Revert "x86/CPUID: shrink max_{,sub}leaf fields according to actual leaf contents"

OSSTest has identified a 3rd regression caused by this change.  Migration
between Xen 4.15 and 4.16 on the nocera pair of machines (AMD Opteron 4133)
fails with:

  xc: error: Failed to set CPUID policy: leaf 00000000, subleaf ffffffff, msr ffffffff (22 = Invalid argument): Internal error
  xc: error: Restore failed (22 = Invalid argument): Internal error

which is a safety check to prevent resuming the guest when the CPUID data has
been truncated.  The problem is caused by shrinking of the max policies, which
is an ABI that needs handling compatibly between different versions of Xen.

Furthermore, shrinking of the default policies also breaks things in some
cases, because certain cpuid= settings in a VM config file which used to work
will now be refused.  Also external toolstacks that attempt to set the CPUID
policy from a featureset might now see some filled leaves not reachable due to
the shrinking done to the default domain policy before applying the
featureset.

This reverts commit 540d911c2813c3d8f4cdbb3f5672119e5e768a3d, as well as the
partial fix attempt in 81da2b544cbb003a5447c9b14d275746ad22ab37 (which added
one new case where cpuid= settings might not apply correctly) and restores the
same behaviour as Xen 4.15.

Fixes: 540d911c2813 ("x86/CPUID: shrink max_{,sub}leaf fields according to actual leaf contents")
Fixes: 81da2b544cbb ("x86/cpuid: prevent shrinking migrated policies max leaves")
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Roger Pau Monné <roger.pau@citrix.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
tools/libs/guest/xg_cpuid_x86.c
tools/tests/cpu-policy/test-cpu-policy.c
xen/arch/x86/cpuid.c
xen/include/xen/lib/x86/cpuid.h
xen/lib/x86/cpuid.c