mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/cpuid: Clobber CPUID leaves 0x800000{1d..20} in policies
c/s1a914256dcincreased the AMD max leaf from 0x8000001c to 0x80000021, but did not adjust anything in the calculate_*_policy() chain. As a result, on hardware supporting these leaves, we read the real hardware values into the raw policy, then copy into host, and all the way into the PV/HVM default policies. All 4 of these leaves have enable bits (first two by TopoExt, next by SEV, next by PQOS), so any software following the rules is fine and will leave them alone. However, leaf 0x8000001d takes a subleaf input and at least two userspace utilities have been observed to loop indefinitely under Xen (clearly waiting for eax to report "no more cache levels"). Such userspace is buggy, but Xen's behaviour isn't great either. In the short term, clobber all information in these leaves. This is a giant bodge, but there are complexities with implementing all of these leaves properly. Fixes:1a914256dc("x86/cpuid: support LFENCE always serialising CPUID bit") Link: https://github.com/QubesOS/qubes-issues/issues/7392 Reported-by: fosslinux <fosslinux@aussies.space> Reported-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
99d829dba1
commit
d4012d5008
1 file changed
+7
@@ -328,8 +328,15 @@ static void recalculate_misc(struct cpuid_policy *p)
|
||||
|
||||
zero_leaves(p->extd.raw, 0xb, 0x18);
|
||||
|
||||
/* 0x19 - TLB details. Pass through. */
|
||||
/* 0x1a - Perf hints. Pass through. */
|
||||
|
||||
p->extd.raw[0x1b] = EMPTY_LEAF; /* IBS - not supported. */
|
||||
p->extd.raw[0x1c] = EMPTY_LEAF; /* LWP - not supported. */
|
||||
p->extd.raw[0x1d] = EMPTY_LEAF; /* TopoExt Cache */
|
||||
p->extd.raw[0x1e] = EMPTY_LEAF; /* TopoExt APIC ID/Core/Node */
|
||||
p->extd.raw[0x1f] = EMPTY_LEAF; /* SEV */
|
||||
p->extd.raw[0x20] = EMPTY_LEAF; /* Platform QoS */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||