Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


This command implements the 0xee echo command on the keyboard controller.
[palacios.git] / palacios / src / devices / keyboard.c
index 82d4543..a3fda90 100644 (file)
@@ -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;
     }