lkml.org 
[lkml]   [2010]   [Sep]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 14/27] KVM: MMU: Make walk_addr_generic capable for two-level walking
    Date
    This patch uses kvm_read_guest_page_tdp to make the
    walk_addr_generic functions suitable for two-level page
    table walking.

    Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
    ---
    arch/x86/kvm/paging_tmpl.h | 27 ++++++++++++++++++++-------
    1 files changed, 20 insertions(+), 7 deletions(-)

    diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h
    index cd59af1..a5b5759 100644
    --- a/arch/x86/kvm/paging_tmpl.h
    +++ b/arch/x86/kvm/paging_tmpl.h
    @@ -124,6 +124,8 @@ static int FNAME(walk_addr_generic)(struct guest_walker *walker,
    unsigned index, pt_access, uninitialized_var(pte_access);
    gpa_t pte_gpa;
    bool eperm, present, rsvd_fault;
    + int offset;
    + u32 error = 0;

    trace_kvm_mmu_pagetable_walk(addr, write_fault, user_fault,
    fetch_fault);
    @@ -153,12 +155,13 @@ walk:
    index = PT_INDEX(addr, walker->level);

    table_gfn = gpte_to_gfn(pte);
    - pte_gpa = gfn_to_gpa(table_gfn);
    - pte_gpa += index * sizeof(pt_element_t);
    + offset = index * sizeof(pt_element_t);
    + pte_gpa = gfn_to_gpa(table_gfn) + offset;
    walker->table_gfn[walker->level - 1] = table_gfn;
    walker->pte_gpa[walker->level - 1] = pte_gpa;

    - if (kvm_read_guest(vcpu->kvm, pte_gpa, &pte, sizeof(pte))) {
    + if (kvm_read_guest_page_mmu(vcpu, mmu, table_gfn, &pte, offset,
    + sizeof(pte), &error)) {
    present = false;
    break;
    }
    @@ -209,15 +212,25 @@ walk:
    is_large_pte(pte) &&
    mmu->root_level == PT64_ROOT_LEVEL)) {
    int lvl = walker->level;
    + gpa_t real_gpa;
    + gfn_t gfn;

    - walker->gfn = gpte_to_gfn_lvl(pte, lvl);
    - walker->gfn += (addr & PT_LVL_OFFSET_MASK(lvl))
    - >> PAGE_SHIFT;
    + gfn = gpte_to_gfn_lvl(pte, lvl);
    + gfn += (addr & PT_LVL_OFFSET_MASK(lvl)) >> PAGE_SHIFT;

    if (PTTYPE == 32 &&
    walker->level == PT_DIRECTORY_LEVEL &&
    is_cpuid_PSE36())
    - walker->gfn += pse36_gfn_delta(pte);
    + gfn += pse36_gfn_delta(pte);
    +
    + real_gpa = mmu->translate_gpa(vcpu, gfn_to_gpa(gfn),
    + &error);
    + if (real_gpa == UNMAPPED_GVA) {
    + walker->error_code = error;
    + return 0;
    + }
    +
    + walker->gfn = real_gpa >> PAGE_SHIFT;

    break;
    }
    --
    1.7.0.4



    \
     
     \ /
      Last update: 2010-09-06 18:01    [W:0.032 / U:30.404 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site