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 09:59:15 +0300 Message-ID: <4C6CD643.4050907@redhat.com> References: <1282063460-20478-1-git-send-email-avi@redhat.com> <1282063460-20478-4-git-send-email-avi@redhat.com> <4C6CB959.7050707@cn.fujitsu.com> Mime-Version: 1.0 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: 7bit Cc: Marcelo Tosatti , kvm@vger.kernel.org To: Wei Yongjun Return-path: Received: from mx1.redhat.com ([209.132.183.28]:27592 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751018Ab0HSG7X (ORCPT ); Thu, 19 Aug 2010 02:59:23 -0400 In-Reply-To: <4C6CB959.7050707@cn.fujitsu.com> Sender: kvm-owner@vger.kernel.org List-ID: On 08/19/2010 07:55 AM, Wei Yongjun wrote: > Hi Avi Kivity: > >> EFLAGS.ZF needs to be checked after each iteration, not before. >> >> Signed-off-by: Avi Kivity >> --- >> arch/x86/kvm/emulate.c | 38 ++++++++++++++++++-------------------- >> 1 files changed, 18 insertions(+), 20 deletions(-) >> >> diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c >> index 729853a..d15a746 100644 >> --- a/arch/x86/kvm/emulate.c >> +++ b/arch/x86/kvm/emulate.c >> @@ -2782,28 +2782,10 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt) >> ctxt->restart = true; >> /* All REP prefixes have the same first termination condition */ >> if (address_mask(c, c->regs[VCPU_REGS_RCX]) == 0) { >> - string_done: >> ctxt->restart = false; >> ctxt->eip = c->eip; >> goto done; >> } >> - /* 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)) { >> - if ((c->rep_prefix == REPE_PREFIX) && >> - ((ctxt->eflags & EFLG_ZF) == 0)) >> - goto string_done; >> - if ((c->rep_prefix == REPNE_PREFIX) && >> - ((ctxt->eflags & EFLG_ZF) == EFLG_ZF)) >> - goto string_done; >> - } >> - c->eip = ctxt->eip; >> > It seems that you cannot remove the above line, the assign for eip is need. > remove it will break FreeDOS livecd. Not sure why need this. I'll try it out. Are you running FreeDOS with emulate_invalid_guest_state=0 or 1? -- I have a truly marvellous patch that fixes the bug which this signature is too narrow to contain.