X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fkeyboard.c;h=00e497a8c5344e39fb5c4dfc8f027f93d8b0785d;hb=cd012ba87f57c1c694038f1a17f249f90f9a2be8;hp=8e378f2796eca0d5bb7329b4f46c0f5d65a5b9ff;hpb=51a4889bd4aceea8308b2b23adf6a68455c52936;p=palacios.git diff --git a/palacios/src/devices/keyboard.c b/palacios/src/devices/keyboard.c index 8e378f2..00e497a 100644 --- a/palacios/src/devices/keyboard.c +++ b/palacios/src/devices/keyboard.c @@ -17,15 +17,15 @@ * redistribute, and modify it as specified in the file "V3VEE_LICENSE". */ -#include #include +#include #include #include #include -#ifndef DEBUG_KEYBOARD +#ifndef CONFIG_DEBUG_KEYBOARD #undef PrintDebug #define PrintDebug(fmt, args...) #endif @@ -327,8 +327,16 @@ 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); + } else if (evt->scan_code == 0x43) { // F9 Sym test + PrintDebug("Testing sym call\n"); + v3_sym_call5(info, SYMCALL_TEST, 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, NULL, NULL); + } else if (evt->scan_code == 0x42) { // F8 Sym test2 + PrintDebug("Testing sym call\n"); + v3_sym_call1(info, SYMCALL_MEM_LOOKUP, 0, NULL, NULL); } + + addr_t irq_state = v3_lock_irqsave(state->kb_lock); if ( (state->status.enabled == 1) // onboard is enabled @@ -934,39 +942,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 +958,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,9 +968,12 @@ static struct vm_device_ops dev_ops = { -struct vm_device * v3_create_keyboard() { +static int keyboard_init(struct guest_info * vm, void * cfg_data) { struct keyboard_internal * keyboard_state = NULL; + + PrintDebug("keyboard: init_device\n"); + keyboard_state = (struct keyboard_internal *)V3_Malloc(sizeof(struct keyboard_internal)); keyboard_state->mouse_queue.start = 0; @@ -1007,7 +986,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("KEYBOARD", &dev_ops, keyboard_state); + + if (v3_attach_device(vm, dev) == -1) { + PrintError("Could not attach device %s\n", "KEYBOARD"); + return -1; + } + + + 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 - return device; + + // + // 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)