[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] x86/HVM: fix interaction between internal and extern emulation



handle_hvm_io_completion() is being involved in resuming from requests
sent to a device model only, while re-invocation of internally handled
I/O which couldn't be handled in one go simply re-starts the affected
instruction. When an internally handled split request is being followed
by one sent to a device model, so far nothing reset vio->io_completion,
leading to an MMIO emulation attempt on the next instruction _after_ the
one succesfully sent to qemu if that one doesn't itself require
completion handling.

Since only repeated string instructions are affected, strictly speaking
the adjustment to handle_pio() isn't needed. Do it nevertheless for
consistency as well as to avoid the lack thereof becoming an issue in
the future; put the main change in generic enough a place to also cover
VMX real mode emulation.

Reported-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
---
It has been puzzling me for years how we could get away without clearing
vio->io_completion in any more central place, i.e. other than as part of
handling the completion.

--- a/xen/arch/x86/hvm/emulate.c
+++ b/xen/arch/x86/hvm/emulate.c
@@ -2107,6 +2107,7 @@ static int _hvm_emulate_one(struct hvm_e
     hvm_emulate_init_per_insn(hvmemul_ctxt, vio->mmio_insn,
                               vio->mmio_insn_bytes);
 
+    vio->io_completion = HVMIO_no_completion;
     vio->mmio_retry = 0;
 
     rc = x86_emulate(&hvmemul_ctxt->ctxt, ops);
--- a/xen/arch/x86/hvm/io.c
+++ b/xen/arch/x86/hvm/io.c
@@ -139,6 +139,8 @@ bool handle_pio(uint16_t port, unsigned
     if ( dir == IOREQ_WRITE )
         data = guest_cpu_user_regs()->eax;
 
+    vio->io_completion = HVMIO_no_completion;
+
     rc = hvmemul_do_pio_buffer(port, size, dir, &data);
 
     if ( hvm_vcpu_io_need_completion(vio) )




_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.