Wrong To: header. Ignore please. On Sun, Mar 21, 2010 at 01:06:02PM +0200, Gleb Natapov wrote: > Make sure that rflags is committed only after successful instruction > emulation. > > Signed-off-by: Gleb Natapov <gleb@xxxxxxxxxx> > --- > arch/x86/include/asm/kvm_emulate.h | 1 + > arch/x86/kvm/emulate.c | 1 + > arch/x86/kvm/x86.c | 8 ++++++-- > 3 files changed, 8 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/include/asm/kvm_emulate.h b/arch/x86/include/asm/kvm_emulate.h > index b5e12c5..a1319c8 100644 > --- a/arch/x86/include/asm/kvm_emulate.h > +++ b/arch/x86/include/asm/kvm_emulate.h > @@ -136,6 +136,7 @@ struct x86_emulate_ops { > ulong (*get_cr)(int cr, struct kvm_vcpu *vcpu); > void (*set_cr)(int cr, ulong val, struct kvm_vcpu *vcpu); > int (*cpl)(struct kvm_vcpu *vcpu); > + void (*set_rflags)(struct kvm_vcpu *vcpu, unsigned long rflags); > }; > > /* Type, address-of, and value of an instruction's operand. */ > diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c > index 266576c..c1aa983 100644 > --- a/arch/x86/kvm/emulate.c > +++ b/arch/x86/kvm/emulate.c > @@ -2968,6 +2968,7 @@ writeback: > /* Commit shadow register state. */ > memcpy(ctxt->vcpu->arch.regs, c->regs, sizeof c->regs); > kvm_rip_write(ctxt->vcpu, c->eip); > + ops->set_rflags(ctxt->vcpu, ctxt->eflags); > > done: > return (rc == X86EMUL_UNHANDLEABLE) ? -1 : 0; > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index bb9a24a..3fa70b3 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -3643,6 +3643,11 @@ static void emulator_set_segment_selector(u16 sel, int seg, > kvm_set_segment(vcpu, &kvm_seg, seg); > } > > +static void emulator_set_rflags(struct kvm_vcpu *vcpu, unsigned long rflags) > +{ > + kvm_x86_ops->set_rflags(vcpu, rflags); > +} > + > static struct x86_emulate_ops emulate_ops = { > .read_std = kvm_read_guest_virt_system, > .write_std = kvm_write_guest_virt_system, > @@ -3660,6 +3665,7 @@ static struct x86_emulate_ops emulate_ops = { > .get_cr = emulator_get_cr, > .set_cr = emulator_set_cr, > .cpl = emulator_get_cpl, > + .set_rflags = emulator_set_rflags, > }; > > static void cache_all_regs(struct kvm_vcpu *vcpu) > @@ -3780,8 +3786,6 @@ restart: > return EMULATE_DO_MMIO; > } > > - kvm_x86_ops->set_rflags(vcpu, vcpu->arch.emulate_ctxt.eflags); > - > if (vcpu->mmio_is_write) { > vcpu->mmio_needed = 0; > return EMULATE_DO_MMIO; > -- > 1.6.5 > > -- > To unsubscribe from this list: send the line "unsubscribe kvm" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Gleb. -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html