• Santosh Shukla's avatar
    KVM: x86: Add support for SVM's Virtual NMI · fa4c027a
    Santosh Shukla authored
    Add support for SVM's Virtual NMIs implementation, which adds proper
    tracking of virtual NMI blocking, and an intr_ctrl flag that software can
    set to mark a virtual NMI as pending.  Pending virtual NMIs are serviced
    by hardware if/when virtual NMIs become unblocked, i.e. act more or less
    like real NMIs.
    
    Introduce two new kvm_x86_ops callbacks so to support SVM's vNMI, as KVM
    needs to treat a pending vNMI as partially injected.  Specifically, if
    two NMIs (for L1) arrive concurrently in KVM's software model, KVM's ABI
    is to inject one and pend the other.  Without vNMI, KVM manually tracks
    the pending NMI and uses NMI windows to detect when the NMI should be
    injected.
    
    With vNMI, the pending NMI is simply stuffed into the VMCB and handed
    off to hardware.  This means that KVM needs to be able to set a vNMI
    pending on-demand, and also query if a vNMI is pending, e.g. to honor the
    "at most one NMI pending" rule and to preserve all NMIs across save and
    restore.
    
    Warn if KVM attempts to open an NMI window when vNMI is fully enabled,
    as the above logic should prevent KVM from ever getting to
    kvm_check_and_inject_events() with two NMIs pending _in software_, and
    the "at most one NMI pending" logic should prevent having an NMI pending
    in hardware and an NMI pending in software if NMIs are also blocked, i.e.
    if KVM can't immediately inject the second NMI.
    Signed-off-by: default avatarSantosh Shukla <Santosh.Shukla@amd.com>
    Co-developed-by: default avatarMaxim Levitsky <mlevitsk@redhat.com>
    Signed-off-by: default avatarMaxim Levitsky <mlevitsk@redhat.com>
    Link: https://lore.kernel.org/r/20230227084016.3368-11-santosh.shukla@amd.com
    [sean: rewrite shortlog and changelog, massage code comments]
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    fa4c027a
svm.h 20.3 KB