unsigned int period_us;
};
-struct v3_console_event {
+struct v3_serial_event {
unsigned char data[128];
unsigned int len;
};
+struct v3_console_event {
+ unsigned int cmd;
+};
+
#ifdef __V3VEE__
#include <palacios/vmm_list.h>
struct v3_vm_info;
-typedef enum {HOST_KEYBOARD_EVT,
- HOST_MOUSE_EVT,
- HOST_TIMER_EVT,
- HOST_CONSOLE_EVT} v3_host_evt_type_t;
+typedef enum { HOST_KEYBOARD_EVT,
+ HOST_MOUSE_EVT,
+ HOST_TIMER_EVT,
+ HOST_CONSOLE_EVT,
+ HOST_SERIAL_EVT } v3_host_evt_type_t;
union v3_host_event_handler {
int (*keyboard_handler)(struct v3_vm_info * vm, struct v3_keyboard_event * evt, void * priv_data);
int (*mouse_handler)(struct v3_vm_info * vm, struct v3_mouse_event * evt, void * priv_data);
int (*timer_handler)(struct v3_vm_info * vm, struct v3_timer_event * evt, void * priv_data);
+ int (*serial_handler)(struct v3_vm_info * vm, struct v3_serial_event * evt, void * priv_data);
int (*console_handler)(struct v3_vm_info * vm, struct v3_console_event * evt, void * priv_data);
};
struct list_head keyboard_events;
struct list_head mouse_events;
struct list_head timer_events;
+ struct list_head serial_events;
struct list_head console_events;
};
int v3_deliver_keyboard_event(struct v3_vm_info * vm, struct v3_keyboard_event * evt);
int v3_deliver_mouse_event(struct v3_vm_info * vm, struct v3_mouse_event * evt);
int v3_deliver_timer_event(struct v3_vm_info * vm, struct v3_timer_event * evt);
+int v3_deliver_serial_event(struct v3_vm_info * vm, struct v3_serial_event * evt);
int v3_deliver_console_event(struct v3_vm_info * vm, struct v3_console_event * evt);
};
-static int console_event_handler(struct v3_vm_info * vm,
- struct v3_console_event * evt,
+static int serial_event_handler(struct v3_vm_info * vm,
+ struct v3_serial_event * evt,
void * private_data) {
struct stream_state *state = (struct stream_state *)private_data;
}
- v3_hook_host_event(vm, HOST_CONSOLE_EVT, V3_HOST_EVENT_HANDLER(console_event_handler), state);
+ v3_hook_host_event(vm, HOST_SERIAL_EVT, V3_HOST_EVENT_HANDLER(serial_event_handler), state);
return 0;
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));
return 0;
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;
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;
+
+ if (vm == NULL) {
+ vm = v3_get_foreground_vm();
+ }
+
+ 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_console_event * evt) {
struct v3_host_events * host_evts = NULL;
struct v3_host_event_hook * hook = NULL;