Prevent IRQs when the guest disables the mouse
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 2Signed-off-by Geoffrey McRae <[email protected]>
--- hw/input/pckbd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
hw/input/pckbd.c +2 -1
@@ -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