i386/kvm: Blacklist TSX on known broken hosts
Some Intel CPUs are known to have a broken TSX implementation. A microcode update from Intel disabled TSX on those CPUs, but GET_SUPPORTED_CPUID might be reporting it as supported if the hosts were not updated yet. Manually fixup the GET_SUPPORTED_CPUID data to ensure we will never enable TSX when running on those hosts. Reference: * glibc commit 2702856bf45c82cf8e69f2064f5aa15c0ceb6359: https://sourceware.org/git/?p=glibc.git;a=commit;h=2702856bf45c82cf8e69f2064f5aa15c0ceb6359 Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> Message-Id: <20170309181212.18864-3-ehabkost@redhat.com> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
This commit is contained in:
parent
20271d4840
commit
40e80ee411
@ -266,6 +266,19 @@ static int get_para_features(KVMState *s)
|
||||
return features;
|
||||
}
|
||||
|
||||
static bool host_tsx_blacklisted(void)
|
||||
{
|
||||
int family, model, stepping;\
|
||||
char vendor[CPUID_VENDOR_SZ + 1];
|
||||
|
||||
host_vendor_fms(vendor, &family, &model, &stepping);
|
||||
|
||||
/* Check if we are running on a Haswell host known to have broken TSX */
|
||||
return !strcmp(vendor, CPUID_VENDOR_INTEL) &&
|
||||
(family == 6) &&
|
||||
((model == 63 && stepping < 4) ||
|
||||
model == 60 || model == 69 || model == 70);
|
||||
}
|
||||
|
||||
/* Returns the value for a specific register on the cpuid entry
|
||||
*/
|
||||
@ -349,6 +362,10 @@ uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function,
|
||||
}
|
||||
} else if (function == 6 && reg == R_EAX) {
|
||||
ret |= CPUID_6_EAX_ARAT; /* safe to allow because of emulated APIC */
|
||||
} else if (function == 7 && index == 0 && reg == R_EBX) {
|
||||
if (host_tsx_blacklisted()) {
|
||||
ret &= ~(CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_HLE);
|
||||
}
|
||||
} else if (function == 0x80000001 && reg == R_EDX) {
|
||||
/* On Intel, kvm returns cpuid according to the Intel spec,
|
||||
* so add missing bits according to the AMD spec:
|
||||
|
Loading…
Reference in New Issue
Block a user