KVM: SVM: Set the 'g' bit of the cs selector for cross-vendor migration
authorAmit Shah <amit.shah@redhat.com>
Mon, 27 Oct 2008 09:04:17 +0000 (09:04 +0000)
committerAvi Kivity <avi@redhat.com>
Wed, 31 Dec 2008 14:51:48 +0000 (16:51 +0200)
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>
arch/x86/kvm/svm.c

index 05efc4ef75a69938b0c1af59774ea65e4342b319..665008d97856f3b06525fafc92e238b44c96f316 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;
 }
 
This page took 0.029777 seconds and 5 git commands to generate.