]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
KVM: MMU: Segregate mmu pages created with different cr4.pge settings
authorAvi Kivity <avi@redhat.com>
Sun, 21 Dec 2008 17:27:36 +0000 (19:27 +0200)
committerAvi Kivity <avi@redhat.com>
Sun, 21 Dec 2008 17:27:36 +0000 (19:27 +0200)
Don't allow a vcpu with cr4.pge cleared to use a shadow page created with
cr4.pge set; this might cause a cr3 switch not to sync ptes that have the
global bit set (the global bit has no effect if !cr4.pge).

This can only occur on smp with different cr4.pge settings for different
vcpus (since a cr4 change will resync the shadow ptes), but there's no
cost to being correct here.

Signed-off-by: Avi Kivity <avi@redhat.com>
arch/x86/include/asm/kvm_host.h
arch/x86/kvm/x86.c

index f49bfd04b91d6cfab96c8cc97778feb88235d000..ab8ef1d117f2ab1ab0de4e83f8b8dc9ed2e3190a 100644 (file)
@@ -183,6 +183,7 @@ union kvm_mmu_page_role {
                unsigned metaphysical:1;
                unsigned access:3;
                unsigned invalid:1;
+               unsigned cr4_pge:1;
        };
 };
 
index c4da7fbabe01e45d8ce3403101dc644a2c1c8e44..aa4575c3b6579a0764744de12719e56c18d532c1 100644 (file)
@@ -363,6 +363,7 @@ void kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
        }
        kvm_x86_ops->set_cr4(vcpu, cr4);
        vcpu->arch.cr4 = cr4;
+       vcpu->arch.mmu.base_role.cr4_pge = !!(cr4 & X86_CR4_PGE);
        kvm_mmu_sync_global(vcpu);
        kvm_mmu_reset_context(vcpu);
 }