KVM: VMX: Relax check on unusable segment
authorAvi Kivity <avi@redhat.com>
Thu, 7 Jun 2012 14:06:10 +0000 (17:06 +0300)
committerAvi Kivity <avi@redhat.com>
Mon, 9 Jul 2012 11:19:01 +0000 (14:19 +0300)
Some userspace (e.g. QEMU 1.1) munge the d and g bits of segment
descriptors, causing us not to recognize them as unusable segments
with emulate_invalid_guest_state=1.  Relax the check by testing for
segment not present (a non-present segment cannot be usable).

Signed-off-by: Avi Kivity <avi@redhat.com>
arch/x86/kvm/vmx.c

index 486db2f9561b78634fb16c405543b034f8c9df1f..82ab1fb2683e2b7fb8d9465b63468eb9f6c94e48 100644 (file)
@@ -3198,7 +3198,7 @@ static u32 vmx_segment_access_rights(struct kvm_segment *var)
 {
        u32 ar;
 
-       if (var->unusable)
+       if (var->unusable || !var->present)
                ar = 1 << 16;
        else {
                ar = var->type & 15;
@@ -3210,8 +3210,6 @@ static u32 vmx_segment_access_rights(struct kvm_segment *var)
                ar |= (var->db & 1) << 14;
                ar |= (var->g & 1) << 15;
        }
-       if (ar == 0) /* a 0 value means unusable */
-               ar = AR_UNUSABLE_MASK;
 
        return ar;
 }