summaryrefslogtreecommitdiff
path: root/arch/x86
diff options
context:
space:
mode:
authorAmit Shah <amit.shah@redhat.com>2008-10-27 09:04:17 (GMT)
committerAvi Kivity <avi@redhat.com>2008-12-31 14:51:48 (GMT)
commit25022acc3dd5f0b54071c7ba7c371860f2971b52 (patch)
tree819a2ae0e14c8f22050ad847a42e4f9058f9f273 /arch/x86
parentb8222ad2e52fd2c0c4e5e1c53e65d131f911b767 (diff)
downloadlinux-fsl-qoriq-25022acc3dd5f0b54071c7ba7c371860f2971b52.tar.xz
KVM: SVM: Set the 'g' bit of the cs selector for cross-vendor migration
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>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/kvm/svm.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 05efc4e..665008d 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -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;
}