qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH] No keyboard / mouse after reboot


From: Dinesh Subhraveti
Subject: [Qemu-devel] [PATCH] No keyboard / mouse after reboot
Date: Mon, 13 Jul 2009 16:26:14 -0700

At system initialization, some guests conclude that i8042 controller is missing when the PS2 buffer is full.  As a result, the guest comes up with no keyboard or mouse.  The behavior is seen when the user types or mouses over the VNC window during the BIOS phase of a reboot, causing the PS2 buffer to fill up.  It doesn't occur when the system boots the first time, since the device is initially disabled and doesn't accept events.
 
This patch tunes Qemu parameters to reasonable values which make the guest happy.  Linux assumes the size of PS2 buffer to be 16 bytes, while Qemu defines it as 256.  Reducing PS2_QUEUE_SIZE to 15 ensures that the guest never sees the buffer to be full.
 
However, PS2 mouse event handler drops mouse events unless there is at least 16 bytes of buffer space left in the queue (to account for mouse movements that consume multiple events).  With PS2_QUEUE_SIZE reduced to 15, there will never be 16 bytes left in the queue and no mouse event ever gets in.  So the size of reserved buffer space is reduced to 8.
 
With these changes, both keyboard and mouse remain responsive after reboot, even when typed or moused over during reboot.  Tested with SLES 11 GM 64-bit guest.
 
---
diff --git a/hw/ps2.c b/hw/ps2.c
index fb77005..51a3ab8 100644
--- a/hw/ps2.c
+++ b/hw/ps2.c
@@ -70,7 +70,7 @@
 #define MOUSE_STATUS_ENABLED    0x20
 #define MOUSE_STATUS_SCALE21    0x10

-#define PS2_QUEUE_SIZE 256
+#define PS2_QUEUE_SIZE 15

 typedef struct {
     uint8_t data[PS2_QUEUE_SIZE];
@@ -346,7 +346,7 @@ static void ps2_mouse_event(void *opaque,
     s->mouse_buttons = buttons_state;

     if (!(s->mouse_status & MOUSE_STATUS_REMOTE) &&
-        (s->common.queue.count < (PS2_QUEUE_SIZE - 16))) {
+        (s->common.queue.count < (PS2_QUEUE_SIZE - 8))) {
         for(;;) {
             /* if not remote, send event. Multiple events are sent if
                too big deltas */

reply via email to

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