#include <palacios/vmm.h>
#include <palacios/vmm_host_events.h>
+#include <palacios/vm_guest.h>
-
-int v3_init_host_events(struct guest_info * info) {
- struct v3_host_events * host_evts = &(info->host_event_hooks);
+int v3_init_host_events(struct v3_vm_info * vm) {
+ struct v3_host_events * host_evts = &(vm->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->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;
}
-int v3_hook_host_event(struct guest_info * info,
+int v3_hook_host_event(struct v3_vm_info * vm,
v3_host_evt_type_t event_type,
union v3_host_event_handler cb,
void * private_data) {
- struct v3_host_events * host_evts = &(info->host_event_hooks);
+ struct v3_host_events * host_evts = &(vm->host_event_hooks);
struct v3_host_event_hook * hook = NULL;
hook = (struct v3_host_event_hook *)V3_Malloc(sizeof(struct v3_host_event_hook));
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;
}
-int v3_deliver_keyboard_event(struct guest_info * info,
+int v3_deliver_keyboard_event(struct v3_vm_info * vm,
struct v3_keyboard_event * evt) {
- struct v3_host_events * host_evts = &(info->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;
+ }
+
list_for_each_entry(hook, &(host_evts->keyboard_events), link) {
- if (hook->cb.keyboard_handler(info, evt, hook->private_data) == -1) {
+ if (hook->cb.keyboard_handler(vm, evt, hook->private_data) == -1) {
return -1;
}
}
}
-int v3_deliver_mouse_event(struct guest_info * info,
+int v3_deliver_mouse_event(struct v3_vm_info * vm,
struct v3_mouse_event * evt) {
- struct v3_host_events * host_evts = &(info->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;
+ }
+
list_for_each_entry(hook, &(host_evts->mouse_events), link) {
- if (hook->cb.mouse_handler(info, evt, hook->private_data) == -1) {
+ if (hook->cb.mouse_handler(vm, evt, hook->private_data) == -1) {
return -1;
}
}
}
-int v3_deliver_timer_event(struct guest_info * info,
+int v3_deliver_timer_event(struct v3_vm_info * vm,
struct v3_timer_event * evt) {
- struct v3_host_events * host_evts = &(info->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;
+ }
+
list_for_each_entry(hook, &(host_evts->timer_events), link) {
- if (hook->cb.timer_handler(info, evt, hook->private_data) == -1) {
+ if (hook->cb.timer_handler(vm, evt, hook->private_data) == -1) {
+ return -1;
+ }
+ }
+
+ 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;
}
+
+
+