On 17/04/2018 17:46, Christopherson, Sean J wrote: > On Tue, 2018-04-17, Zdenek Kaspar wrote: >> Hello, I did quick test with latest stable kernel (4.16.2) and got tons >> of vmwrite errors immediately when starting VM: > > Code related to UMIP emulation is effectively doing an unconditional > RMW on SECONDARY_VM_EXEC_CONTROL, which isn't guaranteed to exist on > older processors. KVM already ensures it only advertises UMIP (via > emulation) when SECONDARY_EXEC_DESC can be set, i.e. KVM is already > implicitly checking for SECONDARY_VM_EXEC_CONTROL, so fixing the bug > is just a matter of omitting the unneeded VMREAD/VMWRITE sequence. Thanks for the report! This should be a fix: diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index aa66ccd6ed6c..c5dd185825c7 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -4767,14 +4767,16 @@ static int vmx_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4) else hw_cr4 |= KVM_PMODE_VM_CR4_ALWAYS_ON; - if ((cr4 & X86_CR4_UMIP) && !boot_cpu_has(X86_FEATURE_UMIP)) { - vmcs_set_bits(SECONDARY_VM_EXEC_CONTROL, - SECONDARY_EXEC_DESC); - hw_cr4 &= ~X86_CR4_UMIP; - } else if (!is_guest_mode(vcpu) || - !nested_cpu_has2(get_vmcs12(vcpu), SECONDARY_EXEC_DESC)) - vmcs_clear_bits(SECONDARY_VM_EXEC_CONTROL, - SECONDARY_EXEC_DESC); + if (!boot_cpu_has(X86_FEATURE_UMIP) && vmx_umip_emulated()) { + if (cr4 & X86_CR4_UMIP) { + vmcs_set_bits(SECONDARY_VM_EXEC_CONTROL, + SECONDARY_EXEC_DESC); + hw_cr4 &= ~X86_CR4_UMIP; + } else if (!is_guest_mode(vcpu) || + !nested_cpu_has2(get_vmcs12(vcpu), SECONDARY_EXEC_DESC)) + vmcs_clear_bits(SECONDARY_VM_EXEC_CONTROL, + SECONDARY_EXEC_DESC); + } if (cr4 & X86_CR4_VMXE) { /* I'll test it and send the patch more formally. Thanks, Paolo