A maximum extended leaf input value with the high half different from
0x8000 should not be considered valid - all leaves should be cleared in
this case.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
---
TBD: Andrew suggested to drop this patch, but that sub-thread still has
a loose end. Hence, until I'm convinced otherwise, I've retained
this patch here. I don't think it conflicts with any of the
subsequent ones.
---
v2: Integrate into series.
--- a/tools/tests/cpu-policy/test-cpu-policy.c
+++ b/tools/tests/cpu-policy/test-cpu-policy.c
@@ -528,11 +528,22 @@ static void test_cpuid_out_of_range_clea
},
},
{
+ .name = "no extd",
+ .nr_markers = 0,
+ .p = {
+ /* Clears all markers. */
+ .extd.max_leaf = 0,
+
+ .extd.vendor_ebx = 0xc2,
+ .extd.raw_fms = 0xc2,
+ },
+ },
+ {
.name = "extd",
.nr_markers = 1,
.p = {
/* Retains marker in leaf 0. Clears others. */
- .extd.max_leaf = 0,
+ .extd.max_leaf = 0x80000000,
.extd.vendor_ebx = 0xc2,
.extd.raw_fms = 0xc2,
--- a/xen/lib/x86/cpuid.c
+++ b/xen/lib/x86/cpuid.c
@@ -285,7 +285,9 @@ void x86_cpu_policy_clear_out_of_range_l
ARRAY_SIZE(p->xstate.raw) - 1);
}
- zero_leaves(p->extd.raw, (p->extd.max_leaf & 0xffff) + 1,
+ zero_leaves(p->extd.raw,
+ ((p->extd.max_leaf >> 16) == 0x8000
+ ? (p->extd.max_leaf & 0xffff) + 1 : 0),
ARRAY_SIZE(p->extd.raw) - 1);
}