X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm.c;h=30fa2e6d45606a507da41c4f519099eb380f9d62;hb=36973b53a5876a555eb59be0b0fb5f1f49686696;hp=d2d01fbd9ae3be7c1f7e603d7f1ea92997799cc3;hpb=ee8feefed3a69f8145b896ac527c4d227516c411;p=palacios.releases.git diff --git a/palacios/src/palacios/vmm.c b/palacios/src/palacios/vmm.c index d2d01fb..30fa2e6 100644 --- a/palacios/src/palacios/vmm.c +++ b/palacios/src/palacios/vmm.c @@ -100,9 +100,10 @@ static void deinit_cpu(void * arg) { } - -void Init_V3(struct v3_os_hooks * hooks, int num_cpus) { - int i; +void Init_V3(struct v3_os_hooks * hooks, char * cpu_mask, int num_cpus) { + int i = 0; + int minor = 0; + int major = 0; V3_Print("V3 Print statement to fix a Kitten page fault bug\n"); @@ -134,26 +135,26 @@ void Init_V3(struct v3_os_hooks * hooks, int num_cpus) { V3_init_checkpoint(); #endif - - - if ((hooks) && (hooks->call_on_cpu)) { - for (i = 0; i < num_cpus; i++) { - V3_Print("Initializing VMM extensions on cpu %d\n", i); - hooks->call_on_cpu(i, &init_cpu, (void *)(addr_t)i); + for (i = 0; i < num_cpus; i++) { + major = i / 8; + minor = i % 8; - if (v3_mach_type == V3_INVALID_CPU) { - v3_mach_type = v3_cpu_types[i]; - } + if ((cpu_mask == NULL) || (*(cpu_mask + major) & (0x1 << minor))) { + V3_Print("Initializing VMM extensions on cpu %d\n", i); + hooks->call_on_cpu(i, &init_cpu, (void *)(addr_t)i); - } + if (v3_mach_type == V3_INVALID_CPU) { + v3_mach_type = v3_cpu_types[i]; + } + } + } } - - } + void Shutdown_V3() { int i; @@ -254,6 +255,14 @@ int v3_start_vm(struct v3_vm_info * vm, unsigned int cpu_mask) { uint32_t avail_cores = 0; int vcore_id = 0; + + if (vm->run_state == VM_RUNNING || + vm->run_state == VM_INVALID || + vm->run_state == VM_ERROR) { + PrintError("VM has already been launched (state=%d)\n", (int)vm->run_state); + return -1; + } + /// CHECK IF WE ARE MULTICORE ENABLED.... V3_Print("V3 -- Starting VM (%u cores)\n", vm->num_cores); @@ -678,13 +687,6 @@ v3_cpu_mode_t v3_get_host_cpu_mode() { #endif -#define V3_Yield(addr) \ - do { \ - extern struct v3_os_hooks * os_hooks; \ - if ((os_hooks) && (os_hooks)->yield_cpu) { \ - (os_hooks)->yield_cpu(); \ - } \ - } while (0) \ @@ -698,7 +700,7 @@ void v3_yield_cond(struct guest_info * info) { // (void *)info->yield_cycle_period); V3_Yield(); - info->yield_start_cycle = v3_get_host_time(&info->time_state); + info->yield_start_cycle += info->vm_info->yield_cycle_period; } } @@ -712,11 +714,23 @@ void v3_yield(struct guest_info * info) { V3_Yield(); if (info) { - info->yield_start_cycle = v3_get_host_time(&info->time_state); + info->yield_start_cycle += info->vm_info->yield_cycle_period; } } +/* + * unconditional cpu yield for a period of time + * Otherwise identical to v3_yield + */ +void v3_yield_timed(struct guest_info *info, unsigned int usec) +{ + V3_Yield_Timed(usec); + + if (info) { + info->yield_start_cycle += info->vm_info->yield_cycle_period; + } +} void v3_print_cond(const char * fmt, ...) {