X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fvm.c;h=a1af56498537a3de5543c665b3bf5d0837502537;hb=f82ccce5ce7629dce6f1a6feee8b47fa13a6756d;hp=1e3758740c950e7dd747ef8e8e0c403f51d2a02a;hpb=401f28c04132e4f5ccafc145dcb69b6dee4afe4e;p=palacios.git diff --git a/linux_module/vm.c b/linux_module/vm.c index 1e37587..a1af564 100644 --- a/linux_module/vm.c +++ b/linux_module/vm.c @@ -127,6 +127,27 @@ static long v3_vm_ioctl(struct file * filp, printk("V3 IOCTL %d\n", ioctl); switch (ioctl) { + case V3_VM_LAUNCH: { + printk("palacios: launching vm\n"); + + if (v3_start_vm(guest->v3_ctx, (0x1 << num_online_cpus()) - 1) < 0) { + printk("palacios: launch of vm failed\n"); + return -1; + } + + break; + } + case V3_VM_STOP: { + printk("Stopping VM (%s) (%p)\n", guest->name, guest); + + if (irqs_disabled()) { + printk("WHAT!!?? IRQs are disabled??\n"); + break; + } + + v3_stop_vm(guest->v3_ctx); + break; + } case V3_VM_PAUSE: { printk("Pausing VM (%s)\n", guest->name); v3_pause_vm(guest->v3_ctx); @@ -137,6 +158,48 @@ static long v3_vm_ioctl(struct file * filp, v3_continue_vm(guest->v3_ctx); break; } +#ifdef V3_CONFIG_CHECKPOINT + case V3_VM_SAVE: { + struct v3_chkpt_info chkpt; + void __user * argp = (void __user *)arg; + + memset(&chkpt, 0, sizeof(struct v3_chkpt_info)); + + if (copy_from_user(&chkpt, argp, sizeof(struct v3_chkpt_info))) { + printk("Copy from user error getting checkpoint info\n"); + return -EFAULT; + } + + printk("Saving Guest to %s:%s\n", chkpt.store, chkpt.url); + + if (v3_save_vm(guest->v3_ctx, chkpt.store, chkpt.url) == -1) { + printk("Error checkpointing VM state\n"); + return -EFAULT; + } + + break; + } + case V3_VM_LOAD: { + struct v3_chkpt_info chkpt; + void __user * argp = (void __user *)arg; + + memset(&chkpt, 0, sizeof(struct v3_chkpt_info)); + + if (copy_from_user(&chkpt, argp, sizeof(struct v3_chkpt_info))) { + printk("Copy from user error getting checkpoint info\n"); + return -EFAULT; + } + + printk("Loading Guest to %s:%s\n", chkpt.store, chkpt.url); + + if (v3_load_vm(guest->v3_ctx, chkpt.store, chkpt.url) == -1) { + printk("Error Loading VM state\n"); + return -EFAULT; + } + + break; + } +#endif case V3_VM_MOVE_CORE: { struct v3_core_move_cmd cmd; void __user * argp = (void __user *)arg; @@ -151,9 +214,9 @@ static long v3_vm_ioctl(struct file * filp, printk("moving guest %s vcore %d to CPU %d\n", guest->name, cmd.vcore_id, cmd.pcore_id); v3_move_vm_core(guest->v3_ctx, cmd.vcore_id, cmd.pcore_id); - } - break; + break; + } default: { struct vm_ctrl * ctrl = get_ctrl(guest, ioctl); @@ -204,22 +267,15 @@ extern u32 pg_frees; extern u32 mallocs; extern u32 frees; -int start_palacios_vm(void * arg) { - struct v3_guest * guest = (struct v3_guest *)arg; +int create_palacios_vm(struct v3_guest * guest) { int err; - - daemonize(guest->name); - // allow_signal(SIGKILL); - - init_vm_extensions(guest); guest->v3_ctx = v3_create_vm(guest->img, (void *)guest, guest->name); if (guest->v3_ctx == NULL) { printk("palacios: failed to create vm\n"); - complete(&(guest->start_done)); return -1; } @@ -238,7 +294,6 @@ int start_palacios_vm(void * arg) { if (err) { printk("Fails to add cdev\n"); v3_free_vm(guest->v3_ctx); - complete(&(guest->start_done)); return -1; } @@ -246,25 +301,10 @@ int start_palacios_vm(void * arg) { printk("Fails to create device\n"); cdev_del(&(guest->cdev)); v3_free_vm(guest->v3_ctx); - complete(&(guest->start_done)); - return -1; - } - - complete(&(guest->start_done)); - - printk("palacios: launching vm\n"); - - if (v3_start_vm(guest->v3_ctx, 0xffffffff) < 0) { - printk("palacios: launch of vm failed\n"); - device_destroy(v3_class, guest->vm_dev); - cdev_del(&(guest->cdev)); - v3_free_vm(guest->v3_ctx); return -1; } - - complete(&(guest->thread_done)); - printk("palacios: vm completed. returning.\n"); + printk("palacios: vm created at /dev/v3-vm%d\n", MINOR(guest->vm_dev)); return 0; } @@ -272,12 +312,8 @@ int start_palacios_vm(void * arg) { -int stop_palacios_vm(struct v3_guest * guest) { - - - v3_stop_vm(guest->v3_ctx); - wait_for_completion(&(guest->thread_done)); +int free_palacios_vm(struct v3_guest * guest) { v3_free_vm(guest->v3_ctx);