KVM: x86: IN instruction emulation should ignore REP-prefix
authorNadav Amit <namit@cs.technion.ac.il>
Fri, 18 Apr 2014 00:35:10 +0000 (03:35 +0300)
committerMarcelo Tosatti <mtosatti@redhat.com>
Wed, 23 Apr 2014 20:46:59 +0000 (17:46 -0300)
The IN instruction is not be affected by REP-prefix as INS is.  Therefore, the
emulation should ignore the REP prefix as well.  The current emulator
implementation tries to perform writeback when IN instruction with REP-prefix
is emulated. This causes it to perform wrong memory write or spurious #GP
exception to be injected to the guest.

Signed-off-by: Nadav Amit <namit@cs.technion.ac.il>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
arch/x86/kvm/emulate.c

index f3834bbca1d79ccab02880f2eb3acaf3fa74c97f..e8a58409b5ac0e2788a96a2fb97be7b77dea82bd 100644 (file)
@@ -1324,7 +1324,8 @@ static int pio_in_emulated(struct x86_emulate_ctxt *ctxt,
                rc->end = n * size;
        }
 
-       if (ctxt->rep_prefix && !(ctxt->eflags & EFLG_DF)) {
+       if (ctxt->rep_prefix && (ctxt->d & String) &&
+           !(ctxt->eflags & EFLG_DF)) {
                ctxt->dst.data = rc->data + rc->pos;
                ctxt->dst.type = OP_MEM_STR;
                ctxt->dst.count = (rc->end - rc->pos) / size;