X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fkeyboard.c;h=a3fda90543d69f28d7512f0afd6a8ef531d14077;hb=1598235b4d53e7ae2daf561f36be1962ba42d5bf;hp=375a625b3b5fca5062908a2dcec9b3ea2b379da9;hpb=e5e029575affad90c19ca038a3b780820535d421;p=palacios-OLD.git diff --git a/palacios/src/devices/keyboard.c b/palacios/src/devices/keyboard.c index 375a625..a3fda90 100644 --- a/palacios/src/devices/keyboard.c +++ b/palacios/src/devices/keyboard.c @@ -266,7 +266,7 @@ static int push_to_output_queue(struct vm_device * dev, uint8_t value, uint8_t c q = &(state->kbd_queue); } - if (q->count == QUEUE_SIZE) { + if (q->count >= QUEUE_SIZE) { return 0; } @@ -276,7 +276,14 @@ static int push_to_output_queue(struct vm_device * dev, uint8_t value, uint8_t c state->status.cmd = 0; } - q->queue[q->end++] = value; + q->queue[q->end] = value; + + if (q->end >= (QUEUE_SIZE - 1)) { + q->end = 0; + } else { + q->end++; + } + q->count++; @@ -304,7 +311,14 @@ static int pull_from_output_queue(struct vm_device * dev, uint8_t * value) { return 0; } - *value = q->queue[q->start++]; + *value = q->queue[q->start]; + + if (q->start >= (QUEUE_SIZE - 1)) { + q->start = 0; + } else { + q->start++; + } + q->count--; @@ -936,6 +950,10 @@ static int keyboard_write_output(struct guest_info * core, ushort_t port, void * state->state = SET_LEDS; break; + case 0xee: // echo, used by FreeBSD to probe controller + push_to_output_queue(dev, 0xee, COMMAND, KEYBOARD); + break; + case 0xfe: // resend case 0xfd: // set key type make case 0xfc: // set key typ make/break @@ -1021,6 +1039,8 @@ static int keyboard_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { keyboard_state = (struct keyboard_internal *)V3_Malloc(sizeof(struct keyboard_internal)); + memset(keyboard_state, 0, sizeof(struct keyboard_internal)); + keyboard_state->mouse_queue.start = 0; keyboard_state->mouse_queue.end = 0; keyboard_state->mouse_queue.count = 0;