+}
diff --git a/hid-linux.c b/hid-linux.c
new file mode 100644
-index 0000000..00790b5
+index 0000000..51f70c2
--- /dev/null
+++ b/hid-linux.c
-@@ -0,0 +1,501 @@
+@@ -0,0 +1,538 @@
+/*
+ * QEMU hid-linux /dev/input driver
+ *
+#include <assert.h>
+#include <time.h>
+#include <sys/time.h>
++#include <poll.h>
+
+#define HID_LINUX_XS_PATH "/local/domain/0/hid_linux"
+#define ABS(x) ((x) > 0 ? (x) : -(x))
+ int fd = *(int *)opaque;
+
+ read_sz = read(fd, event, sizeof (event));
++ if (read_sz <= 0)
++ return;
+ for (i = 0; i < read_sz / (sizeof (struct input_event)); i++)
+ {
+ if (event[i].type == EV_KEY &&
+ int fd = *(int *)opaque;
+
+ read_sz = read(fd, event, sizeof (event));
++ if (read_sz <= 0)
++ return;
+ for (i = 0; i < read_sz / (sizeof (struct input_event)); i++)
+ {
+ if (event[i].type == EV_KEY &&
+ assert(hid_linux_driver.secure_key);
+
+ read_sz = read(fd, event, sizeof (event));
++ if (read_sz <= 0)
++ return;
+ for (i = 0; i < read_sz / (sizeof (struct input_event)); i++)
+ if (event[i].type == EV_KEY && event[i].code < BTN_MOUSE &&
+ event[i].value > 0)
+ return 1;
+}
+
++static void hid_linux_check_dead_fd(void)
++{
++ struct pollfd pfds[HID_LINUX_MAX_DEV];
++
++ for (int i = 0; i < HID_LINUX_MAX_DEV; i++)
++ {
++ pfds[i].fd = hid_linux_driver.evdev_fds[i];
++ pfds[i].events = 0;
++ }
++
++ int ret = poll(pfds, HID_LINUX_MAX_DEV, 1 /* timeout */);
++ if (ret == 0) // nothing to tell
++ return;
++ if (ret < 0) // error
++ {
++ DEBUG("poll failed: %s\n", strerror(errno));
++ return;
++ }
++
++ for (int i = 0; i < HID_LINUX_MAX_DEV; i++)
++ if (pfds[i].revents & POLLERR)
++ {
++ DEBUG("dead fd: %d\n", hid_linux_driver.evdev_fds[i]);
++ close(hid_linux_driver.evdev_fds[i]);
++ hid_linux_driver.evdev_fds[i] = -1;
++ }
++}
++
+void hid_linux_probe(int grab __attribute__((unused)))
+{
++ hid_linux_check_dead_fd();
++
+ for (int i = 0; i < HID_LINUX_MAX_DEV; i++)
+ {
+ int fd;
#ifndef CONFIG_STUBDOM
diff --git a/xen-hooks.mak b/xen-hooks.mak
-index 3b60724..8dc3885 100644
+index d171928..15ba4d1 100644
--- a/xen-hooks.mak
+++ b/xen-hooks.mak
@@ -37,6 +37,8 @@ OBJS += helper2.o