X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmx.c;h=ef0f614d23c2eeec292a4fd747d3d3231d9ec24f;hb=e874305a90a64fc14c06c00c8d57f8019709c19f;hp=6d50ff3ad4721dd72e00a68d6c9bb01401b5e122;hpb=29b7ff8811c82ab543f5c969e44ff217637a09c7;p=palacios.git diff --git a/palacios/src/palacios/vmx.c b/palacios/src/palacios/vmx.c index 6d50ff3..ef0f614 100644 --- a/palacios/src/palacios/vmx.c +++ b/palacios/src/palacios/vmx.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -662,11 +663,11 @@ int v3_vmx_enter(struct guest_info * info) { // Conditionally yield the CPU if the timeslice has expired v3_yield_cond(info); - /* If this guest is frequency-lagged behind host time, wait - * for the appropriate host time before resuming the guest. */ + // Perform any additional yielding needed for time adjustment v3_adjust_time(info); - // v3_print_guest_state(info); + // Update timer devices prior to entering VM. + v3_update_timers(info); // disable global interrupts for vm state transition v3_disable_ints(); @@ -688,7 +689,8 @@ int v3_vmx_enter(struct guest_info * info) { vmcs_write(VMCS_GUEST_CR3, guest_cr3); } - v3_update_timers(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); @@ -713,6 +715,9 @@ int v3_vmx_enter(struct guest_info * info) { return -1; } + // Immediate exit from VM time bookkeeping + v3_time_exit_vm(info); + info->num_exits++; /* Update guest state */ @@ -857,7 +862,8 @@ void v3_init_vmx_cpu(int cpu_id) { struct v3_msr tmp_msr; uint64_t ret = 0; - v3_get_msr(VMX_CR4_FIXED0_MSR,&(tmp_msr.hi),&(tmp_msr.lo)); + v3_get_msr(VMX_CR4_FIXED0_MSR, &(tmp_msr.hi), &(tmp_msr.lo)); + #ifdef __V3_64BIT__ __asm__ __volatile__ ( "movq %%cr4, %%rbx;" @@ -944,3 +950,9 @@ void v3_init_vmx_cpu(int cpu_id) { } + +void v3_deinit_vmx_cpu(int cpu_id) { + extern v3_cpu_arch_t v3_cpu_types[]; + v3_cpu_types[cpu_id] = V3_INVALID_CPU; + V3_FreePages((void *)host_vmcs_ptrs[cpu_id], 1); +}