X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fmain.c;h=a6787ce28d359fd12fc6c77fb2039a31fd0e729b;hb=5d1bbcc86de011e3f0d115b6f10fd8645cdf855e;hp=621ab5806442575193a07aedfef41817ffeb6a20;hpb=276cfa264720edddc1677e35c6a300596965de7d;p=palacios.git diff --git a/linux_module/main.c b/linux_module/main.c index 621ab58..a6787ce 100644 --- a/linux_module/main.c +++ b/linux_module/main.c @@ -34,37 +34,22 @@ int mod_frees = 0; static int v3_major_num = 0; -static u8 v3_minor_map[MAX_VMS / 8] = {[0 ... (MAX_VMS / 8) - 1] = 0}; - +static struct v3_guest * guest_map[MAX_VMS] = {[0 ... MAX_VMS - 1] = 0}; struct class * v3_class = NULL; static struct cdev ctrl_dev; -static int register_vm( void ) { - int i, j = 0; - int avail = 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))) { - avail = 1; - v3_minor_map[i] |= (0x1 << j); - break; - } - } - - if (avail == 1) { - break; - } +static int register_vm(struct v3_guest * guest) { + int i = 0; + + for (i = 0; i < MAX_VMS; i++) { + if (guest_map[i] == NULL) { + guest_map[i] = guest; + return i; } } - if (avail == 0) { - return -1; - } - - return (i * 8) + j; + return -1; } @@ -88,9 +73,9 @@ static long v3_dev_ioctl(struct file * filp, memset(guest, 0, sizeof(struct v3_guest)); - printk("Starting V3 Guest...\n"); + printk("Starting V3 Guest... (%p)\n", guest); - vm_minor = register_vm(); + vm_minor = register_vm(guest); if (vm_minor == -1) { printk("Too many VMs are currently running\n"); @@ -153,6 +138,23 @@ static long v3_dev_ioctl(struct file * filp, return guest->vm_dev; break; } + case V3_STOP_GUEST: { + unsigned long vm_idx = arg; + struct v3_guest * guest = guest_map[vm_idx]; + + printk("Stopping VM idx=%d\n", vm_idx); + printk("Stopping VM (%s) (%p)\n", guest->name, guest); + + + if (irqs_disabled()) { + printk("WHAT!!?? IRQs are disabled??\n"); + break; + } + + stop_palacios_vm(guest); + guest_map[vm_idx] = NULL; + break; + } case V3_ADD_MEMORY: { struct v3_mem_region mem;