Skip to content
  • David Woodhouse's avatar
    KVM: x86/xen: Add event channel interrupt vector upcall · 40da8ccd
    David Woodhouse authored
    
    
    It turns out that we can't handle event channels *entirely* in userspace
    by delivering them as ExtINT, because KVM is a bit picky about when it
    accepts ExtINT interrupts from a legacy PIC. The in-kernel local APIC
    has to have LVT0 configured in APIC_MODE_EXTINT and unmasked, which
    isn't necessarily the case for Xen guests especially on secondary CPUs.
    
    To cope with this, add kvm_xen_get_interrupt() which checks the
    evtchn_pending_upcall field in the Xen vcpu_info, and delivers the Xen
    upcall vector (configured by KVM_XEN_ATTR_TYPE_UPCALL_VECTOR) if it's
    set regardless of LAPIC LVT0 configuration. This gives us the minimum
    support we need for completely userspace-based implementation of event
    channels.
    
    This does mean that vcpu_enter_guest() needs to check for the
    evtchn_pending_upcall flag being set, because it can't rely on someone
    having set KVM_REQ_EVENT unless we were to add some way for userspace to
    do so manually.
    
    Signed-off-by: default avatarDavid Woodhouse <dwmw@amazon.co.uk>
    40da8ccd