KVM: MMU: calculate correct gfn for small host pages backing large guest pages
[pandora-kernel.git] / arch / x86 / kvm / paging_tmpl.h
index 2ee7060..1f7f5dd 100644 (file)
@@ -339,10 +339,13 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr,
                        direct = 1;
                        if (!is_dirty_gpte(gw->ptes[level - delta]))
                                access &= ~ACC_WRITE_MASK;
-                       table_gfn = gpte_to_gfn(gw->ptes[level - delta]);
-                       /* advance table_gfn when emulating 1gb pages with 4k */
-                       if (delta == 0)
-                               table_gfn += PT_INDEX(addr, level);
+                       /*
+                        * It is a large guest pages backed by small host pages,
+                        * So we set @direct(@shadow_page->role.direct)=1, and
+                        * set @table_gfn(@shadow_page->gfn)=the base page frame
+                        * for linear translations.
+                        */
+                       table_gfn = gw->gfn & ~(KVM_PAGES_PER_HPAGE(level) - 1);
                        access &= gw->pte_access;
                } else {
                        direct = 0;