• Julien Thierry's avatar
    arm64: kvm: Unmask PMR before entering guest · 85738e05
    Julien Thierry authored
    Interrupts masked by ICC_PMR_EL1 will not be signaled to the CPU. This
    means that hypervisor will not receive masked interrupts while running a
    guest.
    
    We need to make sure that all maskable interrupts are masked from the
    time we call local_irq_disable() in the main run loop, and remain so
    until we call local_irq_enable() after returning from the guest, and we
    need to ensure that we see no interrupts at all (including pseudo-NMIs)
    in the middle of the VM world-switch, while at the same time we need to
    ensure we exit the guest when there are interrupts for the host.
    
    We can accomplish this with pseudo-NMIs enabled by:
      (1) local_irq_disable: set the priority mask
      (2) enter guest: set PSTATE.I
      (3)              clear the priority mask
      (4) eret to guest
      (5) exit guest:  set the priotiy mask
                       clear PSTATE.I (and restore other host PSTATE bits)
      (6) local_irq_enable: clear the priority mask.
    Signed-off-by: default avatarJulien Thierry <julien.thierry@arm.com>
    Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Reviewed-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
    Reviewed-by: default avatarChristoffer Dall <christoffer.dall@arm.com>
    Cc: Christoffer Dall <christoffer.dall@arm.com>
    Cc: Marc Zyngier <marc.zyngier@arm.com>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: kvmarm@lists.cs.columbia.edu
    Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    85738e05
switch.c 16.7 KB