aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/kvm/mmu.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/drivers/kvm/mmu.c b/drivers/kvm/mmu.c
index 8bdb9ca1811c..9ff74805c7d1 100644
--- a/drivers/kvm/mmu.c
+++ b/drivers/kvm/mmu.c
@@ -806,10 +806,12 @@ static void mmu_free_roots(struct kvm_vcpu *vcpu)
806 for (i = 0; i < 4; ++i) { 806 for (i = 0; i < 4; ++i) {
807 hpa_t root = vcpu->mmu.pae_root[i]; 807 hpa_t root = vcpu->mmu.pae_root[i];
808 808
809 ASSERT(VALID_PAGE(root)); 809 if (root) {
810 root &= PT64_BASE_ADDR_MASK; 810 ASSERT(VALID_PAGE(root));
811 page = page_header(root); 811 root &= PT64_BASE_ADDR_MASK;
812 --page->root_count; 812 page = page_header(root);
813 --page->root_count;
814 }
813 vcpu->mmu.pae_root[i] = INVALID_PAGE; 815 vcpu->mmu.pae_root[i] = INVALID_PAGE;
814 } 816 }
815 vcpu->mmu.root_hpa = INVALID_PAGE; 817 vcpu->mmu.root_hpa = INVALID_PAGE;
@@ -840,9 +842,13 @@ static void mmu_alloc_roots(struct kvm_vcpu *vcpu)
840 hpa_t root = vcpu->mmu.pae_root[i]; 842 hpa_t root = vcpu->mmu.pae_root[i];
841 843
842 ASSERT(!VALID_PAGE(root)); 844 ASSERT(!VALID_PAGE(root));
843 if (vcpu->mmu.root_level == PT32E_ROOT_LEVEL) 845 if (vcpu->mmu.root_level == PT32E_ROOT_LEVEL) {
846 if (!is_present_pte(vcpu->pdptrs[i])) {
847 vcpu->mmu.pae_root[i] = 0;
848 continue;
849 }
844 root_gfn = vcpu->pdptrs[i] >> PAGE_SHIFT; 850 root_gfn = vcpu->pdptrs[i] >> PAGE_SHIFT;
845 else if (vcpu->mmu.root_level == 0) 851 } else if (vcpu->mmu.root_level == 0)
846 root_gfn = 0; 852 root_gfn = 0;
847 page = kvm_mmu_get_page(vcpu, root_gfn, i << 30, 853 page = kvm_mmu_get_page(vcpu, root_gfn, i << 30,
848 PT32_ROOT_LEVEL, !is_paging(vcpu), 854 PT32_ROOT_LEVEL, !is_paging(vcpu),