lkml.org 
[lkml]   [2009]   [Aug]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 44/47] KVM: Use kvm_{read,write}_guest_virt() to read and write segment descriptors
    Date
    From: Mikhail Ershov <Mike.Ershov@gmail.com>

    Segment descriptors tables can be placed on two non-contiguous pages.
    This patch makes reading segment descriptors by linear address.

    Signed-off-by: Mikhail Ershov <Mike.Ershov@gmail.com>
    Signed-off-by: Avi Kivity <avi@redhat.com>
    ---
    arch/x86/kvm/x86.c | 10 ++--------
    1 files changed, 2 insertions(+), 8 deletions(-)

    diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
    index c0e9427..59a8ba4 100644
    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -4021,7 +4021,6 @@ static void get_segment_descriptor_dtable(struct kvm_vcpu *vcpu,
    static int load_guest_segment_descriptor(struct kvm_vcpu *vcpu, u16 selector,
    struct desc_struct *seg_desc)
    {
    - gpa_t gpa;
    struct descriptor_table dtable;
    u16 index = selector >> 3;

    @@ -4031,16 +4030,13 @@ static int load_guest_segment_descriptor(struct kvm_vcpu *vcpu, u16 selector,
    kvm_queue_exception_e(vcpu, GP_VECTOR, selector & 0xfffc);
    return 1;
    }
    - gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, dtable.base);
    - gpa += index * 8;
    - return kvm_read_guest(vcpu->kvm, gpa, seg_desc, 8);
    + return kvm_read_guest_virt(dtable.base + index*8, seg_desc, sizeof(*seg_desc), vcpu);
    }

    /* allowed just for 8 bytes segments */
    static int save_guest_segment_descriptor(struct kvm_vcpu *vcpu, u16 selector,
    struct desc_struct *seg_desc)
    {
    - gpa_t gpa;
    struct descriptor_table dtable;
    u16 index = selector >> 3;

    @@ -4048,9 +4044,7 @@ static int save_guest_segment_descriptor(struct kvm_vcpu *vcpu, u16 selector,

    if (dtable.limit < index * 8 + 7)
    return 1;
    - gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, dtable.base);
    - gpa += index * 8;
    - return kvm_write_guest(vcpu->kvm, gpa, seg_desc, 8);
    + return kvm_write_guest_virt(dtable.base + index*8, seg_desc, sizeof(*seg_desc), vcpu);
    }

    static u32 get_tss_base_addr(struct kvm_vcpu *vcpu,
    --
    1.6.4.1


    \
     
     \ /
      Last update: 2009-08-26 12:45    [W:0.037 / U:61.140 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site