On Sun, Mar 14, 2010 at 06:56:37PM +0200, Avi Kivity wrote: > On 03/14/2010 06:21 PM, Gleb Natapov wrote: > >Currently when string instruction is only partially complete we go back > >to a guest mode, guest tries to reexecute instruction and exits again > >and at this point emulation continues. Avoid all of this by restarting > >instruction without going back to a guest mode, but return to a guest > >mode on each page boundary to allow interrupt injection. Pending > >exception causes immediate guest entry too. > > > >@@ -2913,6 +2917,8 @@ writeback: > > c->dst.ptr = (unsigned long *) > > register_address(c, es_base(ctxt), > > c->regs[VCPU_REGS_RDI]); > >+ if (!(c->regs[VCPU_REGS_RDI]& ~PAGE_MASK)) > >+ ctxt->restart = false; > > } > > What if rdi is odd and operand size != 1? > Will change to if ((c->regs[VCPU_REGS_RDI]& ~PAGE_MASK) < c->dst.bytes) > Suggest simply reentering every N executions. > This restart mechanism is, in fact, needed for ins read ahead to work. After reading ahead from IO port we need to avoid entering decoder until entire cache is consumed otherwise decoder will clear cache and data will be lost. So we can't just enter guest in arbitrary times, only when read ahead cache is empty. Since read ahead is never done across page boundary this is save place to re-enter guest. -- Gleb. -- 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