From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH 2/3] KVM: x86 emulator: move string instruction completion check into separate function Date: Tue, 24 Aug 2010 16:11:20 +0300 Message-ID: <4C73C4F8.9030809@redhat.com> References: <1282649455-9463-1-git-send-email-gleb@redhat.com> <1282649455-9463-2-git-send-email-gleb@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: mtosatti@redhat.com, kvm@vger.kernel.org To: Gleb Natapov Return-path: Received: from mx1.redhat.com ([209.132.183.28]:14758 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751452Ab0HXNLW (ORCPT ); Tue, 24 Aug 2010 09:11:22 -0400 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o7ODBLqJ003861 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 24 Aug 2010 09:11:21 -0400 Received: from cleopatra.tlv.redhat.com (cleopatra.tlv.redhat.com [10.35.255.11]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o7ODBL2f013258 for ; Tue, 24 Aug 2010 09:11:21 -0400 In-Reply-To: <1282649455-9463-2-git-send-email-gleb@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: On 08/24/2010 02:30 PM, Gleb Natapov wrote: > Signed-off-by: Gleb Natapov > --- > arch/x86/kvm/emulate.c | 42 +++++++++++++++++++++++++++++------------- > 1 files changed, 29 insertions(+), 13 deletions(-) > > diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c > index f9f8353..d34d706 100644 > --- a/arch/x86/kvm/emulate.c > +++ b/arch/x86/kvm/emulate.c > @@ -2921,6 +2921,32 @@ done: > return (rc == X86EMUL_UNHANDLEABLE) ? -1 : 0; > } > > +static bool string_inst_completed(struct x86_emulate_ctxt *ctxt) s/inst/insn/. > +{ > + struct decode_cache *c =&ctxt->decode; > + > + /* All REP prefixes have the same first termination condition */ > + if (address_mask(c, c->regs[VCPU_REGS_RCX]) == 0) > + return true; This is checked during the beginning of the instruction, not after completion. Why is it here? it will just be duplicated. > + > + /* The second termination condition only applies for REPE > + * and REPNE. Test if the repeat string operation prefix is > + * REPE/REPZ or REPNE/REPNZ and if it's the case it tests the > + * corresponding termination condition according to: > + * - if REPE/REPZ and ZF = 0 then done > + * - if REPNE/REPNZ and ZF = 1 then done > + */ > + if (((c->b == 0xa6) || (c->b == 0xa7) || > + (c->b == 0xae) || (c->b == 0xaf)) > + && (((c->rep_prefix == REPE_PREFIX)&& > + ((ctxt->eflags& EFLG_ZF) == 0)) > + || ((c->rep_prefix == REPNE_PREFIX)&& > + ((ctxt->eflags& EFLG_ZF) == EFLG_ZF)))) > + return true; > + > + return false; > +} > + -- error compiling committee.c: too many arguments to function