+static void regs_to_cpu(vmware_regs_t *vmport_regs, ioreq_t *req)
+{
+ X86CPU *cpu;
+ CPUX86State *env;
+
+ cpu = X86_CPU(current_cpu);
+ env = &cpu->env;
+ env->regs[R_EAX] = req->data;
+ env->regs[R_EBX] = vmport_regs->ebx;
+ env->regs[R_ECX] = vmport_regs->ecx;
+ env->regs[R_EDX] = vmport_regs->edx;
+ env->regs[R_ESI] = vmport_regs->esi;
+ env->regs[R_EDI] = vmport_regs->edi;
+}
+
+static void regs_from_cpu(vmware_regs_t *vmport_regs)
+{
+ X86CPU *cpu = X86_CPU(current_cpu);
+ CPUX86State *env = &cpu->env;
+
+ vmport_regs->ebx = env->regs[R_EBX];
+ vmport_regs->ecx = env->regs[R_ECX];
+ vmport_regs->edx = env->regs[R_EDX];
+ vmport_regs->esi = env->regs[R_ESI];
+ vmport_regs->edi = env->regs[R_EDI];
+}
+
+static void handle_vmport_ioreq(XenIOState *state, ioreq_t *req)
+{
+ vmware_regs_t *vmport_regs;
+
+ assert(state->shared_vmport_page);
+ vmport_regs =
+ &state->shared_vmport_page->vcpu_vmport_regs[state->send_vcpu];
+ QEMU_BUILD_BUG_ON(sizeof(*req) < sizeof(*vmport_regs));
+
+ current_cpu = state->cpu_by_vcpu_id[state->send_vcpu];
+ regs_to_cpu(vmport_regs, req);
+ cpu_ioreq_pio(req);
+ regs_from_cpu(vmport_regs);
+ current_cpu = NULL;
+}
+
+static void handle_ioreq(XenIOState *state, ioreq_t *req)