KVM: x86: Fix CR3 reserved bits check in long mode
authorJan Kiszka <jan.kiszka@siemens.com>
Sat, 10 May 2014 07:24:34 +0000 (09:24 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 12 May 2014 18:04:01 +0000 (20:04 +0200)
Regression of 346874c9: PAE is set in long mode, but that does not mean
we have valid PDPTRs.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/x86.c

index 41f673facf2f60ab4157a16d0dbde415432aed3c..fb313fc896ddbad83552a6db07f68a564889ca28 100644 (file)
@@ -701,10 +701,11 @@ int kvm_set_cr3(struct kvm_vcpu *vcpu, unsigned long cr3)
                return 0;
        }
 
-       if (is_long_mode(vcpu) && (cr3 & CR3_L_MODE_RESERVED_BITS))
-               return 1;
-       if (is_pae(vcpu) && is_paging(vcpu) &&
-           !load_pdptrs(vcpu, vcpu->arch.walk_mmu, cr3))
+       if (is_long_mode(vcpu)) {
+               if (cr3 & CR3_L_MODE_RESERVED_BITS)
+                       return 1;
+       } else if (is_pae(vcpu) && is_paging(vcpu) &&
+                  !load_pdptrs(vcpu, vcpu->arch.walk_mmu, cr3))
                return 1;
 
        vcpu->arch.cr3 = cr3;