#include "palacios-vnet.h"
#include "palacios-packet.h"
+#ifdef V3_CONFIG_EXT_INSPECTOR
+#include "palacios-inspector.h"
+#endif
+
+#ifdef V3_CONFIG_KEYED_STREAMS
+#include "palacios-keyed-stream.h"
+#endif
+
+
MODULE_LICENSE("GPL");
int mod_allocs = 0;
for (i = 0; i < sizeof(v3_minor_map); i++) {
if (v3_minor_map[i] != 0xff) {
for (j = 0; j < 8; j++) {
- if (!v3_minor_map[i] & (0x1 << j)) {
+ if (!(v3_minor_map[i] & (0x1 << j))) {
avail = 1;
v3_minor_map[i] |= (0x1 << j);
break;
guest->img_size = user_image.size;
printk("Allocating kernel memory for guest image (%llu bytes)\n", user_image.size);
- guest->img = kmalloc(guest->img_size, GFP_KERNEL);
+ guest->img = vmalloc(guest->img_size);
if (IS_ERR(guest->img)) {
printk("Error: Could not allocate space for guest image\n");
INIT_LIST_HEAD(&(guest->streams));
INIT_LIST_HEAD(&(guest->files));
INIT_LIST_HEAD(&(guest->sockets));
+#ifdef V3_CONFIG_HOST_DEVICE
+ INIT_LIST_HEAD(&(guest->hostdev.devs));
+#endif
init_completion(&(guest->start_done));
init_completion(&(guest->thread_done));
- kthread_run(start_palacios_vm, guest, guest->name);
+ {
+ struct task_struct * launch_thread = NULL;
+ // At some point we're going to want to allow the user to specify a CPU mask
+ // But for now, well just launch from the local core, and rely on the global cpu mask
+
+ preempt_disable();
+ launch_thread = kthread_create(start_palacios_vm, guest, guest->name);
+
+ if (IS_ERR(launch_thread)) {
+ preempt_enable();
+ printk("Palacios error creating launch thread for vm (%s)\n", guest->name);
+ return -EFAULT;
+ }
+
+ kthread_bind(launch_thread, smp_processor_id());
+ preempt_enable();
+
+ wake_up_process(launch_thread);
+ }
wait_for_completion(&(guest->start_done));
return -EFAULT;
}
- // Mem test...
- /*
- {
- void * vaddr = __va(alloc_palacios_pgs(131072, 4096));
- memset(vaddr, 0xfe492fe2, mem.num_pages * 4096);
- }
- */
-
break;
}
- case V3_START_NETWORK: {
- struct v3_network net;
- memset(&net, 0, sizeof(struct v3_network));
-
- if(copy_from_user(&net, argp, sizeof(struct v3_network))){
- printk("copy from user error getting network service requests ... \n");
- return -EFAULT;
- }
-
- #ifdef CONFIG_PALACIOS_SOCKET
- if(net.socket == 1){
- palacios_socket_init();
- printk("Started Palacios Socket\n");
- }
- #endif
- #ifdef CONFIG_PALACIOS_PACKET
- if(net.packet == 1){
- palacios_init_packet(NULL);
- printk("Started Palacios Direct Network Bridge\n");
- }
- #endif
- #ifdef CONFIG_PALACIOS_VNET
- if(net.vnet == 1){
- palacios_init_vnet();
- printk("Started Palacios VNET Service\n");
- }
- #endif
-
- break;
- }
default:
printk("\tUnhandled\n");
return -EINVAL;
palacios_vmm_init();
+#ifdef V3_CONFIG_STREAM
palacios_init_stream();
+#endif
+
+#ifdef V3_CONFIG_FILE
palacios_file_init();
+#endif
+
+#ifdef V3_CONFIG_KEYED_STREAMS
+ palacios_init_keyed_streams();
+#endif
+
+#ifdef V3_CONFIG_CONSOLE
palacios_init_console();
+#endif
+
+#ifdef V3_CONFIG_GRAPHICS_CONSOLE
+ palacios_init_graphics_console();
+#endif
+
+#ifdef V3_CONFIG_EXT_INSPECTOR
+ palacios_init_inspector();
+#endif
+
+#ifdef V3_CONFIG_SOCKET
+ palacios_socket_init();
+#endif
+
+#ifdef V3_CONFIG_PACKET
+ palacios_init_packet(NULL);
+#endif
+
+#ifdef V3_CONFIG_VNET
+ palacios_init_vnet();
+#endif
+
+#ifdef V3_CONFIG_HOST_DEVICE
+ palacios_init_host_dev();
+#endif
return 0;
class_destroy(v3_class);
+
+#ifdef V3_CONFIG_EXT_INSPECTOR
+ palacios_deinit_inspector();
+#endif
+
+#ifdef V3_CONFIG_FILE
palacios_file_deinit();
+#endif
+
+#ifdef V3_CONFIG_STREAM
palacios_deinit_stream();
+#endif
palacios_deinit_mm();