|
@@ -128,8 +128,10 @@ void __hyp_text __vgic_v3_save_state(struct kvm_vcpu *vcpu)
|
|
|
* Make sure stores to the GIC via the memory mapped interface
|
|
|
* are now visible to the system register interface.
|
|
|
*/
|
|
|
- if (!cpu_if->vgic_sre)
|
|
|
+ if (!cpu_if->vgic_sre) {
|
|
|
dsb(st);
|
|
|
+ cpu_if->vgic_vmcr = read_gicreg(ICH_VMCR_EL2);
|
|
|
+ }
|
|
|
|
|
|
if (used_lrs) {
|
|
|
int i;
|
|
@@ -205,11 +207,13 @@ void __hyp_text __vgic_v3_restore_state(struct kvm_vcpu *vcpu)
|
|
|
* delivered as a FIQ to the guest, with potentially fatal
|
|
|
* consequences. So we must make sure that ICC_SRE_EL1 has
|
|
|
* been actually programmed with the value we want before
|
|
|
- * starting to mess with the rest of the GIC.
|
|
|
+ * starting to mess with the rest of the GIC, and VMCR_EL2 in
|
|
|
+ * particular.
|
|
|
*/
|
|
|
if (!cpu_if->vgic_sre) {
|
|
|
write_gicreg(0, ICC_SRE_EL1);
|
|
|
isb();
|
|
|
+ write_gicreg(cpu_if->vgic_vmcr, ICH_VMCR_EL2);
|
|
|
}
|
|
|
|
|
|
val = read_gicreg(ICH_VTR_EL2);
|