*
  * EMULTYPE_SKIP - Set when emulating solely to skip an instruction, i.e. to
  *                decode the instruction length.  For use *only* by
- *                kvm_x86_ops.skip_emulated_instruction() implementations.
+ *                kvm_x86_ops.skip_emulated_instruction() implementations if
+ *                EMULTYPE_COMPLETE_USER_EXIT is not set.
  *
  * EMULTYPE_ALLOW_RETRY_PF - Set when the emulator should resume the guest to
  *                          retry native execution under certain conditions,
  *
  * EMULTYPE_PF - Set when emulating MMIO by way of an intercepted #PF, in which
  *              case the CR2/GPA value pass on the stack is valid.
+ *
+ * EMULTYPE_COMPLETE_USER_EXIT - Set when the emulator should update interruptibility
+ *                              state and inject single-step #DBs after skipping
+ *                              an instruction (after completing userspace I/O).
  */
 #define EMULTYPE_NO_DECODE         (1 << 0)
 #define EMULTYPE_TRAP_UD           (1 << 1)
 #define EMULTYPE_TRAP_UD_FORCED            (1 << 4)
 #define EMULTYPE_VMWARE_GP         (1 << 5)
 #define EMULTYPE_PF                (1 << 6)
+#define EMULTYPE_COMPLETE_USER_EXIT (1 << 7)
 
 int kvm_emulate_instruction(struct kvm_vcpu *vcpu, int emulation_type);
 int kvm_emulate_instruction_from_buffer(struct kvm_vcpu *vcpu,
 
        }
 
        /*
-        * Note, EMULTYPE_SKIP is intended for use *only* by vendor callbacks
-        * for kvm_skip_emulated_instruction().  The caller is responsible for
-        * updating interruptibility state and injecting single-step #DBs.
+        * EMULTYPE_SKIP without EMULTYPE_COMPLETE_USER_EXIT is intended for
+        * use *only* by vendor callbacks for kvm_skip_emulated_instruction().
+        * The caller is responsible for updating interruptibility state and
+        * injecting single-step #DBs.
         */
        if (emulation_type & EMULTYPE_SKIP) {
                if (ctxt->mode != X86EMUL_MODE_PROT64)
                else
                        ctxt->eip = ctxt->_eip;
 
+               if (emulation_type & EMULTYPE_COMPLETE_USER_EXIT) {
+                       r = 1;
+                       goto writeback;
+               }
+
                kvm_rip_write(vcpu, ctxt->eip);
                if (ctxt->eflags & X86_EFLAGS_RF)
                        kvm_set_rflags(vcpu, ctxt->eflags & ~X86_EFLAGS_RF);
        else
                r = 1;
 
+writeback:
        if (writeback) {
                unsigned long rflags = static_call(kvm_x86_get_rflags)(vcpu);
                toggle_interruptibility(vcpu, ctxt->interruptibility);