vmm: Moves gpci into guest_thread
[akaros.git] / user / vmm / vthread.c
index fff963e..98982b8 100644 (file)
@@ -29,6 +29,7 @@ static int vmsetup(struct virtual_machine *vm, int flags)
        struct vm_trapframe *vm_tf;
        int i, ret;
        uint8_t *p;
+       struct vmm_gpcore_init *gpcis;
 
        if (vm->vminit)
                return -EBUSY;
@@ -36,7 +37,7 @@ static int vmsetup(struct virtual_machine *vm, int flags)
        if (vm->nr_gpcs == 0)
                vm->nr_gpcs = 1;
 
-       vm->gpcis = calloc(vm->nr_gpcs, sizeof(*vm->gpcis));
+       gpcis = calloc(vm->nr_gpcs, sizeof(struct vmm_gpcore_init));
 
        /* technically, we don't need these pages for the
         * all guests. Currently, the kernel requires them. */
@@ -46,21 +47,22 @@ static int vmsetup(struct virtual_machine *vm, int flags)
                        werrstr("Can't allocate 3 pages for guest %d: %r", i);
                        return -1;
                }
-               vm->gpcis[i].posted_irq_desc = &p[0];
-               vm->gpcis[i].vapic_addr = &p[4096];
-               vm->gpcis[i].apic_addr = &p[8192];
+               gpcis[i].posted_irq_desc = &p[0];
+               gpcis[i].vapic_addr = &p[4096];
+               gpcis[i].apic_addr = &p[8192];
                /* TODO: once we are making these GPCs at the same time as vthreads, we
                 * should set fsbase == the TLS desc of the vthread (if any). */
-               vm->gpcis[i].fsbase = 0;
-               vm->gpcis[i].gsbase = 0;
+               gpcis[i].fsbase = 0;
+               gpcis[i].gsbase = 0;
        }
 
        /* Set up default page mappings. */
        setup_paging(vm);
 
-       ret = vmm_init(vm, flags);
+       ret = vmm_init(vm, gpcis, flags);
        if (ret)
                return ret;
+       free(gpcis);
 
        for (i = 0; i < vm->nr_gpcs; i++) {
                vm->gths[i]->halt_exit = vm->halt_exit;