lkml.org 
[lkml]   [2008]   [Sep]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 19/39] KVM: Load real mode segments correctly
    Date
    From: Avi Kivity <avi@qumranet.com>

    Real mode segments to not reference the GDT or LDT; they simply compute
    base = selector * 16.

    Signed-off-by: Avi Kivity <avi@qumranet.com>
    ---
    arch/x86/kvm/x86.c | 22 ++++++++++++++++++++++
    1 files changed, 22 insertions(+), 0 deletions(-)

    diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
    index 22edd95..bfc7c33 100644
    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -3588,11 +3588,33 @@ static int load_segment_descriptor_to_kvm_desct(struct kvm_vcpu *vcpu,
    return 0;
    }

    +int kvm_load_realmode_segment(struct kvm_vcpu *vcpu, u16 selector, int seg)
    +{
    + struct kvm_segment segvar = {
    + .base = selector << 4,
    + .limit = 0xffff,
    + .selector = selector,
    + .type = 3,
    + .present = 1,
    + .dpl = 3,
    + .db = 0,
    + .s = 1,
    + .l = 0,
    + .g = 0,
    + .avl = 0,
    + .unusable = 0,
    + };
    + kvm_x86_ops->set_segment(vcpu, &segvar, seg);
    + return 0;
    +}
    +
    int kvm_load_segment_descriptor(struct kvm_vcpu *vcpu, u16 selector,
    int type_bits, int seg)
    {
    struct kvm_segment kvm_seg;

    + if (!(vcpu->arch.cr0 & X86_CR0_PE))
    + return kvm_load_realmode_segment(vcpu, selector, seg);
    if (load_segment_descriptor_to_kvm_desct(vcpu, selector, &kvm_seg))
    return 1;
    kvm_seg.type |= type_bits;
    --
    1.6.0.1


    \
     
     \ /
      Last update: 2008-09-25 14:05    [W:0.019 / U:59.772 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site