X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fvm.c;h=06a016aba3ecf4b6d3da72d389e01eb812006a07;hb=9aee4d463c4401f25142ba43ddbb720e4e129340;hp=e2b621a677c31de398efc2f39074c4871dacabe3;hpb=468723ed5588347d32cca67553528a450a50ab36;p=palacios.git diff --git a/linux_module/vm.c b/linux_module/vm.c index e2b621a..06a016a 100644 --- a/linux_module/vm.c +++ b/linux_module/vm.c @@ -19,6 +19,7 @@ #include #include +#include #include "palacios.h" #include "vm.h" @@ -72,7 +73,7 @@ int add_guest_ctrl(struct v3_guest * guest, unsigned int cmd, struct vm_ctrl * ctrl = kmalloc(sizeof(struct vm_ctrl), GFP_KERNEL); if (ctrl == NULL) { - printk("Error: Could not allocate vm ctrl %d\n", cmd); + WARNING("Error: Could not allocate vm ctrl %d\n", cmd); return -1; } @@ -81,7 +82,7 @@ int add_guest_ctrl(struct v3_guest * guest, unsigned int cmd, ctrl->priv_data = priv_data; if (__insert_ctrl(guest, ctrl) != NULL) { - printk("Could not insert guest ctrl %d\n", cmd); + WARNING("Could not insert guest ctrl %d\n", cmd); kfree(ctrl); return -1; } @@ -125,24 +126,24 @@ static long v3_vm_ioctl(struct file * filp, struct v3_guest * guest = filp->private_data; - printk("V3 IOCTL %d\n", ioctl); + INFO("V3 IOCTL %d\n", ioctl); switch (ioctl) { case V3_VM_LAUNCH: { - printk("palacios: launching vm\n"); + NOTICE("palacios: launching vm\n"); if (v3_start_vm(guest->v3_ctx, (0x1 << num_online_cpus()) - 1) < 0) { - printk("palacios: launch of vm failed\n"); + WARNING("palacios: launch of vm failed\n"); return -1; } break; } case V3_VM_STOP: { - printk("Stopping VM (%s) (%p)\n", guest->name, guest); + NOTICE("Stopping VM (%s) (%p)\n", guest->name, guest); if (irqs_disabled()) { - printk("WHAT!!?? IRQs are disabled??\n"); + ERROR("WHAT!!?? IRQs are disabled??\n"); break; } @@ -150,17 +151,17 @@ static long v3_vm_ioctl(struct file * filp, break; } case V3_VM_PAUSE: { - printk("Pausing VM (%s)\n", guest->name); + NOTICE("Pausing VM (%s)\n", guest->name); v3_pause_vm(guest->v3_ctx); break; } case V3_VM_CONTINUE: { - printk("Continuing VM (%s)\n", guest->name); + NOTICE("Continuing VM (%s)\n", guest->name); v3_continue_vm(guest->v3_ctx); break; } case V3_VM_SIMULATE: { - printk("Simulating VM (%s) for %lu msecs\n", guest->name, arg); + NOTICE("Simulating VM (%s) for %lu msecs\n", guest->name, arg); v3_simulate_vm(guest->v3_ctx, arg); break; } @@ -174,14 +175,14 @@ static long v3_vm_ioctl(struct file * filp, 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"); + WARNING("Copy from user error getting checkpoint info\n"); return -EFAULT; } - printk("Saving Guest to %s:%s\n", chkpt.store, chkpt.url); + NOTICE("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"); + WARNING("Error checkpointing VM state\n"); return -EFAULT; } @@ -194,20 +195,44 @@ static long v3_vm_ioctl(struct file * filp, 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"); + WARNING("Copy from user error getting checkpoint info\n"); return -EFAULT; } - printk("Loading Guest to %s:%s\n", chkpt.store, chkpt.url); + NOTICE("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"); + WARNING("Error Loading VM state\n"); return -EFAULT; } break; } #endif + case V3_VM_DEBUG: { + struct v3_debug_cmd cmd; + struct v3_debug_event evt; + void __user * argp = (void __user *)arg; + + memset(&cmd, 0, sizeof(struct v3_debug_cmd)); + + if (copy_from_user(&cmd, argp, sizeof(struct v3_debug_cmd))) { + ERROR("Error: Could not copy debug command from user space\n"); + return -EFAULT; + } + + evt.core_id = cmd.core; + evt.cmd = cmd.cmd; + + INFO("Debugging VM\n"); + + if (v3_deliver_debug_event(guest->v3_ctx, &evt) == -1) { + ERROR("Error could not deliver debug cmd\n"); + return -EFAULT; + } + + break; + } case V3_VM_MOVE_CORE: { struct v3_core_move_cmd cmd; void __user * argp = (void __user *)arg; @@ -215,11 +240,11 @@ static long v3_vm_ioctl(struct file * filp, memset(&cmd, 0, sizeof(struct v3_core_move_cmd)); if (copy_from_user(&cmd, argp, sizeof(struct v3_core_move_cmd))) { - printk("copy from user error getting migrate command...\n"); + WARNING("copy from user error getting migrate command...\n"); return -EFAULT; } - printk("moving guest %s vcore %d to CPU %d\n", guest->name, cmd.vcore_id, cmd.pcore_id); + INFO("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); @@ -233,7 +258,7 @@ static long v3_vm_ioctl(struct file * filp, } - printk("\tUnhandled ctrl cmd: %d\n", ioctl); + WARNING("\tUnhandled ctrl cmd: %d\n", ioctl); return -EINVAL; } } @@ -283,12 +308,12 @@ int create_palacios_vm(struct v3_guest * 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"); + WARNING("palacios: failed to create vm\n"); return -1; } - printk("Creating VM device: Major %d, Minor %d\n", MAJOR(guest->vm_dev), MINOR(guest->vm_dev)); + NOTICE("Creating VM device: Major %d, Minor %d\n", MAJOR(guest->vm_dev), MINOR(guest->vm_dev)); cdev_init(&(guest->cdev), &v3_vm_fops); @@ -296,23 +321,23 @@ int create_palacios_vm(struct v3_guest * guest) { guest->cdev.ops = &v3_vm_fops; - printk("Adding VM device\n"); + INFO("Adding VM device\n"); err = cdev_add(&(guest->cdev), guest->vm_dev, 1); if (err) { - printk("Fails to add cdev\n"); + WARNING("Fails to add cdev\n"); v3_free_vm(guest->v3_ctx); return -1; } if (device_create(v3_class, NULL, guest->vm_dev, guest, "v3-vm%d", MINOR(guest->vm_dev)) == NULL){ - printk("Fails to create device\n"); + WARNING("Fails to create device\n"); cdev_del(&(guest->cdev)); v3_free_vm(guest->v3_ctx); return -1; } - printk("palacios: vm created at /dev/v3-vm%d\n", MINOR(guest->vm_dev)); + NOTICE("palacios: vm created at /dev/v3-vm%d\n", MINOR(guest->vm_dev)); return 0; }