From mboxrd@z Thu Jan 1 00:00:00 1970 From: Gleb Natapov Subject: Re: [PATCH 1/2] KVM: x86 emulator: commit rflags as part of registers commit. Date: Sun, 21 Mar 2010 13:09:22 +0200 Message-ID: <20100321110922.GE13522@redhat.com> References: <1269169563-22147-1-git-send-email-gleb@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: kvm@vger.kernel.org To: mtosatti@redhat.com Return-path: Received: from mx1.redhat.com ([209.132.183.28]:49763 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753021Ab0CULJY (ORCPT ); Sun, 21 Mar 2010 07:09:24 -0400 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o2LB9N7K028396 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Sun, 21 Mar 2010 07:09:23 -0400 Content-Disposition: inline In-Reply-To: <1269169563-22147-1-git-send-email-gleb@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: 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 > --- > 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@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Gleb.