KVM: SVM: Set the 'g' bit of the cs selector for cross-vendor migration
authorAmit Shah <amit.shah@redhat.com>
Mon, 23 Mar 2009 20:51:22 +0000 (17:51 -0300)
committerGreg Kroah-Hartman <gregkh@suse.de>
Sat, 2 May 2009 17:57:05 +0000 (10:57 -0700)
(cherry picked from 25022acc3dd5f0b54071c7ba7c371860f2971b52)

The hardware does not set the 'g' bit of the cs selector and this breaks
migration from amd hosts to intel hosts. Set this bit if the segment
limit is beyond 1 MB.

Signed-off-by: Amit Shah <amit.shah@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
arch/x86/kvm/svm.c

index 9c4ce657d96389753ff9650bb06f12bf76e003c8..14ba6ff63cfc1a6ccd47e64c9153fb901aad64d5 100644 (file)
@@ -772,6 +772,15 @@ static void svm_get_segment(struct kvm_vcpu *vcpu,
        var->l = (s->attrib >> SVM_SELECTOR_L_SHIFT) & 1;
        var->db = (s->attrib >> SVM_SELECTOR_DB_SHIFT) & 1;
        var->g = (s->attrib >> SVM_SELECTOR_G_SHIFT) & 1;
+
+       /*
+        * SVM always stores 0 for the 'G' bit in the CS selector in
+        * the VMCB on a VMEXIT. This hurts cross-vendor migration:
+        * Intel's VMENTRY has a check on the 'G' bit.
+        */
+       if (seg == VCPU_SREG_CS)
+               var->g = s->limit > 0xfffff;
+
        var->unusable = !var->present;
 }