X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmx.c;h=ec59df089908f98ee95af8a3bf659c0dc12eea2d;hb=42d6bb27a1259069edd4abf28b7d796ae0f91f81;hp=bdfc8c04cb19fa8ac923a71cfd8d35679fec1bc4;hpb=55e1aec9b0d2358b02721d3d331089e100f3fe27;p=palacios-OLD.git diff --git a/palacios/src/palacios/vmx.c b/palacios/src/palacios/vmx.c index bdfc8c0..ec59df0 100644 --- a/palacios/src/palacios/vmx.c +++ b/palacios/src/palacios/vmx.c @@ -750,7 +750,7 @@ static void print_exit_log(struct guest_info * info) { */ int v3_vmx_enter(struct guest_info * info) { int ret = 0; - //uint32_t tsc_offset_low, tsc_offset_high; + uint32_t tsc_offset_low, tsc_offset_high; struct vmx_exit_info exit_info; struct vmx_data * vmx_info = (struct vmx_data *)(info->vmm_data); @@ -795,10 +795,11 @@ int v3_vmx_enter(struct guest_info * info) { // Perform last-minute time bookkeeping prior to entering the VM v3_time_enter_vm(info); - // tsc_offset_high = (uint32_t)((v3_tsc_host_offset(&info->time_state) >> 32) & 0xffffffff); - // tsc_offset_low = (uint32_t)(v3_tsc_host_offset(&info->time_state) & 0xffffffff); - // check_vmcs_write(VMCS_TSC_OFFSET_HIGH, tsc_offset_high); - // check_vmcs_write(VMCS_TSC_OFFSET, tsc_offset_low); + tsc_offset_high = (uint32_t)((v3_tsc_host_offset(&info->time_state) >> 32) & 0xffffffff); + tsc_offset_low = (uint32_t)(v3_tsc_host_offset(&info->time_state) & 0xffffffff); + check_vmcs_write(VMCS_TSC_OFFSET_HIGH, tsc_offset_high); + check_vmcs_write(VMCS_TSC_OFFSET, tsc_offset_low); + if (v3_update_vmcs_host_state(info)) { v3_enable_ints(); @@ -909,6 +910,12 @@ int v3_start_vmx_guest(struct guest_info * info) { PrintDebug("VMX core %u: Waiting for core initialization\n", info->vcpu_id); while (info->core_run_state == CORE_STOPPED) { + + if (info->vm_info->run_state == VM_STOPPED) { + // The VM was stopped before this core was initialized. + return 0; + } + v3_yield(info); //PrintDebug("VMX core %u: still waiting for INIT\n",info->vcpu_id); }