• Paolo Bonzini's avatar
    KVM: nSVM: implement check_nested_events for interrupts · b518ba9f
    Paolo Bonzini authored
    The current implementation of physical interrupt delivery to a nested guest
    is quite broken.  It relies on svm_interrupt_allowed returning false if
    VINTR=1 so that the interrupt can be injected from enable_irq_window,
    but this does not work for guests that do not intercept HLT or that rely
    on clearing the host IF to block physical interrupts while L2 runs.
    
    This patch can be split in two logical parts, but including only
    one breaks tests so I am combining both changes together.
    
    The first and easiest is simply to return true for svm_interrupt_allowed
    if HF_VINTR_MASK is set and HIF is set.  This way the semantics of
    svm_interrupt_allowed are respected: svm_interrupt_allowed being false
    does not mean "call enable_irq_window", it means "interrupts cannot
    be injected now".
    
    After doing this, however, we need another place to inject the
    interrupt, and fortunately we already have one, check_nested_events,
    which nested SVM does not implement but which is meant exactly for this
    purpose.  It is called before interrupts are injected, and it can
    therefore do the L2->L1 switch while leaving inject_pending_event
    none the wiser.
    
    This patch was developed together with Cathy Avery, who wrote the
    test and did a lot of the initial debugging.
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    b518ba9f
svm.c 192 KB