AArch64 EL2 hypervisor for QEMU virt that boots at EL2
1

Configure Feed

Select the types of activity you want to include in your feed.

Refine GIC virtual interrupt state reconciliation

+7 -3
+7 -3
drivers/gicv3.c
··· 11 11 #define GICR_WAKER 0x0014u 12 12 #define GICR_WAKER_PROCESSOR_SLEEP (1u << 1) 13 13 #define GICR_WAKER_CHILDREN_ASLEEP (1u << 2) 14 + #define ICH_LR_STATE(lr) (((lr) >> 62u) & 0x3u) 15 + #define ICH_LR_INTID(lr) ((uint32_t)((lr) & 0xffffffffu)) 14 16 15 17 static uintptr_t gicd(uint32_t off) 16 18 { ··· 91 93 uint64_t lr; 92 94 uint64_t state; 93 95 94 - if (vcpu == (struct vcpu *)0 || vcpu->active_virtual_irq == 0u) { 96 + if (vcpu == (struct vcpu *)0) { 95 97 return; 96 98 } 97 99 98 100 __asm__ volatile("mrs %0, ICH_LR0_EL2" : "=r"(lr)); 99 - state = (lr >> 62u) & 0x3u; 100 - if (state == 0u) { 101 + state = ICH_LR_STATE(lr); 102 + if (state == 0u && vcpu->active_virtual_irq != 0u) { 101 103 vcpu_clear_pending_irq(vcpu, (uint32_t)vcpu->active_virtual_irq); 102 104 vcpu->active_virtual_irq = 0u; 103 105 vcpu->stats.virtual_irqs_completed++; 106 + } else if (state != 0u) { 107 + vcpu->active_virtual_irq = ICH_LR_INTID(lr); 104 108 } 105 109 } 106 110