tools/libxenguest: Fix max_extd_leaf calculation for legacy restore
authorAndrew Cooper <andrew.cooper3@citrix.com>
Fri, 2 Jul 2021 17:37:57 +0000 (18:37 +0100)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Mon, 5 Jul 2021 10:30:14 +0000 (11:30 +0100)
0x1c is lower than any value which will actually be observed in
p->extd.max_leaf, but higher than the logical 9 leaves worth of extended data
on Intel systems, causing x86_cpuid_copy_to_buffer() to fail with -ENOBUFS.

Correct the calculation.

The problem was first noticed in c/s 34990446ca9 "libxl: don't ignore the
return value from xc_cpuid_apply_policy" but introduced earlier.

Fixes: 111c8c33a8a1 ("x86/cpuid: do not expand max leaves on restore")
Reported-by: Olaf Hering <olaf@aepfle.de>
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
tools/libs/guest/xg_cpuid_x86.c

index e01d657e0394556729def6296df0079140ee2eac..0c9c4fefc1efe60c140f306cf368d8d2ab69791d 100644 (file)
@@ -513,7 +513,7 @@ int xc_cpuid_apply_policy(xc_interface *xch, uint32_t domid, bool restore,
         /* Clamp maximum leaves to the ones supported on 4.12. */
         p->basic.max_leaf = min(p->basic.max_leaf, 0xdu);
         p->feat.max_subleaf = 0;
-        p->extd.max_leaf = min(p->extd.max_leaf, 0x1cu);
+        p->extd.max_leaf = min(p->extd.max_leaf, 0x8000001c);
     }
 
     if ( featureset )