VirtIOKeyboard *vkbd = (VirtIOKeyboard *)vdev;
int index = 0;
- TRACE("virtqueue handler.\n");
if (virtio_queue_empty(vkbd->vq)) {
INFO("virtqueue is empty.\n");
return;
/* Get a queue buffer which is written by guest side. */
do {
index = virtqueue_pop(vq, &elem);
- TRACE("virtqueue pop. index: %d\n", index);
+ TRACE("virtqueue pop.\n");
} while (index < VIRTIO_KBD_QUEUE_SIZE);
}
return;
}
- TRACE("[Enter] virtqueue notifier. %d\n", written_cnt);
+ TRACE("[Enter] virtqueue notifier.\n");
if (!virtio_queue_ready(vkbd->vq)) {
INFO("virtqueue is not ready.\n");
while ((written_cnt--)) {
kbdevt = &vkbd->kbdqueue.kbdevent[vkbd->kbdqueue.rptr];
-
- while (((EmulKbdEvent*)(elem.in_sg[index].iov_base))->code != 0) {
- if (++index == VIRTIO_KBD_QUEUE_SIZE) {
- index--;
- TRACE("virtio queue is full.\n");
- break;
- }
- }
+ if (((EmulKbdEvent*)(elem.in_sg[vkbd->kbdqueue.rptr].iov_base))->code != 0) {
+ TRACE("FIXME: virtio queue is full.\n");
+ }
/* Copy keyboard data into guest side. */
TRACE("copy: keycode %d, type %d, elem_index %d\n",
- kbdevt->code, kbdevt->type, index);
- memcpy(elem.in_sg[index++].iov_base, kbdevt, sizeof(EmulKbdEvent));
+ kbdevt->code, kbdevt->type, vkbd->kbdqueue.rptr);
+ memcpy(elem.in_sg[vkbd->kbdqueue.rptr].iov_base, kbdevt, sizeof(EmulKbdEvent));
memset(kbdevt, 0x00, sizeof(EmulKbdEvent));
if (vkbd->kbdqueue.wptr > 0) {
vkbd->kbdqueue.rptr++;
if (vkbd->kbdqueue.rptr == VIRTIO_KBD_QUEUE_SIZE) {
vkbd->kbdqueue.rptr = 0;
- TRACE("kbdqueue is full.\n");
}
}
qemu_mutex_unlock(&vkbd->event_mutex);