VirtualBox

Changeset 44958 in vbox


Ignore:
Timestamp:
Mar 7, 2013 3:56:10 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
84169
Message:

Moved TSC offsetting setup code for testing.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/HWVMXR0.cpp

    r44934 r44958  
    22522252#endif /* VBOX_WITH_AUTO_MSR_LOAD_RESTORE */
    22532253
     2254#if 0 /* Temp move for testing. */
    22542255    bool fOffsettedTsc;
    22552256    if (pVM->hm.s.vmx.fUsePreemptTimer)
     
    23052306        STAM_COUNTER_INC(&pVCpu->hm.s.StatTscIntercept);
    23062307    }
     2308#endif
    23072309
    23082310    /* Done with the major changes */
     
    31703172        STAM_COUNTER_INC(&pVCpu->hm.s.StatLoadFull);
    31713173    }
     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
    31723230
    31733231#ifndef VBOX_WITH_VMMR0_DISABLE_PREEMPTION
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette