• Yadong Qi's avatar
    KVM: x86: emulate wait-for-SIPI and SIPI-VMExit · bf0cd88c
    Yadong Qi authored
    Background: We have a lightweight HV, it needs INIT-VMExit and
    SIPI-VMExit to wake-up APs for guests since it do not monitor
    the Local APIC. But currently virtual wait-for-SIPI(WFS) state
    is not supported in nVMX, so when running on top of KVM, the L1
    HV cannot receive the INIT-VMExit and SIPI-VMExit which cause
    the L2 guest cannot wake up the APs.
    
    According to Intel SDM Chapter 25.2 Other Causes of VM Exits,
    SIPIs cause VM exits when a logical processor is in
    wait-for-SIPI state.
    
    In this patch:
        1. introduce SIPI exit reason,
        2. introduce wait-for-SIPI state for nVMX,
        3. advertise wait-for-SIPI support to guest.
    
    When L1 hypervisor is not monitoring Local APIC, L0 need to emulate
    INIT-VMExit and SIPI-VMExit to L1 to emulate INIT-SIPI-SIPI for
    L2. L2 LAPIC write would be traped by L0 Hypervisor(KVM), L0 should
    emulate the INIT/SIPI vmexit to L1 hypervisor to set proper state
    for L2's vcpu state.
    
    Handle procdure:
    Source vCPU:
        L2 write LAPIC.ICR(INIT).
        L0 trap LAPIC.ICR write(INIT): inject a latched INIT event to target
           vCPU.
    Target vCPU:
        L0 emulate an INIT VMExit to L1 if is guest mode.
        L1 set guest VMCS, guest_activity_state=WAIT_SIPI, vmresume.
        L0 set vcpu.mp_state to INIT_RECEIVED if (vmcs12.guest_activity_state
           == WAIT_SIPI).
    
    Source vCPU:
        L2 write LAPIC.ICR(SIPI).
        L0 trap LAPIC.ICR write(INIT): inject a latched SIPI event to traget
           vCPU.
    Target vCPU:
        L0 emulate an SIPI VMExit to L1 if (vcpu.mp_state == INIT_RECEIVED).
        L1 set CS:IP, guest_activity_state=ACTIVE, vmresume.
        L0 resume to L2.
        L2 start-up.
    Signed-off-by: default avatarYadong Qi <yadong.qi@intel.com>
    Message-Id: <20200922052343.84388-1-yadong.qi@intel.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Message-Id: <20201106065122.403183-1-yadong.qi@intel.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    bf0cd88c
nested.c 202 KB