qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 1/2] Fix real mode guest migration


From: Gleb Natapov
Subject: Re: [Qemu-devel] [PATCH 1/2] Fix real mode guest migration
Date: Mon, 22 Jul 2013 12:58:36 +0300

On Mon, Jul 22, 2013 at 11:49:25AM +0200, 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 <address@hidden>
> > ---
> >  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.
> 
> As discussed offlist, I would prefer to have this in the kernel since
> that's where the bug is.  Gleb disagrees.
> 
This workaround also has to be in userspace if one day someone will
want to implement kvm->tcg migration (nothing impossible here). Also
userspace is the only place where the workaround can be isolated to the
migration code. All this, and the fact that no kernel upgrade is required
to propagate the fix speaks strongly in favor of this patches. For me,
the mere fact that the code is in userspace and no kernel changes
needed, but result is the same is enough.

> 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;
> > 

--
                        Gleb.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]