[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 |