From patchwork Mon Aug 17 15:45:57 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [HACK] make vmmouse work with KVM Date: Mon, 17 Aug 2009 05:45:57 -0000 From: =?utf-8?q?Reimar_D=C3=B6ffinger?= X-Patchwork-Id: 31525 Message-Id: <20090817154557.GB365@1und1.de> To: qemu-devel@nongnu.org On Mon, Aug 17, 2009 at 10:11:11AM -0500, Anthony Liguori wrote: > 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. > > > > Should use cpu_synchronize_state() in vmport.c Ah, missed that function... Does attached patch look good? diff --git a/hw/vmport.c b/hw/vmport.c index 884af3f..9dc94a3 100644 --- a/hw/vmport.c +++ b/hw/vmport.c @@ -25,6 +25,7 @@ #include "isa.h" #include "pc.h" #include "sysemu.h" +#include "kvm.h" //#define VMPORT_DEBUG @@ -57,6 +58,9 @@ static uint32_t vmport_ioport_read(void *opaque, uint32_t addr) CPUState *env = cpu_single_env; unsigned char command; uint32_t eax; + uint32_t result; + + cpu_synchronize_state(env, 0); eax = env->regs[R_EAX]; if (eax != VMPORT_MAGIC) @@ -73,14 +77,19 @@ static uint32_t vmport_ioport_read(void *opaque, uint32_t addr) return eax; } - return s->func[command](s->opaque[command], addr); + result = s->func[command](s->opaque[command], addr); + cpu_synchronize_state(env, 1); + + return result; } static void vmport_ioport_write(void *opaque, uint32_t addr, uint32_t val) { CPUState *env = cpu_single_env; + cpu_synchronize_state(env, 0); env->regs[R_EAX] = vmport_ioport_read(opaque, addr); + cpu_synchronize_state(env, 1); } static uint32_t vmport_cmd_get_version(void *opaque, uint32_t addr)