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.


debugging tweaks and minor fixes
[palacios.git] / palacios / src / devices / keyboard.c
index 8e378f2..a6ba864 100644 (file)
  * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
  */
 
-#include <devices/keyboard.h>
 #include <palacios/vmm.h>
+#include <palacios/vmm_dev_mgr.h>
 #include <palacios/vmm_types.h>
 
 #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
@@ -327,8 +330,32 @@ static int key_event_handler(struct guest_info * info,
     if (evt->scan_code == 0x44) { // F10 debug dump
        v3_print_guest_state(info);
        //      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;
+
+       v3_sym_call5(info, SYMCALL_TEST, &a0, &a1, &a2, &a3, &a4);
+
+       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 Sym test2
+       extern int v3_dbg_enable;
+       
+       PrintDebug("Toggling Debugging\n");     
+       v3_dbg_enable ^= 1;
     }
 
+
+
     addr_t irq_state = v3_lock_irqsave(state->kb_lock);
 
     if ( (state->status.enabled == 1)      // onboard is enabled
@@ -934,39 +961,8 @@ static int keyboard_read_input(ushort_t port, void * dest, uint_t length, struct
 
 
 
-static int keyboard_init_device(struct vm_device * dev) {
-    struct keyboard_internal * state = (struct keyboard_internal *)(dev->private_data);
-
-    PrintDebug("keyboard: init_device\n");
-
-    keyboard_reset_device(dev);
-
-
-    v3_lock_init(&(state->kb_lock));
-
-
-    // hook ports
-    v3_dev_hook_io(dev, KEYBOARD_64H, &keyboard_read_status, &keyboard_write_command);
-    v3_dev_hook_io(dev, KEYBOARD_60H, &keyboard_read_input, &keyboard_write_output);
-
-    v3_hook_host_event(dev->vm, HOST_KEYBOARD_EVT, V3_HOST_EVENT_HANDLER(key_event_handler), dev);
-    v3_hook_host_event(dev->vm, HOST_MOUSE_EVT, V3_HOST_EVENT_HANDLER(mouse_event_handler), dev);
-
-
-#if KEYBOARD_DEBUG_80H
-    v3_dev_hook_io(dev, KEYBOARD_DELAY_80H, &keyboard_read_delay, &keyboard_write_delay);
-#endif
-
-  
-    //
-    // We do not hook the IRQ here.  Instead, the underlying device driver
-    // is responsible to call us back
-    // 
-
-    return 0;
-}
 
-static int keyboard_deinit_device(struct vm_device * dev) {
+static int keyboard_free(struct vm_device * dev) {
 
     v3_dev_unhook_io(dev, KEYBOARD_60H);
     v3_dev_unhook_io(dev, KEYBOARD_64H);
@@ -981,9 +977,8 @@ static int keyboard_deinit_device(struct vm_device * dev) {
 
 
 
-static struct vm_device_ops dev_ops = { 
-    .init = keyboard_init_device, 
-    .deinit = keyboard_deinit_device,
+static struct v3_device_ops dev_ops = { 
+    .free = keyboard_free,
     .reset = keyboard_reset_device,
     .start = keyboard_start_device,
     .stop = keyboard_stop_device,
@@ -992,8 +987,11 @@ static struct vm_device_ops dev_ops = {
 
 
 
-struct vm_device * v3_create_keyboard() {
+static int keyboard_init(struct guest_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");
 
     keyboard_state = (struct keyboard_internal *)V3_Malloc(sizeof(struct keyboard_internal));
 
@@ -1007,7 +1005,40 @@ struct vm_device * v3_create_keyboard() {
 
     keyboard_state->mouse_enabled = 0;
 
-    struct vm_device * device = v3_create_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", name);
+       return -1;
+    }
+
 
-    return device;
+    keyboard_reset_device(dev);
+
+
+    v3_lock_init(&(keyboard_state->kb_lock));
+
+
+    // hook ports
+    v3_dev_hook_io(dev, KEYBOARD_64H, &keyboard_read_status, &keyboard_write_command);
+    v3_dev_hook_io(dev, KEYBOARD_60H, &keyboard_read_input, &keyboard_write_output);
+
+    v3_hook_host_event(vm, HOST_KEYBOARD_EVT, V3_HOST_EVENT_HANDLER(key_event_handler), dev);
+    v3_hook_host_event(vm, HOST_MOUSE_EVT, V3_HOST_EVENT_HANDLER(mouse_event_handler), dev);
+
+
+#if KEYBOARD_DEBUG_80H
+    v3_dev_hook_io(dev, KEYBOARD_DELAY_80H, &keyboard_read_delay, &keyboard_write_delay);
+#endif
+
+  
+    //
+    // We do not hook the IRQ here.  Instead, the underlying device driver
+    // is responsible to call us back
+    // 
+
+    return 0;
 }
+
+
+device_register("KEYBOARD", keyboard_init)