• Maxim Levitsky's avatar
    KVM: x86: nSVM: mark vmcb01 as dirty when restoring SMM saved state · e8efa4ff
    Maxim Levitsky authored
    While usually, restoring the smm state makes the KVM enter
    the nested guest thus a different vmcb (vmcb02 vs vmcb01),
    KVM should still mark it as dirty, since hardware
    can in theory cache multiple vmcbs.
    
    Failure to do so, combined with lack of setting the
    nested_run_pending (which is fixed in the next patch),
    might make KVM re-enter vmcb01, which was just exited from,
    with completely different set of guest state registers
    (SMM vs non SMM) and without proper dirty bits set,
    which results in the CPU reusing stale IDTR pointer
    which leads to a guest shutdown on any interrupt.
    
    On the real hardware this usually doesn't happen,
    but when running nested, L0's KVM does check and
    honour few dirty bits, causing this issue to happen.
    
    This patch fixes boot of hyperv and SMM enabled
    windows VM running nested on KVM.
    Signed-off-by: default avatarMaxim Levitsky <mlevitsk@redhat.com>
    Cc: stable@vger.kernel.org
    Message-Id: <20220207155447.840194-4-mlevitsk@redhat.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    e8efa4ff
svm.c 131 KB