EmulKbdEvent *kbdevt;
int index = 0;
int written_cnt = 0;
- int *rptr = NULL;
if (!vkbd) {
ERR("VirtIOKeyboard is NULL.\n");
return;
}
- qemu_mutex_lock(&vkbd->event_mutex);
- written_cnt = vkbd->kbdqueue.wptr;
TRACE("[Enter] virtqueue notifier. %d\n", written_cnt);
- qemu_mutex_unlock(&vkbd->event_mutex);
- if (written_cnt < 0) {
- TRACE("there is no input data to copy to guest.\n");
- return;
- }
- rptr = &vkbd->kbdqueue.rptr;
if (!virtio_queue_ready(vkbd->vq)) {
INFO("virtqueue is not ready.\n");
}
if (vkbd->kbdqueue.rptr == VIRTIO_KBD_QUEUE_SIZE) {
- *rptr = 0;
+ vkbd->kbdqueue.rptr = 0;
}
+ qemu_mutex_lock(&vkbd->event_mutex);
+ written_cnt = vkbd->kbdqueue.wptr;
+
while ((written_cnt--)) {
- index = *rptr;
- kbdevt = &vkbd->kbdqueue.kbdevent[index];
+ kbdevt = &vkbd->kbdqueue.kbdevent[vkbd->kbdqueue.rptr];
/* Copy keyboard data into guest side. */
- TRACE("copy: keycode %d, type %d, index %d\n",
+ 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));
+ memcpy(elem.in_sg[index++].iov_base, kbdevt, sizeof(EmulKbdEvent));
memset(kbdevt, 0x00, sizeof(EmulKbdEvent));
- qemu_mutex_lock(&vkbd->event_mutex);
if (vkbd->kbdqueue.wptr > 0) {
vkbd->kbdqueue.wptr--;
+ TRACE("written_cnt: %d, wptr: %d, qemu_index: %d\n", written_cnt, vkbd->kbdqueue.wptr, vkbd->kbdqueue.rptr);
}
- qemu_mutex_unlock(&vkbd->event_mutex);
- (*rptr)++;
- if (*rptr == VIRTIO_KBD_QUEUE_SIZE) {
- *rptr = 0;
+ vkbd->kbdqueue.rptr++;
+ if (vkbd->kbdqueue.rptr == VIRTIO_KBD_QUEUE_SIZE) {
+ vkbd->kbdqueue.rptr = 0;
}
}
+ qemu_mutex_unlock(&vkbd->event_mutex);
virtqueue_push(vkbd->vq, &elem, sizeof(EmulKbdEvent));
virtio_notify(&vkbd->vdev, vkbd->vq);
vkbd->extension_key = 1;
}
+ qemu_mutex_lock(&vkbd->event_mutex);
memcpy(&vkbd->kbdqueue.kbdevent[(*index)++], &kbdevt, sizeof(kbdevt));
TRACE("event: keycode %d, type %d, index %d.\n",
kbdevt.code, kbdevt.type, ((*index) - 1));
- qemu_mutex_lock(&vkbd->event_mutex);
vkbd->kbdqueue.wptr++;
qemu_mutex_unlock(&vkbd->event_mutex);