Skip to contentSkip to conversation

Prevent IRQs when the guest disables the mouse

PATCH New [email protected] 1 participant 1 message Oct 12, 2017

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Prevent IRQs when the guest disables the mouse

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
---
 hw/input/pckbd.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
hw/input/pckbd.c +2 -1
index c479f827b6..78d5356817 100644
@@ -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) &&
Signature · 1 line
2.11.0