|
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 */ |
[Prev in Thread] | Current Thread | [Next in Thread] |