X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fkeyboard.c;h=8f25c0cbed312319ce8edcf7c69008070d0e2343;hb=3cd1d3771e3f8e30b09f6c4995851979aaafc5ff;hp=39accf54c0de81dad7041bae79a03cd1d5749c53;hpb=f9bb3db89469169bb5775dc031d89e570c6fed70;p=palacios.git diff --git a/palacios/src/devices/keyboard.c b/palacios/src/devices/keyboard.c index 39accf5..8f25c0c 100644 --- a/palacios/src/devices/keyboard.c +++ b/palacios/src/devices/keyboard.c @@ -1,8 +1,23 @@ -/* Northwestern University */ -/* (c) 2008, Peter Dinda */ +/* + * This file is part of the Palacios Virtual Machine Monitor developed + * by the V3VEE Project with funding from the United States National + * Science Foundation and the Department of Energy. + * + * The V3VEE Project is a joint project between Northwestern University + * and the University of New Mexico. You can find out more at + * http://www.v3vee.org + * + * Copyright (c) 2008, Peter Dinda + * Copyright (c) 2008, The V3VEE Project + * All rights reserved. + * + * Author: Peter Dinda + * + * This is free software. You are permitted to use, + * redistribute, and modify it as specified in the file "V3VEE_LICENSE". + */ #include -#include #include #include @@ -83,8 +98,6 @@ #define MOUSE 1 -// The currently targetted keyboard -static struct vm_device * thekeyboard = NULL; //#define QUEUE_SIZE 32 @@ -310,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; @@ -362,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); @@ -407,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); @@ -541,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); @@ -727,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) @@ -744,14 +762,14 @@ 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) { if (length == 1) { - *((uchar_t*)dest) = In_Byte(port); + *((uchar_t*)dest) = v3_inb(port); PrintDebug("keyboard: read of 0x%x from 80h\n", *((uchar_t*)dest)); @@ -768,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; @@ -966,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); @@ -988,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); @@ -1084,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); @@ -1126,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; @@ -1149,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 @@ -1165,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; @@ -1192,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; }