From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38831) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V1D30-0006Wp-KG for qemu-devel@nongnu.org; Mon, 22 Jul 2013 06:08:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V1D2y-0005WP-UU for qemu-devel@nongnu.org; Mon, 22 Jul 2013 06:08:54 -0400 Received: from mx1.redhat.com ([209.132.183.28]:41953) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V1D2y-0005W5-Lv for qemu-devel@nongnu.org; Mon, 22 Jul 2013 06:08:52 -0400 Message-ID: <51ED04F8.60200@redhat.com> Date: Mon, 22 Jul 2013 13:10:00 +0300 From: Orit Wasserman MIME-Version: 1.0 References: <1374475799-18523-1-git-send-email-owasserm@redhat.com> <51ED0025.7090805@redhat.com> In-Reply-To: <51ED0025.7090805@redhat.com> Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 1/2] Fix real mode guest migration List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: aliguori@us.ibm.com, ehabkost@redhat.com, gleb@redhat.com, mtosatti@redhat.com, qemu-devel@nongnu.org, afaerber@suse.de On 07/22/2013 12:49 PM, Paolo Bonzini wrote: > Il 22/07/2013 08:49, Orit Wasserman ha scritto: >> Older KVM versions save CS dpl value to an invalid value for real mode guests >> (0x3). This patch detect this situation when loading CPU state and set all the >> segments dpl to zero. >> This will allow migration from older KVM on host without unrestricted guest >> to hosts with restricted guest support. >> For example migration from a Penryn host (with kernel 2.6.32) to >> a Westmere host. >> >> Signed-off-by: Orit Wasserman >> --- >> target-i386/machine.c | 18 ++++++++++++++++++ >> 1 file changed, 18 insertions(+) >> >> diff --git a/target-i386/machine.c b/target-i386/machine.c >> index 3659db9..7e95829 100644 >> --- a/target-i386/machine.c >> +++ b/target-i386/machine.c >> @@ -260,6 +260,24 @@ static int cpu_post_load(void *opaque, int version_id) >> CPUX86State *env = &cpu->env; >> int i; >> >> + /* >> + Real mode guest segments register DPL should be zero. >> + Older KVM version were setting it worngly. >> + Fixing it will allow live migration from such host that don't have >> + restricted guest support to an host with unrestricted guest support >> + (otherwise the migration will fail with invalid guest state >> + error). >> + */ > > Coding standard asks for *s on every line. I will fix it in v2. By the way checkpatch.pl didn't send a warning about this it will be nice to add. > > As discussed offlist, I would prefer to have this in the kernel since > that's where the bug is. Gleb disagrees. > As this is a migration bug I prefer to fix it in the migration code only. Fixing it in the kernel will effect all scenarios that load the segments, in userspace it is only in load VM code. Orit > We need to find a third person who mediates... Anthony, Eduardo, what > do you think? > > Paolo > >> + if (!(env->cr[0] & CR0_PE_MASK) && >> + (env->segs[R_CS].flags >> DESC_DPL_SHIFT & 3) != 0) { >> + env->segs[R_CS].flags &= ~(env->segs[R_CS].flags & DESC_DPL_MASK); >> + env->segs[R_DS].flags &= ~(env->segs[R_DS].flags & DESC_DPL_MASK); >> + env->segs[R_ES].flags &= ~(env->segs[R_ES].flags & DESC_DPL_MASK); >> + env->segs[R_FS].flags &= ~(env->segs[R_FS].flags & DESC_DPL_MASK); >> + env->segs[R_GS].flags &= ~(env->segs[R_GS].flags & DESC_DPL_MASK); >> + env->segs[R_SS].flags &= ~(env->segs[R_SS].flags & DESC_DPL_MASK); >> + } >> + >> /* XXX: restore FPU round state */ >> env->fpstt = (env->fpus_vmstate >> 11) & 7; >> env->fpus = env->fpus_vmstate & ~0x3800; >> >