qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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


From: geoff
Subject: [Qemu-devel] [PATCH] [pckbd] Prevent IRQs when the guest disables the mouse
Date: Thu, 12 Oct 2017 22:59:32 +1100
User-agent: Roundcube Webmail/1.2.3

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 <address@hidden>
---
 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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]