X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm.c;h=0e1b90551929825ed2778ad7b95f8383db44c17f;hb=9c9370627c5a95e3abaa1b4a6b78f6f5846f53cc;hp=65b4b496e0ac9fd23055254d2c5628ffa11e04a4;hpb=6d6988cc9c8bac21d96afd800076afe0915cf2cd;p=palacios-OLD.git diff --git a/palacios/src/palacios/vmm.c b/palacios/src/palacios/vmm.c index 65b4b49..0e1b905 100644 --- a/palacios/src/palacios/vmm.c +++ b/palacios/src/palacios/vmm.c @@ -63,7 +63,7 @@ static void init_cpu(void * arg) { } else #endif { - PrintError("CPU has no virtualizationExtensions\n"); + PrintError("CPU has no virtualization Extensions\n"); } } @@ -82,7 +82,7 @@ void Init_V3(struct v3_os_hooks * hooks, int num_cpus) { } // Register all the possible device types - v3_init_devices(); + V3_init_devices(); // Register all shadow paging handlers V3_init_shdw_paging(); @@ -118,6 +118,12 @@ void Init_V3(struct v3_os_hooks * hooks, int num_cpus) { } +void Deinit_V3() { + + +} + + v3_cpu_arch_t v3_get_cpu_type(int cpu_id) { return v3_cpu_types[cpu_id]; } @@ -269,21 +275,50 @@ int v3_stop_vm(struct v3_vm_info * vm) { vm->run_state = VM_STOPPED; - // force exit all cores via a cross call/IPI - // Wait for all cores to enter CORE_STOPPED state + while (1) { + int i = 0; + int still_running = 0; + + for (i = 0; i < vm->num_cores; i++) { + if (vm->cores[i].core_run_state != CORE_STOPPED) { + still_running = 1; + } + } + if (still_running == 0) { + break; + } + V3_Print("Yielding\n"); + + v3_yield(NULL); + } + + V3_Print("VM stopped. Returning\n"); return 0; } int v3_free_vm(struct v3_vm_info * vm) { + int i = 0; // deinitialize guest (free memory, etc...) - v3_dev_mgr_deinit(vm); + v3_free_vm_devices(vm); + + // free cores + for (i = 0; i < vm->num_cores; i++) { + v3_free_core(&(vm->cores[i])); + } + + // free vm + v3_free_vm_internal(vm); + + v3_free_config(vm); + + V3_Free(vm); return 0; }