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=8f25c0cbed312319ce8edcf7c69008070d0e2343;hb=66a1a4c7a9edcd7d8bc207aca093d694a6e6b5b2;hp=29485be41404941bce21ce8d6676ba2dbfd53d26;hpb=f7cf9c19ecb0a589dd45ae0d2c91814bd3c2acc2;p=palacios.git diff --git a/palacios/src/devices/keyboard.c b/palacios/src/devices/keyboard.c index 29485be..8f25c0c 100644 --- a/palacios/src/devices/keyboard.c +++ b/palacios/src/devices/keyboard.c @@ -98,8 +98,6 @@ #define MOUSE 1 -// The currently targetted keyboard -static struct vm_device * thekeyboard = NULL; //#define QUEUE_SIZE 32 @@ -325,49 +323,52 @@ static int PullFromInputQueue(struct vm_device *dev, uchar_t *value) #endif -static struct vm_device *demultiplex_injected_key(uchar_t status, uchar_t scancode) -{ - // this currently does nothing - return thekeyboard; -} -static struct vm_device *demultiplex_injected_mouse(uchar_t mouse_packet[3]) -{ - // this currently does nothing - return thekeyboard; + + +static int keyboard_interrupt(struct vm_device * dev, uint_t irq) { + PrintDebug("keyboard: interrupt 0x%x\n", irq); + + v3_raise_irq(dev->vm, irq); + + return 0; + } -int keyboard_interrupt(uint_t irq, struct vm_device * dev); -void deliver_key_to_vmm(uchar_t status, uchar_t scancode) -{ - struct vm_device *dev = demultiplex_injected_key(status, scancode); + +static int key_event_handler(struct guest_info * info, + struct v3_keyboard_event * evt, + void * private_data) { + struct vm_device * dev = (struct vm_device *)private_data; struct keyboard_internal *state = (struct keyboard_internal *)(dev->private_data); - PrintDebug("keyboard: injected status 0x%x, and scancode 0x%x\n", status, scancode); + PrintDebug("keyboard: injected status 0x%x, and scancode 0x%x\n", evt->status, evt->scan_code); if ( (state->status_byte & STATUS_ENABLED) // onboard is enabled && (!(state->cmd_byte & CMD_DISABLE)) ) { // keyboard is enabled - - PushToOutputQueue(dev, scancode, OVERWRITE, DATA, KEYBOARD); - + + PushToOutputQueue(dev, evt->scan_code, OVERWRITE, DATA, KEYBOARD); + if (state->cmd_byte & CMD_INTR) { - keyboard_interrupt(KEYBOARD_IRQ, dev); + keyboard_interrupt(dev, KEYBOARD_IRQ); } - } + + return 0; } -void deliver_mouse_to_vmm(uchar_t data[3]) -{ - struct vm_device * dev = demultiplex_injected_mouse(data); +static int mouse_event_handler(struct guest_info * info, + struct v3_mouse_event * evt, + void * private_data) { + struct vm_device * dev = (struct vm_device *)private_data; struct keyboard_internal * state = (struct keyboard_internal *)(dev->private_data); PrintDebug("keyboard: injected mouse packet 0x %x %x %x\n", - data[0], data[1], data[2]); + evt->data[0], evt->data[1], evt->data[2]); - memcpy(state->mouse_packet, data, 3); + memcpy(state->mouse_packet, evt->data, 3); state->status_byte |= STATUS_MOUSE_BUFFER_FULL; @@ -377,17 +378,19 @@ void deliver_mouse_to_vmm(uchar_t data[3]) case STREAM2: case STREAM3: if (!(state->cmd_byte & CMD_MOUSE_DISABLE)) { - keyboard_interrupt(MOUSE_IRQ, dev); + keyboard_interrupt(dev, MOUSE_IRQ); } break; default: + return -1; break; } + return 0; } -int keyboard_reset_device(struct vm_device * dev) +static int keyboard_reset_device(struct vm_device * dev) { struct keyboard_internal *data = (struct keyboard_internal *)(dev->private_data); @@ -422,21 +425,21 @@ int keyboard_reset_device(struct vm_device * dev) -int keyboard_start_device(struct vm_device *dev) +static int keyboard_start_device(struct vm_device *dev) { PrintDebug("keyboard: start device\n"); return 0; } -int keyboard_stop_device(struct vm_device *dev) +static int keyboard_stop_device(struct vm_device *dev) { PrintDebug("keyboard: stop device\n"); return 0; } -int mouse_read_input(struct vm_device *dev) +static int mouse_read_input(struct vm_device *dev) { struct keyboard_internal *state = (struct keyboard_internal *)(dev->private_data); @@ -556,7 +559,7 @@ int mouse_read_input(struct vm_device *dev) } } -int mouse_write_output(struct vm_device * dev, uchar_t data) +static int mouse_write_output(struct vm_device * dev, uchar_t data) { struct keyboard_internal * state = (struct keyboard_internal *)(dev->private_data); @@ -742,7 +745,7 @@ int mouse_write_output(struct vm_device * dev, uchar_t data) #if KEYBOARD_DEBUG_80H -int keyboard_write_delay(ushort_t port, +static int keyboard_write_delay(ushort_t port, void * src, uint_t length, struct vm_device * dev) @@ -759,7 +762,7 @@ int keyboard_write_delay(ushort_t port, } } -int keyboard_read_delay(ushort_t port, +static int keyboard_read_delay(ushort_t port, void * dest, uint_t length, struct vm_device * dev) @@ -783,10 +786,10 @@ int keyboard_read_delay(ushort_t port, -int keyboard_write_command(ushort_t port, - void * src, - uint_t length, - struct vm_device * dev) +static int keyboard_write_command(ushort_t port, + void * src, + uint_t length, + struct vm_device * dev) { struct keyboard_internal *state = (struct keyboard_internal *)(dev->private_data); uchar_t cmd; @@ -981,10 +984,10 @@ int keyboard_write_command(ushort_t port, } -int keyboard_read_status(ushort_t port, - void * dest, - uint_t length, - struct vm_device * dev) +static int keyboard_read_status(ushort_t port, + void * dest, + uint_t length, + struct vm_device * dev) { struct keyboard_internal *state = (struct keyboard_internal *)(dev->private_data); @@ -1003,10 +1006,10 @@ int keyboard_read_status(ushort_t port, } } -int keyboard_write_output(ushort_t port, - void * src, - uint_t length, - struct vm_device * dev) +static int keyboard_write_output(ushort_t port, + void * src, + uint_t length, + struct vm_device * dev) { struct keyboard_internal *state = (struct keyboard_internal *)(dev->private_data); @@ -1099,10 +1102,10 @@ int keyboard_write_output(ushort_t port, return 1; } -int keyboard_read_input(ushort_t port, - void * dest, - uint_t length, - struct vm_device * dev) +static int keyboard_read_input(ushort_t port, + void * dest, + uint_t length, + struct vm_device * dev) { struct keyboard_internal *state = (struct keyboard_internal *)(dev->private_data); @@ -1141,18 +1144,10 @@ int keyboard_read_input(ushort_t port, } -int keyboard_interrupt(uint_t irq, struct vm_device * dev) -{ - PrintDebug("keyboard: interrupt 0x%x\n", irq); - - dev->vm->vm_ops.raise_irq(dev->vm, irq); - - return 0; -} -int keyboard_init_device(struct vm_device * dev) +static int keyboard_init_device(struct vm_device * dev) { // struct keyboard_internal *data = (struct keyboard_internal *) dev->private_data; @@ -1164,11 +1159,15 @@ int keyboard_init_device(struct vm_device * dev) keyboard_reset_device(dev); // hook ports - dev_hook_io(dev, KEYBOARD_64H, &keyboard_read_status, &keyboard_write_command); - dev_hook_io(dev, KEYBOARD_60H, &keyboard_read_input, &keyboard_write_output); + 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 - dev_hook_io(dev, KEYBOARD_DELAY_80H, &keyboard_read_delay, &keyboard_write_delay); + v3_dev_hook_io(dev, KEYBOARD_DELAY_80H, &keyboard_read_delay, &keyboard_write_delay); #endif @@ -1180,13 +1179,13 @@ int keyboard_init_device(struct vm_device * dev) return 0; } -int keyboard_deinit_device(struct vm_device *dev) +static int keyboard_deinit_device(struct vm_device *dev) { - dev_unhook_io(dev, KEYBOARD_60H); - dev_unhook_io(dev, KEYBOARD_64H); + v3_dev_unhook_io(dev, KEYBOARD_60H); + v3_dev_unhook_io(dev, KEYBOARD_64H); #if KEYBOARD_DEBUG_80H - dev_unhook_io(dev, KEYBOARD_DELAY_80H); + v3_dev_unhook_io(dev, KEYBOARD_DELAY_80H); #endif keyboard_reset_device(dev); return 0; @@ -1207,17 +1206,13 @@ static struct vm_device_ops dev_ops = { -struct vm_device *create_keyboard() { - - if (thekeyboard != NULL) { - PrintDebug("keyboard: creating >1 keyboard device. This will probably fail!\n"); - } - - struct keyboard_internal * keyboard_state = (struct keyboard_internal *)V3_Malloc(sizeof(struct keyboard_internal)); +struct vm_device * v3_create_keyboard() { + struct keyboard_internal * keyboard_state = NULL; + + keyboard_state = (struct keyboard_internal *)V3_Malloc(sizeof(struct keyboard_internal)); + + struct vm_device *device = v3_create_device("KEYBOARD", &dev_ops, keyboard_state); - struct vm_device *device = create_device("KEYBOARD", &dev_ops, keyboard_state); - thekeyboard = device; - return device; }