> 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 <avi@xxxxxxxxxx> >>> --- >>> 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 try it with emulate_invalid_guest_state=1. -- 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