KVM: MMU: Use different shadows when EFER.NXE changes
authorAvi Kivity <avi@redhat.com>
Tue, 31 Mar 2009 08:31:54 +0000 (11:31 +0300)
committerAvi Kivity <avi@redhat.com>
Wed, 10 Jun 2009 08:48:35 +0000 (11:48 +0300)
A pte that is shadowed when the guest EFER.NXE=1 is not valid when
EFER.NXE=0; if bit 63 is set, the pte should cause a fault, and since the
shadow EFER always has NX enabled, this won't happen.

Fix by using a different shadow page table for different EFER.NXE bits.  This
allows vcpus to run correctly with different values of EFER.NXE, and for
transitions on this bit to be handled correctly without requiring a full
flush.

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

index 548b97d284d3814317a620af55f258920b3a7838..3fc46238476c152cbbb5944cc37fc8a8e798b0d4 100644 (file)
@@ -185,6 +185,7 @@ union kvm_mmu_page_role {
                unsigned access:3;
                unsigned invalid:1;
                unsigned cr4_pge:1;
+               unsigned nxe:1;
        };
 };
 
index df866684bad1f99eb0f28ecfdca0b0b83402a7a8..007fadd62529e9f578a0f5f3e7bcea2e0c13e6ab 100644 (file)
@@ -523,6 +523,9 @@ static void set_efer(struct kvm_vcpu *vcpu, u64 efer)
        efer |= vcpu->arch.shadow_efer & EFER_LMA;
 
        vcpu->arch.shadow_efer = efer;
+
+       vcpu->arch.mmu.base_role.nxe = (efer & EFER_NX) && !tdp_enabled;
+       kvm_mmu_reset_context(vcpu);
 }
 
 void kvm_enable_efer_bits(u64 mask)