X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_host_events.c;h=791898c26c58d03dc20a27faa50d0374509c2a87;hp=b9d122a84b3bbb9e4ae424c14d52c75d9c81a579;hb=123a1ba27ea09c8fa77a1b36ce625b43d7c48b14;hpb=82cceefa66b1f05d8f9d5bfcb2fb7214755e1904 diff --git a/palacios/src/palacios/vmm_host_events.c b/palacios/src/palacios/vmm_host_events.c index b9d122a..791898c 100644 --- a/palacios/src/palacios/vmm_host_events.c +++ b/palacios/src/palacios/vmm_host_events.c @@ -19,16 +19,16 @@ #include #include - +#include int v3_init_host_events(struct guest_info * info) { - struct v3_host_events * host_evts = &(info->host_event_hooks); + struct v3_host_events * host_evts = &(info->host_event_hooks); - 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->keyboard_events)); + INIT_LIST_HEAD(&(host_evts->mouse_events)); + INIT_LIST_HEAD(&(host_evts->timer_events)); - return 0; + return 0; } @@ -37,74 +37,86 @@ int v3_hook_host_event(struct guest_info * info, union v3_host_event_handler cb, void * private_data) { - struct v3_host_events * host_evts = &(info->host_event_hooks); - struct v3_host_event_hook * hook = NULL; - - hook = (struct v3_host_event_hook *)V3_Malloc(sizeof(struct v3_host_event_hook)); - if (hook == NULL) { - PrintError("Could not allocate event hook\n"); - return -1; - } - - hook->cb = cb; - hook->private_data = private_data; - - switch (event_type) { - case HOST_KEYBOARD_EVT: - list_add(&(hook->link), &(host_evts->keyboard_events)); - break; - case HOST_MOUSE_EVT: - list_add(&(hook->link), &(host_evts->mouse_events)); - break; - case HOST_TIMER_EVT: - list_add(&(hook->link), &(host_evts->timer_events)); - break; - } - - return 0; + struct v3_host_events * host_evts = &(info->host_event_hooks); + struct v3_host_event_hook * hook = NULL; + + hook = (struct v3_host_event_hook *)V3_Malloc(sizeof(struct v3_host_event_hook)); + if (hook == NULL) { + PrintError("Could not allocate event hook\n"); + return -1; + } + + hook->cb = cb; + hook->private_data = private_data; + + switch (event_type) { + case HOST_KEYBOARD_EVT: + list_add(&(hook->link), &(host_evts->keyboard_events)); + break; + case HOST_MOUSE_EVT: + list_add(&(hook->link), &(host_evts->mouse_events)); + break; + case HOST_TIMER_EVT: + list_add(&(hook->link), &(host_evts->timer_events)); + break; + } + + return 0; } int v3_deliver_keyboard_event(struct guest_info * info, struct v3_keyboard_event * evt) { - struct v3_host_events * host_evts = &(info->host_event_hooks); - struct v3_host_event_hook * hook = NULL; + struct v3_host_events * host_evts = &(info->host_event_hooks); + struct v3_host_event_hook * hook = NULL; - list_for_each_entry(hook, &(host_evts->keyboard_events), link) { - if (hook->cb.keyboard_handler(info, evt, hook->private_data) == -1) { - return -1; + if (info->run_state != VM_RUNNING) { + return -1; } - } - return 0; + list_for_each_entry(hook, &(host_evts->keyboard_events), link) { + if (hook->cb.keyboard_handler(info, evt, hook->private_data) == -1) { + return -1; + } + } + + return 0; } int v3_deliver_mouse_event(struct guest_info * info, struct v3_mouse_event * evt) { - struct v3_host_events * host_evts = &(info->host_event_hooks); - struct v3_host_event_hook * hook = NULL; + struct v3_host_events * host_evts = &(info->host_event_hooks); + struct v3_host_event_hook * hook = NULL; + + if (info->run_state != VM_RUNNING) { + return -1; + } - list_for_each_entry(hook, &(host_evts->mouse_events), link) { - if (hook->cb.mouse_handler(info, evt, hook->private_data) == -1) { - return -1; + list_for_each_entry(hook, &(host_evts->mouse_events), link) { + if (hook->cb.mouse_handler(info, evt, hook->private_data) == -1) { + return -1; + } } - } - return 0; + return 0; } int v3_deliver_timer_event(struct guest_info * info, struct v3_timer_event * evt) { - struct v3_host_events * host_evts = &(info->host_event_hooks); - struct v3_host_event_hook * hook = NULL; + struct v3_host_events * host_evts = &(info->host_event_hooks); + struct v3_host_event_hook * hook = NULL; + + if (info->run_state != VM_RUNNING) { + return -1; + } - list_for_each_entry(hook, &(host_evts->timer_events), link) { - if (hook->cb.timer_handler(info, evt, hook->private_data) == -1) { - return -1; + list_for_each_entry(hook, &(host_evts->timer_events), link) { + if (hook->cb.timer_handler(info, evt, hook->private_data) == -1) { + return -1; + } } - } - return 0; + return 0; }