On 09/07/2015 10:17, Richard Henderson wrote: > diff --git a/target-i386/kvm.c b/target-i386/kvm.c > index daced5c..f057982 100644 > --- a/target-i386/kvm.c > +++ b/target-i386/kvm.c > @@ -1541,16 +1541,22 @@ static int kvm_get_sregs(X86CPU *cpu) > #define HFLAG_COPY_MASK \ > ~( HF_CPL_MASK | HF_PE_MASK | HF_MP_MASK | HF_EM_MASK | \ > HF_TS_MASK | HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK | \ > - HF_OSFXSR_MASK | HF_LMA_MASK | HF_CS32_MASK | \ > + HF_OSFXSR_MASK | HF_OSXSAVE_MASK | HF_LMA_MASK | HF_CS32_MASK | \ > HF_SS32_MASK | HF_CS64_MASK | HF_ADDSEG_MASK) > > - hflags = (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK; > + hflags = env->hflags & HFLAG_COPY_MASK; > + hflags |= (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK; > hflags |= (env->cr[0] & CR0_PE_MASK) << (HF_PE_SHIFT - CR0_PE_SHIFT); > hflags |= (env->cr[0] << (HF_MP_SHIFT - CR0_MP_SHIFT)) & > (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK); > hflags |= (env->eflags & (HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK)); > - hflags |= (env->cr[4] & CR4_OSFXSR_MASK) << > - (HF_OSFXSR_SHIFT - CR4_OSFXSR_SHIFT); > + > + if (env->cr[4] & CR4_OSFXSR_MASK) { > + hflags |= HF_OSFXSR_MASK; > + } > + if (env->cr[4] & CR4_OSXSAVE_MASK) { > + hflags |= HF_OSXSAVE_MASK; > + } > > if (env->efer & MSR_EFER_LMA) { > hflags |= HF_LMA_MASK; > @@ -1571,7 +1577,7 @@ static int kvm_get_sregs(X86CPU *cpu) > env->segs[R_SS].base) != 0) << HF_ADDSEG_SHIFT; > } > } > - env->hflags = (env->hflags & HFLAG_COPY_MASK) | hflags; > + env->hflags = hflags; > > return 0; > }
These KVM bits look good. Paolo