X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm.c;h=6bf1a299f6444dc4950bb7f93025cc6602ddde3f;hb=d962f2be029772be3f21d9bd206ddf2a9f6a1d20;hp=3123030a99e5fd97c046d891754f24ad926b50b0;hpb=b580d9fca65a7b6f84eaebb57cad09bc6e941dfd;p=palacios.git diff --git a/palacios/src/palacios/vmm.c b/palacios/src/palacios/vmm.c index 3123030..6bf1a29 100644 --- a/palacios/src/palacios/vmm.c +++ b/palacios/src/palacios/vmm.c @@ -124,7 +124,7 @@ v3_cpu_arch_t v3_get_cpu_type(int cpu_id) { struct v3_vm_info * v3_create_vm(void * cfg, void * priv_data, char * name) { - struct v3_vm_info * vm = v3_config_guest(cfg); + struct v3_vm_info * vm = v3_config_guest(cfg, priv_data); V3_Print("CORE 0 RIP=%p\n", (void *)(addr_t)(vm->cores[0].rip)); @@ -134,8 +134,6 @@ struct v3_vm_info * v3_create_vm(void * cfg, void * priv_data, char * name) { return NULL; } - - if (name == NULL) { name = "[V3_VM]"; } else if (strlen(name) >= 128) { @@ -145,8 +143,6 @@ struct v3_vm_info * v3_create_vm(void * cfg, void * priv_data, char * name) { memset(vm->name, 0, 128); strncpy(vm->name, name, 127); - vm->host_priv_data = priv_data; - return vm; } @@ -187,7 +183,7 @@ static int start_core(void * p) #define MAX_CORES 32 -static int v3_start_vm(struct v3_vm_info * vm, unsigned int cpu_mask) { +int v3_start_vm(struct v3_vm_info * vm, unsigned int cpu_mask) { uint32_t i; int vcore_id = 0; uint8_t * core_mask = (uint8_t *)&cpu_mask; // This is to make future expansion easier @@ -212,7 +208,7 @@ static int v3_start_vm(struct v3_vm_info * vm, unsigned int cpu_mask) { } if (vm->num_cores > avail_cores) { - PrintError("Attempted to start a VM with too many cores (MAX=%d)\n", MAX_CORES); + PrintError("Attempted to start a VM with too many cores (vm->num_cores = %d, avail_cores = %d, MAX=%d)\n", vm->num_cores, avail_cores, MAX_CORES); return -1; } @@ -273,13 +269,35 @@ 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_yield(NULL); + } + + return 0; +} + + +int v3_free_vm(struct v3_vm_info * vm) { // deinitialize guest (free memory, etc...) + v3_dev_mgr_deinit(vm); + return 0; }