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.


added dedicated debugging framework with associated interface
[palacios.git] / palacios / src / devices / keyboard.c
index 5943fd3..b451e2e 100644 (file)
@@ -26,6 +26,7 @@
 #include <palacios/vmm_intr.h>
 #include <palacios/vmm_host_events.h>
 #include <palacios/vm_guest.h>
+#include <palacios/vmm_debug.h>
 
 
 #ifndef V3_CONFIG_DEBUG_KEYBOARD
@@ -188,6 +189,9 @@ struct keyboard_internal {
         // after having a f0 sent to 60
        // we wait for a new output byte on 60
        GETSET_SCANCODES,
+       // first send ACK (0xfa)
+       // then wait for reception, and reset kb state
+       SET_DEFAULTS,
     } state;
 
 
@@ -211,8 +215,8 @@ struct keyboard_internal {
     // Data for system
     uint8_t wrap;     
 
-    int mouse_enabled;
-    int scancode_set;
+    uint8_t mouse_enabled;
+    uint8_t scancode_set;
 
     struct queue kbd_queue;
     struct queue mouse_queue;
@@ -223,6 +227,9 @@ struct keyboard_internal {
 };
 
 
+static int keyboard_reset_device(struct keyboard_internal * kbd);
+
+
 static int update_kb_irq(struct keyboard_internal * state) {
     int irq_num = 0;
 
@@ -388,7 +395,7 @@ static int key_event_handler(struct v3_vm_info * vm,
 #ifdef V3_CONFIG_TELEMETRY
 
     else if (evt->scan_code == 0x41) { // F7 telemetry dump
-       v3_print_telemetry(vm);
+       v3_print_global_telemetry(vm);
     } 
 #endif
 #ifdef V3_CONFIG_SYMMOD
@@ -892,12 +899,18 @@ static int keyboard_write_output(struct guest_info * core, ushort_t port, void *
                    break;
                default:
                    PrintError("keyboard: unknown scancode set %d selected\n", data);
-                   return -1;
+                   ret = -1;
+                    break;
   
            }
            kbd->state = NORMAL;
            break;
 
+       case SET_DEFAULTS:
+           keyboard_reset_device(kbd);
+           kbd->state = NORMAL;
+           break;
+
        default:
        case NORMAL: {
            // command is being sent to keyboard controller
@@ -942,6 +955,15 @@ static int keyboard_write_output(struct guest_info * core, ushort_t port, void *
                    kbd->state = GETSET_SCANCODES;
                    break;
 
+
+               case 0xf6: // set defaults
+                   // ACK command
+                   // clear output buffer
+                   // reset to init state
+                   push_to_output_queue(kbd, 0xfa, COMMAND, KEYBOARD);
+                   kbd->state = SET_DEFAULTS;
+                   break;
+
                case 0xfe: // resend
                case 0xfd: // set key type make
                case 0xfc: // set key typ make/break
@@ -950,7 +972,7 @@ static int keyboard_write_output(struct guest_info * core, ushort_t port, void *
                case 0xf9: // set all make
                case 0xf8: // set all make/break
                case 0xf7: // set all typemaktic
-               case 0xf6: // set defaults
+
                    PrintError("keyboard: unhandled known command 0x%x on output buffer (60h)\n", data);
                    ret = -1;
                    break;
@@ -1053,6 +1075,18 @@ static int keyboard_reset_device(struct keyboard_internal * kbd) {
 
 #ifdef V3_CONFIG_CHECKPOINT
 static int keyboard_save(struct v3_chkpt_ctx * ctx, void * private_data) {
+    struct keyboard_internal * kbd = (struct keyboard_internal *)private_data;
+
+    v3_chkpt_save_8(ctx, "CMD_REG", &(kbd->cmd.val));
+    v3_chkpt_save_8(ctx, "STATUS_REG", &(kbd->status.val));
+    v3_chkpt_save_8(ctx, "STATE", &(kbd->state));
+    v3_chkpt_save_8(ctx, "MOUSE_STATE", &(kbd->mouse_state));
+    v3_chkpt_save_8(ctx, "OUTPUT", &(kbd->output_byte));
+    v3_chkpt_save_8(ctx, "INPUT", &(kbd->input_byte));
+    v3_chkpt_save_8(ctx, "SCANCODE_SET", &(kbd->scancode_set));
+    v3_chkpt_save_8(ctx, "MOUSE_ENABLED", &(kbd->mouse_enabled));
+
+
     return 0;
 }
 
@@ -1060,6 +1094,17 @@ static int keyboard_save(struct v3_chkpt_ctx * ctx, void * private_data) {
 static int keyboard_load(struct v3_chkpt_ctx * ctx, void * private_data) {
     struct keyboard_internal * kbd = (struct keyboard_internal *)private_data;
     keyboard_reset_device(kbd);
+
+    v3_chkpt_load_8(ctx, "CMD_REG", &(kbd->cmd.val));
+    v3_chkpt_load_8(ctx, "STATUS_REG", &(kbd->status.val));
+    v3_chkpt_load_8(ctx, "STATE", &(kbd->state));
+    v3_chkpt_load_8(ctx, "MOUSE_STATE", &(kbd->mouse_state));
+    v3_chkpt_load_8(ctx, "OUTPUT", &(kbd->output_byte));
+    v3_chkpt_load_8(ctx, "INPUT", &(kbd->input_byte));
+    v3_chkpt_load_8(ctx, "SCANCODE_SET", &(kbd->scancode_set));
+    v3_chkpt_load_8(ctx, "MOUSE_ENABLED", &(kbd->mouse_enabled));
+
+
     return 0;
 }