Changeset 44958 in vbox
- Timestamp:
- Mar 7, 2013 3:56:10 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 84169
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/HWVMXR0.cpp
r44934 r44958 2252 2252 #endif /* VBOX_WITH_AUTO_MSR_LOAD_RESTORE */ 2253 2253 2254 #if 0 /* Temp move for testing. */ 2254 2255 bool fOffsettedTsc; 2255 2256 if (pVM->hm.s.vmx.fUsePreemptTimer) … … 2305 2306 STAM_COUNTER_INC(&pVCpu->hm.s.StatTscIntercept); 2306 2307 } 2308 #endif 2307 2309 2308 2310 /* Done with the major changes */ … … 3170 3172 STAM_COUNTER_INC(&pVCpu->hm.s.StatLoadFull); 3171 3173 } 3174 3175 #if 1 /* Moved for testing. */ 3176 bool fOffsettedTsc; 3177 if (pVM->hm.s.vmx.fUsePreemptTimer) 3178 { 3179 uint64_t cTicksToDeadline = TMCpuTickGetDeadlineAndTscOffset(pVCpu, &fOffsettedTsc, &pVCpu->hm.s.vmx.u64TSCOffset); 3180 3181 /* Make sure the returned values have sane upper and lower boundaries. */ 3182 uint64_t u64CpuHz = SUPGetCpuHzFromGIP(g_pSUPGlobalInfoPage); 3183 3184 cTicksToDeadline = RT_MIN(cTicksToDeadline, u64CpuHz / 64); /* 1/64 of a second */ 3185 cTicksToDeadline = RT_MAX(cTicksToDeadline, u64CpuHz / 2048); /* 1/2048th of a second */ 3186 3187 cTicksToDeadline >>= pVM->hm.s.vmx.cPreemptTimerShift; 3188 uint32_t cPreemptionTickCount = (uint32_t)RT_MIN(cTicksToDeadline, UINT32_MAX - 16); 3189 rc = VMXWriteVmcs(VMX_VMCS32_GUEST_PREEMPTION_TIMER_VALUE, cPreemptionTickCount); 3190 AssertRC(rc); 3191 } 3192 else 3193 fOffsettedTsc = TMCpuTickCanUseRealTSC(pVCpu, &pVCpu->hm.s.vmx.u64TSCOffset); 3194 3195 if (fOffsettedTsc) 3196 { 3197 uint64_t u64CurTSC = ASMReadTSC(); 3198 if (u64CurTSC + pVCpu->hm.s.vmx.u64TSCOffset > TMCpuTickGetLastSeen(pVCpu)) 3199 { 3200 /* Note: VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_RDTSC_EXIT takes precedence over TSC_OFFSET, applies to RDTSCP too. */ 3201 rc = VMXWriteVmcs64(VMX_VMCS64_CTRL_TSC_OFFSET_FULL, pVCpu->hm.s.vmx.u64TSCOffset); 3202 AssertRC(rc); 3203 3204 pVCpu->hm.s.vmx.u32ProcCtls &= ~VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_RDTSC_EXIT; 3205 rc = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u32ProcCtls); 3206 AssertRC(rc); 3207 STAM_COUNTER_INC(&pVCpu->hm.s.StatTscOffset); 3208 } 3209 else 3210 { 3211 /* Fall back to rdtsc, rdtscp emulation as we would otherwise pass decreasing tsc values to the guest. */ 3212 LogFlow(("TSC %RX64 offset %RX64 time=%RX64 last=%RX64 (diff=%RX64, virt_tsc=%RX64)\n", u64CurTSC, 3213 pVCpu->hm.s.vmx.u64TSCOffset, u64CurTSC + pVCpu->hm.s.vmx.u64TSCOffset, 3214 TMCpuTickGetLastSeen(pVCpu), TMCpuTickGetLastSeen(pVCpu) - u64CurTSC - pVCpu->hm.s.vmx.u64TSCOffset, 3215 TMCpuTickGet(pVCpu))); 3216 pVCpu->hm.s.vmx.u32ProcCtls |= VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_RDTSC_EXIT; 3217 rc = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u32ProcCtls); 3218 AssertRC(rc); 3219 STAM_COUNTER_INC(&pVCpu->hm.s.StatTscInterceptOverFlow); 3220 } 3221 } 3222 else 3223 { 3224 pVCpu->hm.s.vmx.u32ProcCtls |= VMX_VMCS_CTRL_PROC_EXEC_CONTROLS_RDTSC_EXIT; 3225 rc = VMXWriteVmcs(VMX_VMCS32_CTRL_PROC_EXEC_CONTROLS, pVCpu->hm.s.vmx.u32ProcCtls); 3226 AssertRC(rc); 3227 STAM_COUNTER_INC(&pVCpu->hm.s.StatTscIntercept); 3228 } 3229 #endif 3172 3230 3173 3231 #ifndef VBOX_WITH_VMMR0_DISABLE_PREEMPTION
Note:
See TracChangeset
for help on using the changeset viewer.