[Qemu-devel] [PATCH] [pckbd] Prevent IRQs when the guest disables the mouse

geoff--- via Qemu-devel posted 1 patch 6 years, 6 months ago
Failed in applying to current master (apply log)
hw/input/pckbd.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
[Qemu-devel] [PATCH] [pckbd] Prevent IRQs when the guest disables the mouse
Posted by geoff--- via Qemu-devel 6 years, 6 months ago
When the guest OS needs to send the mouse commands it will at least in 
the case
of Windows 10 set the KBD_MODE_DISABLE_MOUSE bit to prevent interrupts 
from
causing stream desynchronisation.

Here is Windows 10 attempting to issue a PS/2 mouse reset without this 
fix where
you can see the mouse positional data was returned as the answer to the 
get type
command.

     KBD: kbd: write cmd=0xd4  // write next cmd to the aux port
     KBD: kbd: read status=0x1c
     KBD: kbd: read status=0x1c
     KBD: kbd: read status=0x1c
     KBD: kbd: write data=0xff
     kbd: write mouse 0xff     // reset
     KBD: kbd: read status=0x3d
     KBD: kbd: read status=0x3d
     KBD: kbd: read data=0xfa  // ack
     KBD: kbd: read status=0x3d
     KBD: kbd: read status=0x3d
     KBD: kbd: read data=0xaa  // self-test good
     KBD: kbd: read status=0x3d
     KBD: kbd: read status=0x3d
     KBD: kbd: read data=0x00  // the device type
     KBD: kbd: read status=0x3d
     KBD: kbd: write cmd=0xd4  // write cmd to the aux port
     KBD: kbd: read status=0x3d
     KBD: kbd: write data=0xf2
     kbd: write mouse 0xf2     // get type
     KBD: kbd: read status=0x3d
     KBD: kbd: read status=0x3d
     KBD: kbd: read data=0x08  // mouse data byte 1
     KBD: kbd: read status=0x3d
     KBD: kbd: read status=0x3d
     KBD: kbd: read data=0x00  // mouse data byte 2
     KBD: kbd: read status=0x3d
     KBD: kbd: read status=0x3d
     KBD: kbd: read data=0x00  // mouse data byte 3
     KBD: kbd: read status=0x3d
     KBD: kbd: read status=0x3d
     KBD: kbd: read data=0xfa  // the ack for the get type above
     KBD: kbd: read status=0x3d
     KBD: kbd: read status=0x3d
     KBD: kbd: read data=0x00  // the device type
     KBD: kbd: read status=0x3d
     KBD: kbd: read status=0x3d
     KBD: kbd: read data=0x08  // mouse data byte 1
     KBD: kbd: read status=0x3d
     KBD: kbd: read status=0x3d
     KBD: kbd: read data=0x00  // mouse data byte 2

Signed-off-by: Geoffrey McRae <geoff@hostfission.com>
---
  hw/input/pckbd.c | 3 ++-
  1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/hw/input/pckbd.c b/hw/input/pckbd.c
index c479f827b6..78d5356817 100644
--- a/hw/input/pckbd.c
+++ b/hw/input/pckbd.c
@@ -168,7 +168,8 @@ static void kbd_update_irq(KBDState *s)
          if (s->pending == KBD_PENDING_AUX) {
              s->status |= KBD_STAT_MOUSE_OBF;
              s->outport |= KBD_OUT_MOUSE_OBF;
-            if (s->mode & KBD_MODE_MOUSE_INT)
+            if ((s->mode & KBD_MODE_MOUSE_INT) &&
+                !(s->mode & KBD_MODE_DISABLE_MOUSE))
                  irq_mouse_level = 1;
          } else {
              if ((s->mode & KBD_MODE_KBD_INT) &&
-- 
2.11.0