X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_host_events.c;h=3e6d09b8e4a534e48d6f628e0e76ca9a00da44f9;hb=3b0d98aaf40fd7a1bfc3bc736144386636cc7a73;hp=5e6baf2d028a8552e9988be56c61b961e58efecc;hpb=3e5e5a12e64630d7a37ed32b8d7e2d993c79f7e0;p=palacios.git diff --git a/palacios/src/palacios/vmm_host_events.c b/palacios/src/palacios/vmm_host_events.c index 5e6baf2..3e6d09b 100644 --- a/palacios/src/palacios/vmm_host_events.c +++ b/palacios/src/palacios/vmm_host_events.c @@ -27,6 +27,51 @@ int v3_init_host_events(struct v3_vm_info * vm) { INIT_LIST_HEAD(&(host_evts->keyboard_events)); INIT_LIST_HEAD(&(host_evts->mouse_events)); INIT_LIST_HEAD(&(host_evts->timer_events)); + INIT_LIST_HEAD(&(host_evts->serial_events)); + INIT_LIST_HEAD(&(host_evts->console_events)); + INIT_LIST_HEAD(&(host_evts->packet_events)); + + return 0; +} + +int v3_deinit_host_events(struct v3_vm_info * vm) { + struct v3_host_events * host_evts = &(vm->host_event_hooks); + struct v3_host_event_hook * hook = NULL; + struct v3_host_event_hook * tmp = NULL; + + list_for_each_entry_safe(hook, tmp, &(host_evts->keyboard_events), link) { + list_del(&(hook->link)); + V3_Free(hook); + } + + list_for_each_entry_safe(hook, tmp, &(host_evts->mouse_events), link) { + list_del(&(hook->link)); + V3_Free(hook); + } + + + list_for_each_entry_safe(hook, tmp, &(host_evts->timer_events), link) { + list_del(&(hook->link)); + V3_Free(hook); + } + + + list_for_each_entry_safe(hook, tmp, &(host_evts->serial_events), link) { + list_del(&(hook->link)); + V3_Free(hook); + } + + + list_for_each_entry_safe(hook, tmp, &(host_evts->console_events), link) { + list_del(&(hook->link)); + V3_Free(hook); + } + + + list_for_each_entry_safe(hook, tmp, &(host_evts->packet_events), link) { + list_del(&(hook->link)); + V3_Free(hook); + } return 0; } @@ -59,6 +104,15 @@ int v3_hook_host_event(struct v3_vm_info * vm, case HOST_TIMER_EVT: list_add(&(hook->link), &(host_evts->timer_events)); break; + case HOST_SERIAL_EVT: + list_add(&(hook->link), &(host_evts->serial_events)); + break; + case HOST_CONSOLE_EVT: + list_add(&(hook->link), &(host_evts->console_events)); + break; + case HOST_PACKET_EVT: + list_add(&(hook->link), &(host_evts->packet_events)); + break; } return 0; @@ -67,9 +121,12 @@ int v3_hook_host_event(struct v3_vm_info * vm, int v3_deliver_keyboard_event(struct v3_vm_info * vm, struct v3_keyboard_event * evt) { - struct v3_host_events * host_evts = &(vm->host_event_hooks); + struct v3_host_events * host_evts = NULL; struct v3_host_event_hook * hook = NULL; + + host_evts = &(vm->host_event_hooks); + if (vm->run_state != VM_RUNNING) { return -1; } @@ -86,9 +143,12 @@ int v3_deliver_keyboard_event(struct v3_vm_info * vm, int v3_deliver_mouse_event(struct v3_vm_info * vm, struct v3_mouse_event * evt) { - struct v3_host_events * host_evts = &(vm->host_event_hooks); + struct v3_host_events * host_evts = NULL; struct v3_host_event_hook * hook = NULL; + + host_evts = &(vm->host_event_hooks); + if (vm->run_state != VM_RUNNING) { return -1; } @@ -105,9 +165,12 @@ int v3_deliver_mouse_event(struct v3_vm_info * vm, int v3_deliver_timer_event(struct v3_vm_info * vm, struct v3_timer_event * evt) { - struct v3_host_events * host_evts = &(vm->host_event_hooks); + struct v3_host_events * host_evts = NULL; struct v3_host_event_hook * hook = NULL; + + host_evts = &(vm->host_event_hooks); + if (vm->run_state != VM_RUNNING) { return -1; } @@ -120,3 +183,72 @@ int v3_deliver_timer_event(struct v3_vm_info * vm, return 0; } + +int v3_deliver_serial_event(struct v3_vm_info * vm, + struct v3_serial_event * evt) { + struct v3_host_events * host_evts = NULL; + struct v3_host_event_hook * hook = NULL; + + + host_evts = &(vm->host_event_hooks); + + if (vm->run_state != VM_RUNNING) { + return -1; + } + + list_for_each_entry(hook, &(host_evts->serial_events), link) { + if (hook->cb.serial_handler(vm, evt, hook->private_data) == -1) { + return -1; + } + } + + return 0; +} + + + +int v3_deliver_console_event(struct v3_vm_info * vm, + struct v3_console_event * evt) { + struct v3_host_events * host_evts = NULL; + struct v3_host_event_hook * hook = NULL; + + + host_evts = &(vm->host_event_hooks); + + if (vm->run_state != VM_RUNNING) { + return -1; + } + + list_for_each_entry(hook, &(host_evts->console_events), link) { + if (hook->cb.console_handler(vm, evt, hook->private_data) == -1) { + return -1; + } + } + + return 0; +} + + +int v3_deliver_packet_event(struct v3_vm_info * vm, + struct v3_packet_event * evt) { + struct v3_host_events * host_evts = NULL; + struct v3_host_event_hook * hook = NULL; + + + host_evts = &(vm->host_event_hooks); + + if (vm->run_state != VM_RUNNING) { + return -1; + } + + list_for_each_entry(hook, &(host_evts->packet_events), link) { + if (hook->cb.packet_handler(vm, evt, hook->private_data) == -1) { + return -1; + } + } + + return 0; +} + + +