summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr/src/uts/i86pc/io/vmm/vmm_instruction_emul.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/usr/src/uts/i86pc/io/vmm/vmm_instruction_emul.c b/usr/src/uts/i86pc/io/vmm/vmm_instruction_emul.c
index 18d756e363..31f6ea75b5 100644
--- a/usr/src/uts/i86pc/io/vmm/vmm_instruction_emul.c
+++ b/usr/src/uts/i86pc/io/vmm/vmm_instruction_emul.c
@@ -993,11 +993,19 @@ vie_emulate_movs(struct vie *vie, struct vm *vm, int vcpuid, uint64_t gpa)
*/
error = vie_mmio_read(vie, vm, vcpuid, gpa, &val,
opsize);
- if (error)
- goto done;
- vm_copyout(vm, vcpuid, &val, copyinfo, opsize);
- vm_copy_teardown(vm, vcpuid, copyinfo, nitems(copyinfo));
+ if (error == 0) {
+ vm_copyout(vm, vcpuid, &val, copyinfo, opsize);
+ }
+ /*
+ * Regardless of whether the MMIO read was successful or
+ * not, the copy resources must be cleaned up.
+ */
+ vm_copy_teardown(vm, vcpuid, copyinfo,
+ nitems(copyinfo));
+ if (error != 0) {
+ goto done;
+ }
} else {
/*
* Case (4): read from and write to mmio.