Patch "KVM: nVMX: Snapshot pre-VM-Enter DEBUGCTL for !nested_run_pending case" has been added to the 5.19-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    KVM: nVMX: Snapshot pre-VM-Enter DEBUGCTL for !nested_run_pending case

to the 5.19-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     kvm-nvmx-snapshot-pre-vm-enter-debugctl-for-nested_r.patch
and it can be found in the queue-5.19 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit b840ad0bc32e8dc61c68c80d5a88dd6f19b2c01e
Author: Sean Christopherson <seanjc@xxxxxxxxxx>
Date:   Tue Jun 14 21:58:28 2022 +0000

    KVM: nVMX: Snapshot pre-VM-Enter DEBUGCTL for !nested_run_pending case
    
    [ Upstream commit 764643a6be07445308e492a528197044c801b3ba ]
    
    If a nested run isn't pending, snapshot vmcs01.GUEST_IA32_DEBUGCTL
    irrespective of whether or not VM_ENTRY_LOAD_DEBUG_CONTROLS is set in
    vmcs12.  When restoring nested state, e.g. after migration, without a
    nested run pending, prepare_vmcs02() will propagate
    nested.vmcs01_debugctl to vmcs02, i.e. will load garbage/zeros into
    vmcs02.GUEST_IA32_DEBUGCTL.
    
    If userspace restores nested state before MSRs, then loading garbage is a
    non-issue as loading DEBUGCTL will also update vmcs02.  But if usersepace
    restores MSRs first, then KVM is responsible for propagating L2's value,
    which is actually thrown into vmcs01, into vmcs02.
    
    Restoring L2 MSRs into vmcs01, i.e. loading all MSRs before nested state
    is all kinds of bizarre and ideally would not be supported.  Sadly, some
    VMMs do exactly that and rely on KVM to make things work.
    
    Note, there's still a lurking SMM bug, as propagating vmcs01's DEBUGCTL
    to vmcs02 across RSM may corrupt L2's DEBUGCTL.  But KVM's entire VMX+SMM
    emulation is flawed as SMI+RSM should not toouch _any_ VMCS when use the
    "default treatment of SMIs", i.e. when not using an SMI Transfer Monitor.
    
    Link: https://lore.kernel.org/all/Yobt1XwOfb5M6Dfa@xxxxxxxxxx
    Fixes: 8fcc4b5923af ("kvm: nVMX: Introduce KVM_CAP_NESTED_STATE")
    Cc: stable@xxxxxxxxxxxxxxx
    Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx>
    Message-Id: <20220614215831.3762138-3-seanjc@xxxxxxxxxx>
    Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c
index d6cb040966f9..30babb471ae3 100644
--- a/arch/x86/kvm/vmx/nested.c
+++ b/arch/x86/kvm/vmx/nested.c
@@ -3373,7 +3373,8 @@ enum nvmx_vmentry_status nested_vmx_enter_non_root_mode(struct kvm_vcpu *vcpu,
 	if (likely(!evaluate_pending_interrupts) && kvm_vcpu_apicv_active(vcpu))
 		evaluate_pending_interrupts |= vmx_has_apicv_interrupt(vcpu);
 
-	if (!(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_DEBUG_CONTROLS))
+	if (!vmx->nested.nested_run_pending ||
+	    !(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_DEBUG_CONTROLS))
 		vmx->nested.vmcs01_debugctl = vmcs_read64(GUEST_IA32_DEBUGCTL);
 	if (kvm_mpx_supported() &&
 	    (!vmx->nested.nested_run_pending ||



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux