target/i386: work around KVM_GET_MSRS bug for secondary execution controls
Some secondary controls are automatically enabled/disabled based on the CPUID values that are set for the guest. However, they are still available at a global level and therefore should be present when KVM_GET_MSRS is sent to /dev/kvm. Unfortunately KVM forgot to include those, so fix that. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
20a78b02d3
commit
048c95163b
@ -479,6 +479,23 @@ uint64_t kvm_arch_get_supported_msr_feature(KVMState *s, uint32_t index)
|
||||
value = msr_data.entries[0].data;
|
||||
switch (index) {
|
||||
case MSR_IA32_VMX_PROCBASED_CTLS2:
|
||||
/* KVM forgot to add these bits for some time, do this ourselves. */
|
||||
if (kvm_arch_get_supported_cpuid(s, 0xD, 1, R_ECX) & CPUID_XSAVE_XSAVES) {
|
||||
value |= (uint64_t)VMX_SECONDARY_EXEC_XSAVES << 32;
|
||||
}
|
||||
if (kvm_arch_get_supported_cpuid(s, 1, 0, R_ECX) & CPUID_EXT_RDRAND) {
|
||||
value |= (uint64_t)VMX_SECONDARY_EXEC_RDRAND_EXITING << 32;
|
||||
}
|
||||
if (kvm_arch_get_supported_cpuid(s, 7, 0, R_EBX) & CPUID_7_0_EBX_INVPCID) {
|
||||
value |= (uint64_t)VMX_SECONDARY_EXEC_ENABLE_INVPCID << 32;
|
||||
}
|
||||
if (kvm_arch_get_supported_cpuid(s, 7, 0, R_EBX) & CPUID_7_0_EBX_RDSEED) {
|
||||
value |= (uint64_t)VMX_SECONDARY_EXEC_RDSEED_EXITING << 32;
|
||||
}
|
||||
if (kvm_arch_get_supported_cpuid(s, 0x80000001, 0, R_EDX) & CPUID_EXT2_RDTSCP) {
|
||||
value |= (uint64_t)VMX_SECONDARY_EXEC_RDTSCP << 32;
|
||||
}
|
||||
/* fall through */
|
||||
case MSR_IA32_VMX_TRUE_PINBASED_CTLS:
|
||||
case MSR_IA32_VMX_TRUE_PROCBASED_CTLS:
|
||||
case MSR_IA32_VMX_TRUE_ENTRY_CTLS:
|
||||
|
Loading…
Reference in New Issue
Block a user