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 device checkpoint hooks
[palacios.git] / palacios / src / devices / keyboard.c
index 5b06858..6d39878 100644 (file)
@@ -28,7 +28,7 @@
 #include <palacios/vm_guest.h>
 
 
-#ifndef CONFIG_DEBUG_KEYBOARD
+#ifndef V3_CONFIG_DEBUG_KEYBOARD
 #undef PrintDebug
 #define PrintDebug(fmt, args...)
 #endif
@@ -335,7 +335,7 @@ static int pull_from_output_queue(struct keyboard_internal * state, uint8_t * va
 
 
 #include <palacios/vmm_telemetry.h>
-#ifdef CONFIG_SYMMOD
+#ifdef V3_CONFIG_SYMMOD
 #include <palacios/vmm_symmod.h>
 #endif
 
@@ -353,7 +353,7 @@ static int key_event_handler(struct v3_vm_info * vm,
        }
        //      PrintGuestPageTables(info, info->shdw_pg_state.guest_cr3);
     } 
-#ifdef CONFIG_SYMCALL
+#ifdef V3_CONFIG_SYMCALL
     else if (evt->scan_code == 0x43) { // F9 Sym test
        struct guest_info * core = &(vm->cores[0]);
        PrintDebug("Testing sym call\n");
@@ -385,13 +385,13 @@ static int key_event_handler(struct v3_vm_info * vm,
        v3_dbg_enable ^= 1;
 
     } 
-#ifdef CONFIG_TELEMETRY
+#ifdef V3_CONFIG_TELEMETRY
 
     else if (evt->scan_code == 0x41) { // F7 telemetry dump
        v3_print_telemetry(vm);
     } 
 #endif
-#ifdef CONFIG_SYMMOD
+#ifdef V3_CONFIG_SYMMOD
     else if (evt->scan_code == 0x40) { // F6 Test symmod load
        v3_load_sym_capsule(vm, "lnx_test");
     }
@@ -876,15 +876,20 @@ static int keyboard_write_output(struct guest_info * core, ushort_t port, void *
                    PrintDebug("Keyboard: scancode set being read\n");
                    push_to_output_queue(kbd, 0x45 - 2 * kbd->scancode_set, COMMAND, KEYBOARD);
                    break;
+               case 1:
+                   PrintError("keyboard: unsupported scancode set %d selected\n", data);
+                   return -1;
                case 2:
                    PrintDebug("Keyboard: scancode set being set to %d\n", data);
                    kbd->scancode_set = data;
                    push_to_output_queue(kbd, 0xfa, COMMAND, KEYBOARD);
                    break;
-               case 1:
                case 3:
-                   PrintError("keyboard: unsupported scancode set %d selected\n", data);
-                   return -1;
+                   /* OpenBSD wants scancode set 3, but falls back to 2 if a
+                    * subsequent read reveals that the request was ignored
+                    */
+                   PrintError("keyboard: ignoring request for scancode set %d\n", data);
+                   break;
                default:
                    PrintError("keyboard: unknown scancode set %d selected\n", data);
                    return -1;
@@ -1046,9 +1051,27 @@ 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) {
+    return 0;
+}
+
+
+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);
+    return 0;
+}
+
+#endif
+
+
 static struct v3_device_ops dev_ops = { 
     .free = (int (*)(void *))keyboard_free,
-
+#ifdef V3_CONFIG_CHECKPOINT
+    .save = keyboard_save,
+    .load = keyboard_load
+#endif
 };