KVM: SVM: Don't try to pointlessly single-step SEV-ES guests for NMI window
authorSean Christopherson <seanjc@google.com>
Thu, 15 Jun 2023 06:37:57 +0000 (16:37 +1000)
committerSean Christopherson <seanjc@google.com>
Fri, 28 Jul 2023 23:13:43 +0000 (16:13 -0700)
Bail early from svm_enable_nmi_window() for SEV-ES guests without trying
to enable single-step of the guest, as single-stepping an SEV-ES guest is
impossible and the guest is responsible for *telling* KVM when it is ready
for an new NMI to be injected.

Functionally, setting TF and RF in svm->vmcb->save.rflags is benign as the
field is ignored by hardware, but it's all kinds of confusing.

Signed-off-by: Alexey Kardashevskiy <aik@amd.com>
Link: https://lore.kernel.org/r/20230615063757.3039121-10-aik@amd.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/svm/svm.c

index b15bc15..1bc0936 100644 (file)
@@ -3802,6 +3802,19 @@ static void svm_enable_nmi_window(struct kvm_vcpu *vcpu)
        if (svm_get_nmi_mask(vcpu) && !svm->awaiting_iret_completion)
                return; /* IRET will cause a vm exit */
 
+       /*
+        * SEV-ES guests are responsible for signaling when a vCPU is ready to
+        * receive a new NMI, as SEV-ES guests can't be single-stepped, i.e.
+        * KVM can't intercept and single-step IRET to detect when NMIs are
+        * unblocked (architecturally speaking).  See SVM_VMGEXIT_NMI_COMPLETE.
+        *
+        * Note, GIF is guaranteed to be '1' for SEV-ES guests as hardware
+        * ignores SEV-ES guest writes to EFER.SVME *and* CLGI/STGI are not
+        * supported NAEs in the GHCB protocol.
+        */
+       if (sev_es_guest(vcpu->kvm))
+               return;
+
        if (!gif_set(svm)) {
                if (vgif)
                        svm_set_intercept(svm, INTERCEPT_STGI);