• Jan Kiszka's avatar
    KVM: VMX: work around lacking VNMI support · 3b86cd99
    Jan Kiszka authored
    Older VMX supporting CPUs do not provide the "Virtual NMI" feature for
    tracking the NMI-blocked state after injecting such events. For now
    KVM is unable to inject NMIs on those CPUs.
    
    Derived from Sheng Yang's suggestion to use the IRQ window notification
    for detecting the end of NMI handlers, this patch implements virtual
    NMI support without impact on the host's ability to receive real NMIs.
    The downside is that the given approach requires some heuristics that
    can cause NMI nesting in vary rare corner cases.
    
    The approach works as follows:
     - inject NMI and set a software-based NMI-blocked flag
     - arm the IRQ window start notification whenever an NMI window is
       requested
     - if the guest exits due to an opening IRQ window, clear the emulated
       NMI-blocked flag
     - if the guest net execution time with NMI-blocked but without an IRQ
       window exceeds 1 second, force NMI-blocked reset and inject anyway
    
    This approach covers most practical scenarios:
     - succeeding NMIs are seperated by at least one open IRQ window
     - the guest may spin with IRQs disabled (e.g. due to a bug), but
       leaving the NMI handler takes much less time than one second
     - the guest does not rely on strict ordering or timing of NMIs
       (would be problematic in virtualized environments anyway)
    
    Successfully tested with the 'nmi n' monitor command, the kgdbts
    testsuite on smp guests (additional patches required to add debug
    register support to kvm) + the kernel's nmi_watchdog=1, and a Siemens-
    specific board emulation (+ guest) that comes with its own NMI
    watchdog mechanism.
    Signed-off-by: default avatarJan Kiszka <jan.kiszka@siemens.com>
    Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
    3b86cd99
vmx.c 93.9 KB