From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH v2 3/3] KVM: x86 emulator: fix REPZ/REPNZ termination condition Date: Thu, 19 Aug 2010 14:31:12 +0300 Message-ID: <4C6D1600.8050505@redhat.com> References: <1282063460-20478-1-git-send-email-avi@redhat.com> <1282063460-20478-4-git-send-email-avi@redhat.com> <20100819105505.GI10499@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: Marcelo Tosatti , kvm@vger.kernel.org To: Gleb Natapov Return-path: Received: from mx1.redhat.com ([209.132.183.28]:25705 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751206Ab0HSLbO (ORCPT ); Thu, 19 Aug 2010 07:31:14 -0400 Received: from int-mx08.intmail.prod.int.phx2.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o7JBVEtK019453 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 19 Aug 2010 07:31:14 -0400 Received: from cleopatra.tlv.redhat.com (cleopatra.tlv.redhat.com [10.35.255.11]) by int-mx08.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o7JBVD4t027724 for ; Thu, 19 Aug 2010 07:31:13 -0400 In-Reply-To: <20100819105505.GI10499@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: On 08/19/2010 01:55 PM, Gleb Natapov wrote: > On Tue, Aug 17, 2010 at 07:44:20PM +0300, Avi Kivity wrote: >> if ((c->src.type == OP_MEM)&& !(c->d& NoAccess)) { >> @@ -3230,13 +3212,29 @@ writeback: >> if (c->rep_prefix&& (c->d& String)) { >> struct read_cache *rc =&ctxt->decode.io_read; >> register_address_increment(c,&c->regs[VCPU_REGS_RCX], -1); >> + /* 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)))) >> + ctxt->restart = false; >> /* >> * Re-enter guest when pio read ahead buffer is empty or, >> * if it is not used, after each 1024 iteration. >> */ >> - if ((rc->end == 0&& !(c->regs[VCPU_REGS_RCX]& 0x3ff)) || >> - (rc->end != 0&& rc->end == rc->pos)) >> + else if ((rc->end == 0&& !(c->regs[VCPU_REGS_RCX]& 0x3ff)) || >> + (rc->end != 0&& rc->end == rc->pos)) { >> ctxt->restart = false; >> + c->eip = ctxt->eip; > If io exit to use space is needed we may not get here, so ctxt->eip will > be updated to point past instruction in the middle of instruction > emulation and that may cause incomplete instruction emulation. Right. Fixing this made -cdrom work again. Will post an updated patch. -- error compiling committee.c: too many arguments to function