9ae3a8
From 38c385caa32752ef176ffd1448e45e0dc94d5043 Mon Sep 17 00:00:00 2001
9ae3a8
From: Orit Wasserman <owasserm@redhat.com>
9ae3a8
Date: Wed, 9 Oct 2013 10:09:11 +0200
9ae3a8
Subject: [PATCH 16/25] Fix real mode guest segments dpl value in savevm
9ae3a8
9ae3a8
RH-Author: Orit Wasserman <owasserm@redhat.com>
9ae3a8
Message-id: <1381313355-15641-7-git-send-email-owasserm@redhat.com>
9ae3a8
Patchwork-id: 54802
9ae3a8
O-Subject: [RHEL7.0 qemu-kvm v2 06/10] Fix real mode guest segments dpl value in savevm
9ae3a8
Bugzilla: 921465
9ae3a8
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
9ae3a8
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
9ae3a8
RH-Acked-by: Juan Quintela <quintela@redhat.com>
9ae3a8
9ae3a8
Older KVM version put invalid value in the segments registers dpl field for
9ae3a8
real mode guests (0x3).
9ae3a8
This breaks migration from those hosts to hosts with unrestricted guest support.
9ae3a8
We detect it by checking CS dpl value for real mode guest and fix the dpl values
9ae3a8
of all the segment registers.
9ae3a8
9ae3a8
Signed-off-by: Orit Wasserman <owasserm@redhat.com>
9ae3a8
Reviewed-by: Juan Quintela <quintela@redhat.com>
9ae3a8
Signed-off-by: Juan Quintela <quintela@redhat.com>
9ae3a8
(cherry picked from commit 3e47c249b93d5cc1e0f9404dbe243682598ba8fb)
9ae3a8
---
9ae3a8
 target-i386/machine.c | 18 ++++++++++++++++++
9ae3a8
 1 file changed, 18 insertions(+)
9ae3a8
9ae3a8
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
9ae3a8
---
9ae3a8
 target-i386/machine.c |   18 ++++++++++++++++++
9ae3a8
 1 files changed, 18 insertions(+), 0 deletions(-)
9ae3a8
9ae3a8
diff --git a/target-i386/machine.c b/target-i386/machine.c
9ae3a8
index 079a132..8faea62 100644
9ae3a8
--- a/target-i386/machine.c
9ae3a8
+++ b/target-i386/machine.c
9ae3a8
@@ -252,6 +252,24 @@ static void cpu_pre_save(void *opaque)
9ae3a8
     }
9ae3a8
 
9ae3a8
     env->fpregs_format_vmstate = 0;
9ae3a8
+
9ae3a8
+    /*
9ae3a8
+     * Real mode guest segments register DPL should be zero.
9ae3a8
+     * Older KVM version were setting it wrongly.
9ae3a8
+     * Fixing it will allow live migration to host with unrestricted guest
9ae3a8
+     * support (otherwise the migration will fail with invalid guest state
9ae3a8
+     * error).
9ae3a8
+     */
9ae3a8
+    if (!(env->cr[0] & CR0_PE_MASK) &&
9ae3a8
+        (env->segs[R_CS].flags >> DESC_DPL_SHIFT & 3) != 0) {
9ae3a8
+        env->segs[R_CS].flags &= ~(env->segs[R_CS].flags & DESC_DPL_MASK);
9ae3a8
+        env->segs[R_DS].flags &= ~(env->segs[R_DS].flags & DESC_DPL_MASK);
9ae3a8
+        env->segs[R_ES].flags &= ~(env->segs[R_ES].flags & DESC_DPL_MASK);
9ae3a8
+        env->segs[R_FS].flags &= ~(env->segs[R_FS].flags & DESC_DPL_MASK);
9ae3a8
+        env->segs[R_GS].flags &= ~(env->segs[R_GS].flags & DESC_DPL_MASK);
9ae3a8
+        env->segs[R_SS].flags &= ~(env->segs[R_SS].flags & DESC_DPL_MASK);
9ae3a8
+    }
9ae3a8
+
9ae3a8
 }
9ae3a8
 
9ae3a8
 static int cpu_post_load(void *opaque, int version_id)
9ae3a8
-- 
9ae3a8
1.7.1
9ae3a8