* Copyright (c) 2011 - 2013 Samsung Electronics Co., Ltd All Rights Reserved
*
* Contact:
+ * SungMin Ha <sungmin82.ha@samsung.com>
* Kitae Kim <kt920.kim@samsung.com>
* GiWoong Kim <giwoong.kim@samsung.com>
* SeokYeon Hwang <syeon.hwang@samsung.com>
+ * SangHo Park <sangho.p@samsung.com>
* YeongKyoon Lee <yeongkyoon.lee@samsung.com>
*
* This program is free software; you can redistribute it and/or
MULTI_DEBUG_CHANNEL(qemu, keyboard);
-VirtIOKeyboard *vkbd;
+static VirtIOKbdList *head = NULL;
+static VirtIOKbdList *curr = NULL;
VirtQueueElement elem;
+static VirtIOKbdList* create_list(VirtIOKeyboard *vkbd)
+{
+ VirtIOKbdList *ptr = (VirtIOKbdList*)malloc(sizeof(VirtIOKbdList));
+ if (ptr == NULL) {
+ ERR("Node creation failed\n");
+ return NULL;
+ }
+
+ ptr->vkbd = vkbd;
+ ptr->next = NULL;
+
+ head = curr = ptr;
+ return ptr;
+}
+
+static VirtIOKbdList* add_to_list(VirtIOKeyboard *vkbd, bool add_to_end)
+{
+ if (head == NULL) {
+ return (create_list(vkbd));
+ }
+
+ VirtIOKbdList *ptr = (VirtIOKbdList*)malloc(sizeof(VirtIOKbdList));
+ if (ptr == NULL) {
+ ERR("Node creation failed\n");
+ return NULL;
+ }
+
+ ptr->vkbd = vkbd;
+ ptr->next = NULL;
+
+ if (add_to_end) {
+ curr->next = ptr;
+ curr = ptr;
+ } else {
+ ptr->next = head;
+ head = ptr;
+ }
+
+ return ptr;
+}
+
+static VirtIOKbdList* search_in_list(VirtIOKeyboard *vkbd, VirtIOKbdList **prev)
+{
+ VirtIOKbdList *ptr = head;
+ VirtIOKbdList *tmp = NULL;
+ bool found = false;
+
+ while (ptr != NULL) {
+ if (ptr->vkbd == vkbd) {
+ found = true;
+ break;
+ } else {
+ tmp = ptr;
+ ptr = ptr->next;
+ }
+ }
+
+ if (true == found) {
+ if (prev) {
+ *prev = tmp;
+ }
+ return ptr;
+ } else {
+ return NULL;
+ }
+}
+
+static int delete_from_list(VirtIOKeyboard *vkbd)
+{
+ VirtIOKbdList *prev = NULL;
+ VirtIOKbdList *del = NULL;
+
+ del = search_in_list(vkbd, &prev);
+ if (del == NULL) {
+ return -1;
+ } else {
+ if (prev != NULL) {
+ prev->next = del->next;
+ }
+
+ if (del == curr) {
+ curr = prev;
+ } else if (del == head) {
+ head = del->next;
+ }
+ }
+
+ free(del);
+ del = NULL;
+
+ return 0;
+}
+
static void virtio_keyboard_handle(VirtIODevice *vdev, VirtQueue *vq)
{
VirtIOKeyboard *vkbd = (VirtIOKeyboard *)vdev;
EmulKbdEvent kbdevt = {0};
int *index = NULL;
+ if (!curr) {
+ TRACE("The keyboard device is not realized.\n");
+ return;
+ }
+
+ VirtIOKeyboard *vkbd = curr->vkbd;
if (!vkbd) {
ERR("VirtIOKeyboard is NULL.\n");
return;
static void virtio_keyboard_device_realize(DeviceState *dev, Error **errp)
{
VirtIODevice *vdev = VIRTIO_DEVICE(dev);
- vkbd = VIRTIO_KEYBOARD(vdev);
+ VirtIOKeyboard *vkbd = VIRTIO_KEYBOARD(vdev);
INFO("initialize virtio-keyboard device\n");
/* bottom half */
vkbd->bh = qemu_bh_new(virtio_keyboard_bh, vkbd);
+
+ if (curr == NULL) {
+ create_list(vkbd);
+ } else {
+ add_to_list(vkbd, true);
+ }
}
static void virtio_keyboard_device_unrealize(DeviceState *dev, Error **errp)
VirtIODevice *vdev = VIRTIO_DEVICE(dev);
VirtIOKeyboard *vkbd = (VirtIOKeyboard *)vdev;
+ if (delete_from_list(vkbd) != 0) {
+ ERR("not exist vkbd ptr!\n");
+ }
+
INFO("destroy device\n");
if (vkbd->bh) {
static void virtio_keyboard_device_reset(VirtIODevice *vdev)
{
+ VirtIOKeyboard *vkbd = curr->vkbd;
vkbd = VIRTIO_KEYBOARD(vdev);
INFO("reset keyboard device\n");