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.


refactoring to the point of compilation
[palacios.git] / palacios / src / devices / keyboard.c
index e9fff1f..c7f0b35 100644 (file)
@@ -23,6 +23,9 @@
 
 #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 CONFIG_DEBUG_KEYBOARD
@@ -314,9 +317,10 @@ static int pull_from_output_queue(struct vm_device * dev, uint8_t * value) {
 }
 
 
+#include <palacios/vmm_telemetry.h>
 
 
-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,10 +329,49 @@ 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_SYMBIOTIC
+    else if (evt->scan_code == 0x43) { // F9 Sym test
+       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)info->num_exits);
+
+       rdtscll(call_start);
+       v3_sym_call5(info, 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)info->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;
+    } else if (evt->scan_code == 0x41) { // F7 telemetry dump
+#ifdef CONFIG_TELEMETRY
+       v3_print_telemetry(info);
+#endif
     }
 
+
+
     addr_t irq_state = v3_lock_irqsave(state->kb_lock);
 
     if ( (state->status.enabled == 1)      // onboard is enabled
@@ -343,7 +386,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 +605,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 +625,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 +798,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 +819,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 +954,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 +1003,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 +1021,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;
     }