X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fkeyboard.c;fp=palacios%2Fsrc%2Fdevices%2Fkeyboard.c;h=0fcdc904d5187ca78bc048246cb7bbb818acecfc;hb=37c18b2c2335a41c68c2f0b779fd2b7d51ab216d;hp=8e378f2796eca0d5bb7329b4f46c0f5d65a5b9ff;hpb=0160025157d9bc39687eb0c5df6cb3d965d20e07;p=palacios.git diff --git a/palacios/src/devices/keyboard.c b/palacios/src/devices/keyboard.c index 8e378f2..0fcdc90 100644 --- a/palacios/src/devices/keyboard.c +++ b/palacios/src/devices/keyboard.c @@ -17,8 +17,8 @@ * redistribute, and modify it as specified in the file "V3VEE_LICENSE". */ -#include #include +#include #include #include @@ -934,39 +934,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 +950,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 +960,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 +978,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); - return device; + +#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)