From: Jack Lange Date: Fri, 2 Apr 2010 23:39:42 +0000 (-0500) Subject: Added guest multiplexing support X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=c3cc58c287fd4a912919c4546f41026c571b13ec;hp=43347a912eba44cae132d01668d45743702f3148;p=palacios.git Added guest multiplexing support --- diff --git a/palacios/include/palacios/vmm_muxer.h b/palacios/include/palacios/vmm_muxer.h new file mode 100644 index 0000000..1c50789 --- /dev/null +++ b/palacios/include/palacios/vmm_muxer.h @@ -0,0 +1,39 @@ +/* + * This file is part of the Palacios Virtual Machine Monitor developed + * by the V3VEE Project with funding from the United States National + * Science Foundation and the Department of Energy. + * + * The V3VEE Project is a joint project between Northwestern University + * and the University of New Mexico. You can find out more at + * http://www.v3vee.org + * + * Copyright (c) 2008, Jack Lange + * Copyright (c) 2008, The V3VEE Project + * All rights reserved. + * + * Author: Jack Lange + * + * This is free software. You are permitted to use, + * redistribute, and modify it as specified in the file "V3VEE_LICENSE". + */ + +#ifndef __VMM_MUXER_H__ +#define __VMM_MUXER_H__ + +#ifdef __V3VEE__ + + +struct v3_vm_info; + + + +struct v3_vm_info * v3_get_foreground_vm(); +void v3_set_foreground_vm(struct v3_vm_info * vm); + + +int v3_add_mux_notification(int (*focus_change)(struct v3_vm_info * old_vm, struct v3_vm_info * new_vm)); + + +#endif + +#endif diff --git a/palacios/src/palacios/Makefile b/palacios/src/palacios/Makefile index be34589..2964a88 100644 --- a/palacios/src/palacios/Makefile +++ b/palacios/src/palacios/Makefile @@ -31,7 +31,8 @@ obj-y := \ vmm_xed.o \ vmm_binaries.o \ vmm_cpuid.o \ - vmm_xml.o + vmm_xml.o \ + vmm_muxer.o obj-$(CONFIG_SVM) += svm.o \ svm_io.o \ diff --git a/palacios/src/palacios/vm_guest.c b/palacios/src/palacios/vm_guest.c index 17b1be8..ff5a35f 100644 --- a/palacios/src/palacios/vm_guest.c +++ b/palacios/src/palacios/vm_guest.c @@ -28,7 +28,7 @@ #include #include #include - +#include v3_cpu_mode_t v3_get_vm_cpu_mode(struct guest_info * info) { @@ -404,6 +404,11 @@ static int info_hcall(struct guest_info * core, uint_t hcall_id, void * priv_dat int v3_init_vm(struct v3_vm_info * vm) { v3_cpu_arch_t cpu_type = v3_get_cpu_type(v3_get_cpu_id()); + + if (v3_get_foreground_vm() == NULL) { + v3_set_foreground_vm(vm); + } + #ifdef CONFIG_TELEMETRY v3_init_telemetry(vm); #endif diff --git a/palacios/src/palacios/vmm_host_events.c b/palacios/src/palacios/vmm_host_events.c index 5e6baf2..f872149 100644 --- a/palacios/src/palacios/vmm_host_events.c +++ b/palacios/src/palacios/vmm_host_events.c @@ -20,6 +20,7 @@ #include #include #include +#include int v3_init_host_events(struct v3_vm_info * vm) { struct v3_host_events * host_evts = &(vm->host_event_hooks); @@ -67,9 +68,15 @@ 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; + if (vm == NULL) { + vm = v3_get_foreground_vm(); + } + + host_evts = &(vm->host_event_hooks); + if (vm->run_state != VM_RUNNING) { return -1; } @@ -86,9 +93,15 @@ 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; + if (vm == NULL) { + vm = v3_get_foreground_vm(); + } + + host_evts = &(vm->host_event_hooks); + if (vm->run_state != VM_RUNNING) { return -1; } @@ -105,9 +118,15 @@ 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; + if (vm == NULL) { + vm = v3_get_foreground_vm(); + } + + host_evts = &(vm->host_event_hooks); + if (vm->run_state != VM_RUNNING) { return -1; } diff --git a/palacios/src/palacios/vmm_muxer.c b/palacios/src/palacios/vmm_muxer.c new file mode 100644 index 0000000..01e8169 --- /dev/null +++ b/palacios/src/palacios/vmm_muxer.c @@ -0,0 +1,65 @@ +/* + * This file is part of the Palacios Virtual Machine Monitor developed + * by the V3VEE Project with funding from the United States National + * Science Foundation and the Department of Energy. + * + * The V3VEE Project is a joint project between Northwestern University + * and the University of New Mexico. You can find out more at + * http://www.v3vee.org + * + * Copyright (c) 2008, Jack Lange + * Copyright (c) 2008, The V3VEE Project + * All rights reserved. + * + * Author: Jack Lange + * + * This is free software. You are permitted to use, + * redistribute, and modify it as specified in the file "V3VEE_LICENSE". + */ + +#include +#include +#include + + + +static struct v3_vm_info * foreground_vm = NULL; + +// list of notification callbacks +static LIST_HEAD(cb_list); + + +struct mux_callback { + struct list_head cb_node; + + int (*focus_change)(struct v3_vm_info * old_vm, struct v3_vm_info * new_vm); +}; + + +struct v3_vm_info * v3_get_foreground_vm() { + return foreground_vm; +} + + +void v3_set_foreground_vm(struct v3_vm_info * vm) { + struct mux_callback * tmp_cb; + + list_for_each_entry(tmp_cb, &(cb_list), cb_node) { + tmp_cb->focus_change(foreground_vm, vm); + } + + foreground_vm = vm; +} + + +int v3_add_mux_notification(int (*focus_change)(struct v3_vm_info * old_vm, + struct v3_vm_info * new_vm)) { + + struct mux_callback * cb = (struct mux_callback *)V3_Malloc(sizeof(struct mux_callback)); + + cb->focus_change = focus_change; + + list_add(&(cb->cb_node), &cb_list); + + return 0; +}