|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |