[lkml]   [2010]   [Jun]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[PATCH v3 2/11] KVM: MMU: fix conflict access permissions in direct sp
    In no-direct mapping, we mark sp is 'direct' when we mapping the
    guest's larger page, but its access is encoded form upper page-struct
    entire not include the last mapping, it will cause access conflict.

    For example, have this mapping:
    / PDE1 -> |---|
    P[W] | | LPA
    \ PDE2 -> |---|

    P have two children, PDE1 and PDE2, both PDE1 and PDE2 mapping the
    same lage page(LPA). The P's access is WR, PDE1's access is WR,
    PDE2's access is RO(just consider read-write permissions here)

    When guest access PDE1, we will create a direct sp for LPA, the sp's
    access is from P, is W, then we will mark the ptes is W in this sp.

    Then, guest access PDE2, we will find LPA's shadow page, is the same as
    PDE's, and mark the ptes is RO.

    So, if guest access PDE1, the incorrect #PF is occured.

    Fixed by encode the last mapping access into direct shadow page

    Signed-off-by: Xiao Guangrong <>
    arch/x86/kvm/paging_tmpl.h | 2 ++
    1 files changed, 2 insertions(+), 0 deletions(-)

    diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h
    index 37c26cb..28c8493 100644
    --- a/arch/x86/kvm/paging_tmpl.h
    +++ b/arch/x86/kvm/paging_tmpl.h
    @@ -339,6 +339,8 @@ 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;
    + access &= gw->pte_access;
    * It is a large guest pages backed by small host pages,
    * So we set @direct(@sp->, and set

     \ /
      Last update: 2010-06-30 10:09    [W:0.033 / U:8.676 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site