KVM: SVM: Restore unconditional cr0 intercept under npt
[safe/jmp/linux-2.6] / arch / x86 / kvm / svm.c
index 949990e..27273ed 100644 (file)
@@ -643,10 +643,8 @@ static void init_vmcb(struct vcpu_svm *svm)
                control->intercept &= ~((1ULL << INTERCEPT_TASK_SWITCH) |
                                        (1ULL << INTERCEPT_INVLPG));
                control->intercept_exceptions &= ~(1 << PF_VECTOR);
-               control->intercept_cr_read &= ~(INTERCEPT_CR0_MASK|
-                                               INTERCEPT_CR3_MASK);
-               control->intercept_cr_write &= ~(INTERCEPT_CR0_MASK|
-                                                INTERCEPT_CR3_MASK);
+               control->intercept_cr_read &= ~INTERCEPT_CR3_MASK;
+               control->intercept_cr_write &= ~INTERCEPT_CR3_MASK;
                save->g_pat = 0x0007040600070406ULL;
                save->cr3 = 0;
                save->cr4 = 0;
@@ -982,15 +980,13 @@ static void svm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0)
                }
        }
 #endif
-       if (npt_enabled)
-               goto set;
-
        vcpu->arch.cr0 = cr0;
-       cr0 |= X86_CR0_PG | X86_CR0_WP;
+
+       if (!npt_enabled)
+               cr0 |= X86_CR0_PG | X86_CR0_WP;
 
        if (!vcpu->fpu_active)
                cr0 |= X86_CR0_TS;
-set:
        /*
         * re-enable caching here because the QEMU bios
         * does not do it - this results in some delay at
@@ -2386,21 +2382,10 @@ static int handle_exit(struct kvm_vcpu *vcpu)
 
        svm_complete_interrupts(svm);
 
-       if (npt_enabled) {
-               int mmu_reload = 0;
-               if ((kvm_read_cr0_bits(vcpu, X86_CR0_PG) ^ svm->vmcb->save.cr0)
-                   & X86_CR0_PG) {
-                       svm_set_cr0(vcpu, svm->vmcb->save.cr0);
-                       mmu_reload = 1;
-               }
+       if (!(svm->vmcb->control.intercept_cr_write & INTERCEPT_CR0_MASK))
                vcpu->arch.cr0 = svm->vmcb->save.cr0;
+       if (npt_enabled)
                vcpu->arch.cr3 = svm->vmcb->save.cr3;
-               if (mmu_reload) {
-                       kvm_mmu_reset_context(vcpu);
-                       kvm_mmu_load(vcpu);
-               }
-       }
-
 
        if (svm->vmcb->control.exit_code == SVM_EXIT_ERR) {
                kvm_run->exit_reason = KVM_EXIT_FAIL_ENTRY;