• Lai Jiangshan's avatar
    KVM: MMU: calculate correct gfn for small host pages backing large guest pages · 3af1817a
    Lai Jiangshan authored
    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: default avatarMarcelo Tosatti <mtosatti@redhat.com>
    Reported-by: default avatarGui Jianfeng <guijianfeng@cn.fujitsu.com>
    Signed-off-by: default avatarLai Jiangshan <laijs@cn.fujitsu.com>
    Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
    3af1817a
paging_tmpl.h 16.8 KB