Subject says it all.

Signed-off-by: Marcelo Tosatti <[EMAIL PROTECTED]>

Index: kvm-vmx-checks/arch/x86/kvm/x86.c
===================================================================
--- kvm-vmx-checks.orig/arch/x86/kvm/x86.c
+++ kvm-vmx-checks/arch/x86/kvm/x86.c
@@ -3253,6 +3253,8 @@ static int load_guest_segment_descriptor
                return 1;
        }
        gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, dtable.base);
+       if (gpa == UNMAPPED_GVA)
+               return 1;
        gpa += index * 8;
        return kvm_read_guest(vcpu->kvm, gpa, seg_desc, 8);
 }
@@ -3270,11 +3272,13 @@ static int save_guest_segment_descriptor
        if (dtable.limit < index * 8 + 7)
                return 1;
        gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, dtable.base);
+       if (gpa == UNMAPPED_GVA)
+               return 1;
        gpa += index * 8;
        return kvm_write_guest(vcpu->kvm, gpa, seg_desc, 8);
 }
 
-static u32 get_tss_base_addr(struct kvm_vcpu *vcpu,
+static gpa_t get_tss_base_addr(struct kvm_vcpu *vcpu,
                             struct desc_struct *seg_desc)
 {
        u32 base_addr;
@@ -3446,8 +3450,13 @@ static int kvm_task_switch_16(struct kvm
                       struct desc_struct *nseg_desc)
 {
        struct tss_segment_16 tss_segment_16;
+       gpa_t tss_base;
        int ret = 0;
 
+       tss_base = get_tss_base_addr(vcpu, nseg_desc);
+       if (tss_base == UNMAPPED_GVA)
+               goto out;
+
        if (kvm_read_guest(vcpu->kvm, old_tss_base, &tss_segment_16,
                           sizeof tss_segment_16))
                goto out;
@@ -3458,8 +3467,8 @@ static int kvm_task_switch_16(struct kvm
                            sizeof tss_segment_16))
                goto out;
 
-       if (kvm_read_guest(vcpu->kvm, get_tss_base_addr(vcpu, nseg_desc),
-                          &tss_segment_16, sizeof tss_segment_16))
+       if (kvm_read_guest(vcpu->kvm, tss_base, &tss_segment_16,
+                          sizeof tss_segment_16))
                goto out;
 
        if (load_state_from_tss16(vcpu, &tss_segment_16))
@@ -3475,8 +3484,13 @@ static int kvm_task_switch_32(struct kvm
                       struct desc_struct *nseg_desc)
 {
        struct tss_segment_32 tss_segment_32;
+       gpa_t tss_base;
        int ret = 0;
 
+       tss_base = get_tss_base_addr(vcpu, nseg_desc);
+       if (tss_base == UNMAPPED_GVA)
+               goto out;
+
        if (kvm_read_guest(vcpu->kvm, old_tss_base, &tss_segment_32,
                           sizeof tss_segment_32))
                goto out;
@@ -3487,7 +3501,7 @@ static int kvm_task_switch_32(struct kvm
                            sizeof tss_segment_32))
                goto out;
 
-       if (kvm_read_guest(vcpu->kvm, get_tss_base_addr(vcpu, nseg_desc),
+       if (kvm_read_guest(vcpu->kvm, tss_base,
                           &tss_segment_32, sizeof tss_segment_32))
                goto out;
 
@@ -3509,6 +3523,8 @@ int kvm_task_switch(struct kvm_vcpu *vcp
        u16 old_tss_sel = get_segment_selector(vcpu, VCPU_SREG_TR);
 
        old_tss_base = vcpu->arch.mmu.gva_to_gpa(vcpu, old_tss_base);
+       if (old_tss_base == UNMAPPED_GVA)
+               return 1;
 
        /* FIXME: Handle errors. Failure to read either TSS or their
         * descriptors should generate a pagefault.

-- 

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to