diff mbox

[HACK] make vmmouse work with KVM

Message ID 20090817152934.GB31650@1und1.de
State Superseded
Headers show

Commit Message

Reimar Döffinger Aug. 17, 2009, 3:29 p.m. UTC
On Mon, Aug 17, 2009 at 04:47:54PM +0200, Reimar Döffinger wrote:
> Hello,
> vmmouse uses a giant hack: it uses io ports (in instruction) but passes
> data via registers.
> This currently does not work since the qemu CPU registers are
> (understandably) not kept in sync with the real KVM registers for this
> operation.
> Attached patch detects access to the vmmouse port and loads/stores CPU
> registers into/from the QEMU state.
> 
> Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>

Slightly simplified since TARGET_X86_64 implies TARGET_I386.
diff mbox

Patch

diff --git a/kvm-all.c b/kvm-all.c
index f669c3a..639bd77 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -611,11 +611,21 @@  int kvm_cpu_exec(CPUState *env)
         switch (run->exit_reason) {
         case KVM_EXIT_IO:
             dprintf("handle_io\n");
+#ifdef TARGET_I386
+            // HACK to make vmport/vmmouse work
+            if (run->io.port == 0x5658)
+                kvm_arch_get_registers(env);
+#endif
             ret = kvm_handle_io(env, run->io.port,
                                 (uint8_t *)run + run->io.data_offset,
                                 run->io.direction,
                                 run->io.size,
                                 run->io.count);
+#ifdef TARGET_I386
+            // HACK to make vmport/vmmouse work
+            if (run->io.port == 0x5658)
+                kvm_arch_put_registers(env);
+#endif
             break;
         case KVM_EXIT_MMIO:
             dprintf("handle_mmio\n");