lkml.org 
[lkml]   [2010]   [Apr]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 16/22] KVM: MMU: Track page fault data in struct vcpu
    Date
    This patch introduces two fields in vcpu_arch for x86:

    * fault_address
    * fault_error_code

    This will be used to correctly propagate page faults back
    into the guest when we could have either an ordinary page
    fault or a nested page fault. In the case of a nested page
    fault the fault-address is different from the original
    address that should be walked. So we need to keep track
    about the real fault-address.
    We could also remove the current path of the error_code to
    the fault. But this change is too invasive and outside the
    scope of this patch set. It will be changed and tested
    seperatly.

    Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
    ---
    arch/x86/include/asm/kvm_host.h | 3 +++
    arch/x86/kvm/paging_tmpl.h | 4 ++++
    2 files changed, 7 insertions(+), 0 deletions(-)

    diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
    index d9dfc8c..8426870 100644
    --- a/arch/x86/include/asm/kvm_host.h
    +++ b/arch/x86/include/asm/kvm_host.h
    @@ -298,6 +298,9 @@ struct kvm_vcpu_arch {
    /* Used for two dimensional paging emulation */
    struct kvm_mmu nested_mmu;

    + unsigned long fault_address;
    + int fault_error_code;
    +
    /* only needed in kvm_pv_mmu_op() path, but it's hot so
    * put it here to avoid allocation */
    struct kvm_pv_mmu_op_buffer mmu_op_buffer;
    diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h
    index 8b27026..df92ce2 100644
    --- a/arch/x86/kvm/paging_tmpl.h
    +++ b/arch/x86/kvm/paging_tmpl.h
    @@ -266,6 +266,10 @@ err:
    walker->error_code |= PFERR_FETCH_MASK;
    if (rsvd_fault)
    walker->error_code |= PFERR_RSVD_MASK;
    +
    + vcpu->arch.fault_address = addr;
    + vcpu->arch.fault_error_code = walker->error_code;
    +
    trace_kvm_mmu_walker_error(walker->error_code);
    return 0;
    }
    --
    1.7.0.4



    \
     
     \ /
      Last update: 2010-04-27 12:51    [W:0.024 / U:121.504 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site