• Christoffer Dall's avatar
    arm/arm64: KVM: Fix arch timer behavior for disabled interrupts · cff9211e
    Christoffer Dall authored
    We have an interesting issue when the guest disables the timer interrupt
    on the VGIC, which happens when turning VCPUs off using PSCI, for
    example.
    
    The problem is that because the guest disables the virtual interrupt at
    the VGIC level, we never inject interrupts to the guest and therefore
    never mark the interrupt as active on the physical distributor.  The
    host also never takes the timer interrupt (we only use the timer device
    to trigger a guest exit and everything else is done in software), so the
    interrupt does not become active through normal means.
    
    The result is that we keep entering the guest with a programmed timer
    that will always fire as soon as we context switch the hardware timer
    state and run the guest, preventing forward progress for the VCPU.
    
    Since the active state on the physical distributor is really part of the
    timer logic, it is the job of our virtual arch timer driver to manage
    this state.
    
    The timer->map->active boolean field indicates whether we have signalled
    this interrupt to the vgic and if that interrupt is still pending or
    active.  As long as that is the case, the hardware doesn't have to
    generate physical interrupts and therefore we mark the interrupt as
    active on the physical distributor.
    
    We also have to restore the pending state of an interrupt that was
    queued to an LR but was retired from the LR for some reason, while
    remaining pending in the LR.
    
    Cc: Marc Zyngier <marc.zyngier@arm.com>
    Reported-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Signed-off-by: default avatarChristoffer Dall <christoffer.dall@linaro.org>
    cff9211e
vgic.c 63.6 KB