Mark zapped root pagetables as invalid and ignore such pages during lookup.
This is a problem with the cr3-target feature, where a zapped root table fools the faulting code into creating a read-only mapping. The result is a lockup if the instruction can't be emulated. Signed-off-by: Marcelo Tosatti <[EMAIL PROTECTED]> Cc: Anthony Liguori <[EMAIL PROTECTED]> Index: kvm.paravirt/arch/x86/kvm/mmu.c =================================================================== --- kvm.paravirt.orig/arch/x86/kvm/mmu.c +++ kvm.paravirt/arch/x86/kvm/mmu.c @@ -668,7 +668,8 @@ static struct kvm_mmu_page *kvm_mmu_look index = kvm_page_table_hashfn(gfn); bucket = &kvm->arch.mmu_page_hash[index]; hlist_for_each_entry(sp, node, bucket, hash_link) - if (sp->gfn == gfn && !sp->role.metaphysical) { + if (sp->gfn == gfn && !sp->role.metaphysical + && !sp->role.invalid) { pgprintk("%s: found role %x\n", __FUNCTION__, sp->role.word); return sp; @@ -796,8 +797,10 @@ static void kvm_mmu_zap_page(struct kvm if (!sp->root_count) { hlist_del(&sp->hash_link); kvm_mmu_free_page(kvm, sp); - } else + } else { list_move(&sp->link, &kvm->arch.active_mmu_pages); + sp->role.invalid = 1; + } kvm_mmu_reset_last_pte_updated(kvm); } Index: kvm.paravirt/include/asm-x86/kvm_host.h =================================================================== --- kvm.paravirt.orig/include/asm-x86/kvm_host.h +++ kvm.paravirt/include/asm-x86/kvm_host.h @@ -140,6 +140,7 @@ union kvm_mmu_page_role { unsigned pad_for_nice_hex_output : 6; unsigned metaphysical : 1; unsigned access : 3; + unsigned invalid : 1; }; }; -- ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel