-/* (c) 2008, Peter Dinda <pdinda@northwestern.edu> */
-/* (c) 2008, The V3VEE Project <http://www.v3vee.org> */
+/*
+ * 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 <pdinda@northwestern.edu>
+ * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org>
+ * All rights reserved.
+ *
+ * Author: Peter Dinda <pdinda@northwestern.edu>
+ *
+ * This is free software. You are permitted to use,
+ * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
+ */
#include <devices/keyboard.h>
#include <palacios/vmm.h>
#define MOUSE 1
-// The currently targetted keyboard
-static struct vm_device * thekeyboard = NULL;
//#define QUEUE_SIZE 32
#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;
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);
-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);
}
}
-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);
#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)
}
}
-int keyboard_read_delay(ushort_t port,
+static int keyboard_read_delay(ushort_t port,
void * dest,
uint_t length,
struct vm_device * dev)
-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;
}
-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);
}
}
-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);
case 0xff: // reset
PushToOutputQueue(dev, 0xfa, OVERWRITE, COMMAND, KEYBOARD); // ack
state->state = RESET;
- PrintDebug("keyboard: reset complete and acked\n", data);
+ PrintDebug("keyboard: reset complete and acked\n");
break;
case 0xf5: // disable scanning
case 0xf4: // enable scanning
PushToOutputQueue(dev, 0xfa, OVERWRITE, COMMAND, KEYBOARD);
// should do something here... PAD
state->state = NORMAL;
- PrintDebug("keyboard: %s scanning done and acked\n",data==0xf5 ? "disable" : "enable", data);
+ PrintDebug("keyboard: %s scanning done and acked\n",data==0xf5 ? "disable" : "enable");
break;
case 0xfe: // resend
case 0xfd: // set key type make
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);
}
-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;
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
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;
-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;
}