VirtualBox

Changeset 108545 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Mar 13, 2025 8:43:30 AM (7 weeks ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
167938
Message:

VMM/NEM/win: Workaround for SMP TSC drift introduced in NEMHCResumeCpuTickOnAll on startup and resume (unpause). bugref:10876 ticketref:22334

Location:
trunk/src/VBox/VMM
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/NEMAllNativeTemplate-win.cpp.h

    r108434 r108545  
    11471147    AssertReturn(VM_IS_NEM_ENABLED(pVM), VERR_NEM_IPE_9);
    11481148
     1149    /** @todo Do this WHvSuspendPartitionTime call to when the VM is suspended. */
     1150    HRESULT hrcSuspend = E_FAIL;
     1151    if (WHvSuspendPartitionTime && WHvResumePartitionTime)
     1152    {
     1153        hrcSuspend = WHvSuspendPartitionTime(pVM->nem.s.hPartition);
     1154        AssertLogRelMsg(SUCCEEDED(hrcSuspend),
     1155                        ("WHvSuspendPartitionTime(%p) -> %Rhrc (Last=%#x/%u)\n",
     1156                         pVM->nem.s.hPartition, hrcSuspend, RTNtLastStatusValue(), RTNtLastErrorValue()));
     1157    }
     1158
    11491159    /*
    11501160     * Call the offical API to do the job.
     
    11691179    {
    11701180        Assert(enmName == WHvX64RegisterTsc);
    1171         const uint64_t offDelta = (ASMReadTSC() - uFirstTsc);
     1181        const uint64_t offDelta = SUCCEEDED(hrcSuspend) ? 0 : ASMReadTSC() - uFirstTsc;
    11721182        Value.Reg64 = uPausedTscValue + offDelta;
    11731183        hrc = WHvSetVirtualProcessorRegisters(pVM->nem.s.hPartition, iCpu, &enmName, 1, &Value);
     
    11751185                              ("WHvSetVirtualProcessorRegisters(%p, 0,{tsc},2,%#RX64 + %#RX64) -> %Rhrc (Last=%#x/%u)\n",
    11761186                               pVM->nem.s.hPartition, iCpu, uPausedTscValue, offDelta, hrc, RTNtLastStatusValue(), RTNtLastErrorValue())
     1187                              , VERR_NEM_SET_TSC);
     1188    }
     1189
     1190    if (SUCCEEDED(hrcSuspend))
     1191    {
     1192        hrc = WHvResumePartitionTime(pVM->nem.s.hPartition);
     1193        AssertLogRelMsgReturn(SUCCEEDED(hrc),
     1194                              ("WHvResumePartitionTime(%p) -> %Rhrc (Last=%#x/%u)\n",
     1195                               pVM->nem.s.hPartition, hrc, RTNtLastStatusValue(), RTNtLastErrorValue())
    11771196                              , VERR_NEM_SET_TSC);
    11781197    }
  • trunk/src/VBox/VMM/VMMR3/NEMR3Native-win.cpp

    r108434 r108545  
    163163static decltype(WHvGetVirtualProcessorRegisters) *  g_pfnWHvGetVirtualProcessorRegisters;
    164164static decltype(WHvSetVirtualProcessorRegisters) *  g_pfnWHvSetVirtualProcessorRegisters;
    165 static decltype(WHvSuspendPartitionTime) *          g_pfnWHvSuspendPartitionTime;
    166 static decltype(WHvResumePartitionTime) *           g_pfnWHvResumePartitionTime;
     165static decltype(WHvResumePartitionTime)            *g_pfnWHvResumePartitionTime;
     166static decltype(WHvSuspendPartitionTime)           *g_pfnWHvSuspendPartitionTime;
    167167decltype(WHvGetVirtualProcessorState) *             g_pfnWHvGetVirtualProcessorState = NULL;
    168168decltype(WHvSetVirtualProcessorState) *             g_pfnWHvSetVirtualProcessorState = NULL;
     
    222222    NEM_WIN_IMPORT(0, false, WHvGetVirtualProcessorRegisters),
    223223    NEM_WIN_IMPORT(0, false, WHvSetVirtualProcessorRegisters),
    224     NEM_WIN_IMPORT(0, true,  WHvSuspendPartitionTime),
    225     NEM_WIN_IMPORT(0, true,  WHvResumePartitionTime),
     224    NEM_WIN_IMPORT(0, true,  WHvResumePartitionTime),  /* since 19H1 */
     225    NEM_WIN_IMPORT(0, true,  WHvSuspendPartitionTime), /* since 19H1 */
    226226    NEM_WIN_IMPORT(0, true,  WHvRequestInterrupt),
    227227    NEM_WIN_IMPORT(0, true,  WHvGetVirtualProcessorState),
     
    303303# define WHvGetVirtualProcessorRegisters            g_pfnWHvGetVirtualProcessorRegisters
    304304# define WHvSetVirtualProcessorRegisters            g_pfnWHvSetVirtualProcessorRegisters
     305# define WHvResumePartitionTime                     g_pfnWHvResumePartitionTime
    305306# define WHvSuspendPartitionTime                    g_pfnWHvSuspendPartitionTime
    306 # define WHvResumePartitionTime                     g_pfnWHvResumePartitionTime
    307307# define WHvRequestInterrupt                        g_pfnWHvRequestInterrupt
    308308# define WHvGetVirtualProcessorState                g_pfnWHvGetVirtualProcessorState
Note: See TracChangeset for help on using the changeset viewer.

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