Patchwork Re: [HACK] make vmmouse work with KVM

login
register
mail settings
Submitter Reimar Döffinger
Date Aug. 17, 2009, 5:32 p.m.
Message ID <20090817173232.GA1961@1und1.de>
Download mbox | patch
Permalink /patch/31529/
State Superseded
Headers show

Comments

Reimar Döffinger - Aug. 17, 2009, 5:32 p.m.
On Mon, Aug 17, 2009 at 07:16:49PM +0200, Paolo Bonzini wrote:
> On 08/17/2009 07:00 PM, Reimar Döffinger wrote:
> > On Mon, Aug 17, 2009 at 06:44:11PM +0200, Paolo Bonzini wrote:
> >> On 08/17/2009 05:45 PM, Reimar Döffinger wrote:
> >>> +    cpu_synchronize_state(env, 0);
> >>>        env->regs[R_EAX] = vmport_ioport_read(opaque, addr);
> >>> +    cpu_synchronize_state(env, 1);
> >>
> >> This is not needed because the sync is done in vmport_ioport_read, isn't it?
> >
> > Well... The cpu_synchronize_state could be dropped you are right, but
> > here we write R_EAX so the cpu_synchronize_state(env, 1) is necessary.
> > It might be slightly cleaner to rename the vmport_ioport_read (any name
> > suggestions?) and add a wrapper for register_ioport_read that does the
> > cpu_synchronize_state (so it looks similar to vmport_ioport_write).
> 
> Yes, that would look best and wouldn't have fooled me. Could 
> vmport_ioport_trigger be a decent name?

Since what that function actually does is execute a specific command it
gets from ecx I went with vmport_ioport_command, but I'll happily leave
the naming to whoever applies it :-)

Greetings,
Reimar Döffinger

Patch

diff --git a/hw/vmport.c b/hw/vmport.c
index 884af3f..7ba6e2e 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
 
@@ -51,7 +52,7 @@  void vmport_register(unsigned char command, IOPortReadFunc *func, void *opaque)
     port_state.opaque[command] = opaque;
 }
 
-static uint32_t vmport_ioport_read(void *opaque, uint32_t addr)
+static uint32_t vmport_ioport_command(void *opaque, uint32_t addr)
 {
     VMPortState *s = opaque;
     CPUState *env = cpu_single_env;
@@ -76,11 +77,24 @@  static uint32_t vmport_ioport_read(void *opaque, uint32_t addr)
     return s->func[command](s->opaque[command], addr);
 }
 
+static uint32_t vmport_ioport_read(void *opaque, uint32_t addr)
+{
+    CPUState *env = cpu_single_env;
+    uint32_t result;
+
+    cpu_synchronize_state(env, 0);
+    result = vmport_ioport_command(opaque, 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;
 
-    env->regs[R_EAX] = vmport_ioport_read(opaque, addr);
+    cpu_synchronize_state(env, 0);
+    env->regs[R_EAX] = vmport_ioport_command(opaque, addr);
+    cpu_synchronize_state(env, 1);
 }
 
 static uint32_t vmport_cmd_get_version(void *opaque, uint32_t addr)