#include "palacios-stream.h"
#include "palacios-file.h"
#include "palacios-serial.h"
+#include "palacios-socket.h"
+#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;
+int mod_frees = 0;
+
static int v3_major_num = 0;
switch (ioctl) {
case V3_START_GUEST:{
+ int vm_minor = 0;
struct v3_guest_img user_image;
struct v3_guest * guest = kmalloc(sizeof(struct v3_guest), GFP_KERNEL);
- int vm_minor = 0;
if (IS_ERR(guest)) {
printk("Error allocating Kernel 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;
+ }
- wait_for_completion(&(guest->thread_done));
+ kthread_bind(launch_thread, smp_processor_id());
+ preempt_enable();
+
+ wake_up_process(launch_thread);
+ }
+
+ wait_for_completion(&(guest->start_done));
return guest->vm_dev;
break;
return -EFAULT;
}
- // Mem test...
- /*
- {
- void * vaddr = __va(alloc_palacios_pgs(131072, 4096));
- memset(vaddr, 0xfe492fe2, mem.num_pages * 4096);
- }
- */
-
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;
return ret;
}
+
static void __exit v3_exit(void) {
extern u32 pg_allocs;
extern u32 pg_frees;
extern u32 mallocs;
extern u32 frees;
+
+ // should probably try to stop any guests
+
+
+
+ dev_t dev = MKDEV(v3_major_num, MAX_VMS + 1);
+
printk("Removing V3 Control device\n");
- palacios_vmm_exit();
+ palacios_vmm_exit();
printk("Palacios Mallocs = %d, Frees = %d\n", mallocs, frees);
printk("Palacios Page Allocs = %d, Page Frees = %d\n", pg_allocs, pg_frees);
-
unregister_chrdev_region(MKDEV(v3_major_num, 0), MAX_VMS + 1);
+
+ cdev_del(&ctrl_dev);
+
+ device_destroy(v3_class, dev);
+ 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();
+
+ printk("Palacios Module Mallocs = %d, Frees = %d\n", mod_allocs, mod_frees);
}
module_init(v3_init);
module_exit(v3_exit);
+
+
+
+void * trace_malloc(size_t size, gfp_t flags) {
+ void * addr = NULL;
+
+ mod_allocs++;
+ addr = kmalloc(size, flags);
+
+ return addr;
+}
+
+
+void trace_free(const void * objp) {
+ mod_frees++;
+ kfree(objp);
+}