Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Remove non-multithreaded OS option. Change VM creation to be fully asynchronous....
[palacios.git] / palacios / src / palacios / vmm.c
index 4b9083b..ca12fc7 100644 (file)
@@ -129,7 +129,7 @@ void Init_V3(struct v3_os_hooks * hooks, int num_cpus) {
 
 
 
-#ifdef V3_CONFIG_MULTITHREAD_OS
+
     if ((hooks) && (hooks->call_on_cpu)) {
 
        for (i = 0; i < num_cpus; i++) {
@@ -138,9 +138,7 @@ void Init_V3(struct v3_os_hooks * hooks, int num_cpus) {
            hooks->call_on_cpu(i, &init_cpu, (void *)(addr_t)i);
        }
     }
-#else 
-    init_cpu(0);
-#endif
+
 
 }
 
@@ -162,7 +160,6 @@ void Shutdown_V3() {
 #endif
 
 
-#ifdef V3_CONFIG_MULTITHREAD_OS
     if ((os_hooks) && (os_hooks->call_on_cpu)) {
        for (i = 0; i < V3_CONFIG_MAX_CPUS; i++) {
            if (v3_cpu_types[i] != V3_INVALID_CPU) {
@@ -171,9 +168,6 @@ void Shutdown_V3() {
            }
        }
     }
-#else 
-    deinit_cpu(0);
-#endif
 
 }
 
@@ -240,11 +234,7 @@ static int start_core(void * p)
 
 
 // For the moment very ugly. Eventually we will shift the cpu_mask to an arbitrary sized type...
-#ifdef V3_CONFIG_MULTITHREAD_OS
 #define MAX_CORES 32
-#else
-#define MAX_CORES 1
-#endif
 
 
 int v3_start_vm(struct v3_vm_info * vm, unsigned int cpu_mask) {
@@ -276,9 +266,9 @@ int v3_start_vm(struct v3_vm_info * vm, unsigned int cpu_mask) {
        return -1;
     }
 
-#ifdef V3_CONFIG_MULTITHREAD_OS
-    // spawn off new threads, for other cores
-    for (i = 0, vcore_id = 1; (i < MAX_CORES) && (vcore_id < vm->num_cores); i++) {
+    // Spawn off threads for each core. 
+    // We work backwards, so that core 0 is always started last.
+    for (i = 0, vcore_id = vm->num_cores - 1; (i < MAX_CORES) && (vcore_id >= 0); i++) {
        int major = 0;
        int minor = 0;
        struct guest_info * core = &(vm->cores[vcore_id]);
@@ -294,19 +284,12 @@ int v3_start_vm(struct v3_vm_info * vm, unsigned int cpu_mask) {
 
            i--; // We reset the logical core idx. Not strictly necessary I guess... 
        } else {
-
-           if (i == V3_Get_CPU()) {
-               // We skip the local CPU because it is reserved for vcore 0
-               continue;
-           }
-           
            core_idx = i;
        }
 
        major = core_idx / 8;
        minor = core_idx % 8;
 
-
        if ((core_mask[major] & (0x1 << minor)) == 0) {
            PrintError("Logical CPU %d not available for virtual core %d; not started\n",
                       core_idx, vcore_id);
@@ -328,7 +311,6 @@ int v3_start_vm(struct v3_vm_info * vm, unsigned int cpu_mask) {
        PrintDebug("run: core=%u, func=0x%p, arg=0x%p, name=%s\n",
                   core_idx, start_core, core, core->exec_name);
 
-       // TODO: actually manage these threads instead of just launching them
        core->pcpu_id = core_idx;
        core->core_thread = V3_CREATE_THREAD_ON_CPU(core_idx, start_core, core, core->exec_name);
 
@@ -338,18 +320,7 @@ int v3_start_vm(struct v3_vm_info * vm, unsigned int cpu_mask) {
            return -1;
        }
 
-       vcore_id++;
-    }
-#endif
-
-    sprintf(vm->cores[0].exec_name, "%s", vm->name);
-
-    vm->cores[0].pcpu_id = V3_Get_CPU();
-
-    if (start_core(&(vm->cores[0])) != 0) {
-       PrintError("Error starting VM core 0\n");
-       v3_stop_vm(vm);
-       return -1;
+       vcore_id--;
     }
 
 
@@ -623,7 +594,6 @@ void v3_print_cond(const char * fmt, ...) {
 }
 
 
-#ifdef V3_CONFIG_MULTITHREAD_OS
 
 void v3_interrupt_cpu(struct v3_vm_info * vm, int logical_cpu, int vector) {
     extern struct v3_os_hooks * os_hooks;
@@ -632,7 +602,6 @@ void v3_interrupt_cpu(struct v3_vm_info * vm, int logical_cpu, int vector) {
        (os_hooks)->interrupt_cpu(vm, logical_cpu, vector);
     }
 }
-#endif