X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fkeyboard.c;h=cf619676535ec6c756b6038c799bdb83c5bd43fd;hp=8e378f2796eca0d5bb7329b4f46c0f5d65a5b9ff;hb=123a1ba27ea09c8fa77a1b36ce625b43d7c48b14;hpb=51a4889bd4aceea8308b2b23adf6a68455c52936 diff --git a/palacios/src/devices/keyboard.c b/palacios/src/devices/keyboard.c index 8e378f2..cf61967 100644 --- a/palacios/src/devices/keyboard.c +++ b/palacios/src/devices/keyboard.c @@ -17,15 +17,18 @@ * redistribute, and modify it as specified in the file "V3VEE_LICENSE". */ -#include #include +#include #include #include #include +#include +#include +#include -#ifndef DEBUG_KEYBOARD +#ifndef CONFIG_DEBUG_KEYBOARD #undef PrintDebug #define PrintDebug(fmt, args...) #endif @@ -327,7 +330,28 @@ 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); + } +#ifdef CONFIG_SYMBIOTIC +else if (evt->scan_code == 0x43) { // F9 Sym test + PrintDebug("Testing sym call\n"); + sym_arg_t a0 = 0x1111; + sym_arg_t a1 = 0x2222; + sym_arg_t a2 = 0x3333; + sym_arg_t a3 = 0x4444; + sym_arg_t a4 = 0x5555; + + v3_sym_call5(info, SYMCALL_TEST, &a0, &a1, &a2, &a3, &a4); + + V3_Print("Symcall Test Returned arg0=%x, arg1=%x, arg2=%x, arg3=%x, arg4=%x\n", + (uint32_t)a0, (uint32_t)a1, (uint32_t)a2, (uint32_t)a3, (uint32_t)a4); + + } else if (evt->scan_code == 0x42) { // F8 Sym test2 + PrintDebug("Testing sym call\n"); + sym_arg_t addr = 0; + v3_sym_call1(info, SYMCALL_MEM_LOOKUP, &addr); } +#endif + addr_t irq_state = v3_lock_irqsave(state->kb_lock); @@ -934,39 +958,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 +974,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,8 +984,11 @@ static struct vm_device_ops dev_ops = { -struct vm_device * v3_create_keyboard() { +static int keyboard_init(struct guest_info * vm, v3_cfg_tree_t * cfg) { struct keyboard_internal * keyboard_state = NULL; + char * name = v3_cfg_val(cfg, "name"); + + PrintDebug("keyboard: init_device\n"); keyboard_state = (struct keyboard_internal *)V3_Malloc(sizeof(struct keyboard_internal)); @@ -1007,7 +1002,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(name, &dev_ops, keyboard_state); + + if (v3_attach_device(vm, dev) == -1) { + PrintError("Could not attach device %s\n", name); + 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)