mirror of
https://github.com/qemu/qemu.git
synced 2024-12-11 12:43:55 +08:00
KVM: x86: believe what KVM says about WAITPKG
Currently, QEMU is overriding KVM_GET_SUPPORTED_CPUID's answer for the WAITPKG bit depending on the "-overcommit cpu-pm" setting. This is a bad idea because it does not even check if the host supports it, but it can be done in x86_cpu_realizefn just like we do for the MONITOR bit. This patch moves it there, while making it conditional on host support for the related UMWAIT MSR. Cc: qemu-stable@nongnu.org Reported-by: Maxim Levitsky <mlevitsk@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
c0c8445255
commit
e1e43813e7
@ -6509,6 +6509,9 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
|
|||||||
host_cpuid(5, 0, &cpu->mwait.eax, &cpu->mwait.ebx,
|
host_cpuid(5, 0, &cpu->mwait.eax, &cpu->mwait.ebx,
|
||||||
&cpu->mwait.ecx, &cpu->mwait.edx);
|
&cpu->mwait.ecx, &cpu->mwait.edx);
|
||||||
env->features[FEAT_1_ECX] |= CPUID_EXT_MONITOR;
|
env->features[FEAT_1_ECX] |= CPUID_EXT_MONITOR;
|
||||||
|
if (kvm_enabled() && kvm_has_waitpkg()) {
|
||||||
|
env->features[FEAT_7_0_ECX] |= CPUID_7_0_ECX_WAITPKG;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (kvm_enabled() && cpu->ucode_rev == 0) {
|
if (kvm_enabled() && cpu->ucode_rev == 0) {
|
||||||
cpu->ucode_rev = kvm_arch_get_supported_msr_feature(kvm_state,
|
cpu->ucode_rev = kvm_arch_get_supported_msr_feature(kvm_state,
|
||||||
|
@ -411,12 +411,6 @@ uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function,
|
|||||||
if (host_tsx_blacklisted()) {
|
if (host_tsx_blacklisted()) {
|
||||||
ret &= ~(CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_HLE);
|
ret &= ~(CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_HLE);
|
||||||
}
|
}
|
||||||
} else if (function == 7 && index == 0 && reg == R_ECX) {
|
|
||||||
if (enable_cpu_pm) {
|
|
||||||
ret |= CPUID_7_0_ECX_WAITPKG;
|
|
||||||
} else {
|
|
||||||
ret &= ~CPUID_7_0_ECX_WAITPKG;
|
|
||||||
}
|
|
||||||
} else if (function == 7 && index == 0 && reg == R_EDX) {
|
} else if (function == 7 && index == 0 && reg == R_EDX) {
|
||||||
/*
|
/*
|
||||||
* Linux v4.17-v4.20 incorrectly return ARCH_CAPABILITIES on SVM hosts.
|
* Linux v4.17-v4.20 incorrectly return ARCH_CAPABILITIES on SVM hosts.
|
||||||
@ -4730,3 +4724,8 @@ int kvm_arch_msi_data_to_gsi(uint32_t data)
|
|||||||
{
|
{
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool kvm_has_waitpkg(void)
|
||||||
|
{
|
||||||
|
return has_msr_umwait;
|
||||||
|
}
|
||||||
|
@ -44,6 +44,7 @@ void kvm_put_apicbase(X86CPU *cpu, uint64_t value);
|
|||||||
|
|
||||||
bool kvm_enable_x2apic(void);
|
bool kvm_enable_x2apic(void);
|
||||||
bool kvm_has_x2apic_api(void);
|
bool kvm_has_x2apic_api(void);
|
||||||
|
bool kvm_has_waitpkg(void);
|
||||||
|
|
||||||
bool kvm_hv_vpindex_settable(void);
|
bool kvm_hv_vpindex_settable(void);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user