X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fkeyboard.c;h=a3fda90543d69f28d7512f0afd6a8ef531d14077;hb=1598235b4d53e7ae2daf561f36be1962ba42d5bf;hp=82d45433b6c10f7a34f2f02d057c26e53af12e15;hpb=79665f03e54cd35513b44f25d5f1ab2d591eba5c;p=palacios.git diff --git a/palacios/src/devices/keyboard.c b/palacios/src/devices/keyboard.c index 82d4543..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--; @@ -377,7 +391,7 @@ static int key_event_handler(struct v3_vm_info * vm, #endif #ifdef CONFIG_SYMMOD else if (evt->scan_code == 0x40) { // F6 Test symmod load - v3_load_sym_module(vm, "test_32"); + v3_load_sym_capsule(vm, "lnx_test"); } #endif @@ -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 @@ -1015,12 +1033,14 @@ static struct v3_device_ops dev_ops = { static int keyboard_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { struct keyboard_internal * keyboard_state = NULL; - char * name = v3_cfg_val(cfg, "name"); + char * dev_id = v3_cfg_val(cfg, "ID"); PrintDebug("keyboard: init_device\n"); 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; @@ -1031,10 +1051,10 @@ static int keyboard_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { keyboard_state->mouse_enabled = 0; - struct vm_device * dev = v3_allocate_device(name, &dev_ops, keyboard_state); + struct vm_device * dev = v3_allocate_device(dev_id, &dev_ops, keyboard_state); if (v3_attach_device(vm, dev) == -1) { - PrintError("Could not attach device %s\n", name); + PrintError("Could not attach device %s\n", dev_id); return -1; }