KVM: MMU: calculate correct gfn for small host pages backing large guest pages
authorLai Jiangshan <laijs@cn.fujitsu.com>
Wed, 26 May 2010 08:48:19 +0000 (16:48 +0800)
committerAvi Kivity <avi@redhat.com>
Sun, 1 Aug 2010 07:39:21 +0000 (10:39 +0300)
commit3af1817a0d65e8c1317e8d23cfe8a91aa1d4a065
treefaa0f198bebd3496b27b091d0c6d59ba77f9306e
parentc9fa0b3bef9a0b117b3c3f958ec553c21f609a9f
KVM: MMU: calculate correct gfn for small host pages backing large guest pages

In Documentation/kvm/mmu.txt:
  gfn:
    Either the guest page table containing the translations shadowed by this
    page, or the base page frame for linear translations. See role.direct.

But in function FNAME(fetch)(), sp->gfn is incorrect when one of following
situations occurred:

 1) guest is 32bit paging and the guest PDE maps a 4-MByte page
    (backed by 4k host pages), FNAME(fetch)() miss handling the quadrant.

    And if guest use pse-36, "table_gfn = gpte_to_gfn(gw->ptes[level - delta]);"
    is incorrect.

 2) guest is long mode paging and the guest PDPTE maps a 1-GByte page
    (backed by 4k or 2M host pages).

So we fix it to suit to the document and suit to the code which
requires sp->gfn correct when sp->role.direct=1.

We use the goal mapping gfn(gw->gfn) to calculate the base page frame
for linear translations, it is simple and easy to be understood.

Reported-by: Marcelo Tosatti <mtosatti@redhat.com>
Reported-by: Gui Jianfeng <guijianfeng@cn.fujitsu.com>
Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
arch/x86/kvm/paging_tmpl.h