cpu_if->vgic_ap1r[0] = __vgic_v3_read_ap1rn(0);
                }
        } else {
-               if (static_branch_unlikely(&vgic_v3_cpuif_trap))
+               if (static_branch_unlikely(&vgic_v3_cpuif_trap) ||
+                   cpu_if->its_vpe.its_vm)
                        write_gicreg(0, ICH_HCR_EL2);
 
                cpu_if->vgic_elrsr = 0xffff;
                /*
                 * If we need to trap system registers, we must write
                 * ICH_HCR_EL2 anyway, even if no interrupts are being
-                * injected,
+                * injected. Same thing if GICv4 is used, as VLPI
+                * delivery is gated by ICH_HCR_EL2.En.
                 */
-               if (static_branch_unlikely(&vgic_v3_cpuif_trap))
+               if (static_branch_unlikely(&vgic_v3_cpuif_trap) ||
+                   cpu_if->its_vpe.its_vm)
                        write_gicreg(cpu_if->vgic_hcr, ICH_HCR_EL2);
        }