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.


symbiotic module changes
[palacios.git] / palacios / src / devices / keyboard.c
index 0fcdc90..2935c43 100644 (file)
 
 #include <palacios/vmm_ringbuffer.h>
 #include <palacios/vmm_lock.h>
+#include <palacios/vmm_intr.h>
+#include <palacios/vmm_host_events.h>
+#include <palacios/vm_guest.h>
 
 
-#ifndef DEBUG_KEYBOARD
+#ifndef CONFIG_DEBUG_KEYBOARD
 #undef PrintDebug
 #define PrintDebug(fmt, args...)
 #endif
@@ -314,9 +317,12 @@ static int pull_from_output_queue(struct vm_device * dev, uint8_t * value) {
 }
 
 
+#include <palacios/vmm_telemetry.h>
+#ifdef CONFIG_SYMMOD
+#include <palacios/vmm_symmod.h>
+#endif
 
-
-static int key_event_handler(struct guest_info * info, 
+static int key_event_handler(struct v3_vm_info * vm, 
                             struct v3_keyboard_event * evt, 
                             void * private_data) {
     struct vm_device * dev = (struct vm_device *)private_data;
@@ -325,9 +331,56 @@ static int key_event_handler(struct guest_info * info,
     PrintDebug("keyboard: injected status 0x%x, and scancode 0x%x\n", evt->status, evt->scan_code);
 
     if (evt->scan_code == 0x44) { // F10 debug dump
-       v3_print_guest_state(info);
+       int i = 0;
+       for (i = 0; i < vm->num_cores; i++) {
+           v3_print_guest_state(&(vm->cores[i]));
+       }
        //      PrintGuestPageTables(info, info->shdw_pg_state.guest_cr3);
+    } 
+#ifdef CONFIG_SYMCALL
+    else if (evt->scan_code == 0x43) { // F9 Sym test
+       struct guest_info * core = &(vm->cores[0]);
+       PrintDebug("Testing sym call\n");
+       sym_arg_t a0 = 0x1111;
+       sym_arg_t a1 = 0x2222;
+       sym_arg_t a2 = 0x3333;
+       sym_arg_t a3 = 0x4444;
+       sym_arg_t a4 = 0x5555;
+       uint64_t call_start = 0;
+       uint64_t call_end = 0;
+       
+       V3_Print("Exits before symcall: %d\n", (uint32_t)core->num_exits);
+
+       rdtscll(call_start);
+       v3_sym_call5(core, SYMCALL_TEST, &a0, &a1, &a2, &a3, &a4);
+       rdtscll(call_end);
+       
+       V3_Print("Symcall latency = %d cycles (%d exits)\n", (uint32_t)(call_end - call_start), (uint32_t)core->num_exits);
+
+       V3_Print("Symcall  Test Returned arg0=%x, arg1=%x, arg2=%x, arg3=%x, arg4=%x\n",
+                (uint32_t)a0, (uint32_t)a1, (uint32_t)a2, (uint32_t)a3, (uint32_t)a4);
+
+    } 
+#endif
+    else if (evt->scan_code == 0x42) { // F8 debug toggle
+       extern int v3_dbg_enable;
+       
+       PrintDebug("Toggling Debugging\n");     
+       v3_dbg_enable ^= 1;
+
+    } 
+#ifdef CONFIG_TELEMETRY
+
+    else if (evt->scan_code == 0x41) { // F7 telemetry dump
+       v3_print_telemetry(vm);
+    } 
+#endif
+#ifdef CONFIG_SYMMOD
+    else if (evt->scan_code == 0x40) { // F6 Test symmod load
+       v3_load_sym_capsule(vm, "lnx_test");
     }
+#endif
+
 
     addr_t irq_state = v3_lock_irqsave(state->kb_lock);
 
@@ -343,7 +396,7 @@ static int key_event_handler(struct guest_info * info,
 }
 
 
-static int mouse_event_handler(struct guest_info * info, 
+static int mouse_event_handler(struct v3_vm_info * vm, 
                               struct v3_mouse_event * evt, 
                               void * private_data) {
     struct vm_device * dev = (struct vm_device *)private_data;
@@ -562,7 +615,7 @@ static int keyboard_write_delay(ushort_t port, void * src,  uint_t length, struc
     }
 }
 
-static int keyboard_read_delay(ushort_t port, void * dest, uint_t length, struct vm_device * dev) {
+static int keyboard_read_delay(struct guest_info * core, ushort_t port, void * dest, uint_t length, struct vm_device * dev) {
 
     if (length == 1) { 
        *(uint8_t *)dest = v3_inb(port);
@@ -582,7 +635,7 @@ static int keyboard_read_delay(ushort_t port, void * dest, uint_t length, struct
 
 
 
-static int keyboard_write_command(ushort_t port, void * src, uint_t length, struct vm_device * dev) {
+static int keyboard_write_command(struct guest_info * core, ushort_t port, void * src, uint_t length, struct vm_device * dev) {
     struct keyboard_internal * state = (struct keyboard_internal *)(dev->private_data);
     uint8_t cmd = *(uint8_t *)src;
 
@@ -755,7 +808,7 @@ static int keyboard_write_command(ushort_t port, void * src, uint_t length, stru
     return length;
 }
 
-static int keyboard_read_status(ushort_t port, void * dest, uint_t length, struct vm_device * dev) {
+static int keyboard_read_status(struct guest_info * core, ushort_t port, void * dest, uint_t length, struct vm_device * dev) {
     struct keyboard_internal *state = (struct keyboard_internal *)(dev->private_data);
 
     if (length != 1) { 
@@ -776,7 +829,7 @@ static int keyboard_read_status(ushort_t port, void * dest, uint_t length, struc
     return length;
 }
 
-static int keyboard_write_output(ushort_t port, void * src, uint_t length, struct vm_device * dev) {
+static int keyboard_write_output(struct guest_info * core, ushort_t port, void * src, uint_t length, struct vm_device * dev) {
     struct keyboard_internal *state = (struct keyboard_internal *)(dev->private_data);
     int ret = length;
 
@@ -911,7 +964,7 @@ static int keyboard_write_output(ushort_t port, void * src, uint_t length, struc
     return ret;
 }
 
-static int keyboard_read_input(ushort_t port, void * dest, uint_t length, struct vm_device * dev) {
+static int keyboard_read_input(struct guest_info * core, ushort_t port, void * dest, uint_t length, struct vm_device * dev) {
     struct keyboard_internal * state = (struct keyboard_internal *)(dev->private_data);
 
     if (length != 1) {
@@ -960,9 +1013,9 @@ static struct v3_device_ops dev_ops = {
 
 
 
-static int keyboard_init(struct guest_info * vm, void * cfg_data) {
+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");
 
     PrintDebug("keyboard: init_device\n");
 
@@ -978,10 +1031,10 @@ static int keyboard_init(struct guest_info * vm, void * cfg_data) {
 
     keyboard_state->mouse_enabled = 0;
 
-    struct vm_device * dev = v3_allocate_device("KEYBOARD", &dev_ops, keyboard_state);
+    struct vm_device * dev = v3_allocate_device(name, &dev_ops, keyboard_state);
 
     if (v3_attach_device(vm, dev) == -1) {
-       PrintError("Could not attach device %s\n", "KEYBOARD");
+       PrintError("Could not attach device %s\n", name);
        return -1;
     }