arm64: KVM: Reorder system register restoration and stage-2 activation
[linux-2.6-microblaze.git] / arch / arm64 / kvm / hyp / switch.c
index 3d38150..69e10b2 100644 (file)
@@ -605,18 +605,23 @@ int __hyp_text __kvm_vcpu_run_nvhe(struct kvm_vcpu *vcpu)
 
        __sysreg_save_state_nvhe(host_ctxt);
 
-       __activate_vm(kern_hyp_va(vcpu->kvm));
-       __activate_traps(vcpu);
-
-       __hyp_vgic_restore_state(vcpu);
-       __timer_enable_traps(vcpu);
-
        /*
         * We must restore the 32-bit state before the sysregs, thanks
         * to erratum #852523 (Cortex-A57) or #853709 (Cortex-A72).
+        *
+        * Also, and in order to be able to deal with erratum #1319537 (A57)
+        * and #1319367 (A72), we must ensure that all VM-related sysreg are
+        * restored before we enable S2 translation.
         */
        __sysreg32_restore_state(vcpu);
        __sysreg_restore_state_nvhe(guest_ctxt);
+
+       __activate_vm(kern_hyp_va(vcpu->kvm));
+       __activate_traps(vcpu);
+
+       __hyp_vgic_restore_state(vcpu);
+       __timer_enable_traps(vcpu);
+
        __debug_switch_to_guest(vcpu);
 
        __set_guest_arch_workaround_state(vcpu);