diff options
author | Jan Beulich <jbeulich@suse.com> | 2012-07-26 16:51:51 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2012-07-26 16:51:51 +0100 |
commit | 09dc3b63b3edd989e7de6f7aaa2fa24f6996aab2 (patch) | |
tree | 0a989e3f90ad26272a2ee40a5c5fb190c09d3ac7 /xen/arch/x86/hvm/io.c | |
parent | d82a726d153bdd9de98cdab27ed2f4e1d8eb47a1 (diff) | |
download | xen-09dc3b63b3edd989e7de6f7aaa2fa24f6996aab2.tar.gz xen-09dc3b63b3edd989e7de6f7aaa2fa24f6996aab2.tar.bz2 xen-09dc3b63b3edd989e7de6f7aaa2fa24f6996aab2.zip |
x86/hvm: don't leave emulator in inconsistent state
The fact that handle_mmio(), and thus the instruction emulator, is
being run through twice for emulations that require involvement of the
device model, allows for the second run to see a different guest state
than the first one. Since only the MMIO-specific emulation routines
update the vCPU's io_state, if they get invoked on the second pass,
internal state (and particularly this variable) can be left in a state
making successful emulation of a subsequent MMIO operation impossible.
Consequently, whenever the emulator invocation returns without
requesting a retry of the guest instruction, reset io_state.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Keir Fraser <keir@xen.org>
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
Diffstat (limited to 'xen/arch/x86/hvm/io.c')
-rw-r--r-- | xen/arch/x86/hvm/io.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/xen/arch/x86/hvm/io.c b/xen/arch/x86/hvm/io.c index 31af045fd9..c20f4e898b 100644 --- a/xen/arch/x86/hvm/io.c +++ b/xen/arch/x86/hvm/io.c @@ -179,6 +179,8 @@ int handle_mmio(void) rc = hvm_emulate_one(&ctxt); + if ( rc != X86EMUL_RETRY ) + vio->io_state = HVMIO_none; if ( vio->io_state == HVMIO_awaiting_completion ) vio->io_state = HVMIO_handle_mmio_awaiting_completion; else |