VirtualBox

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


Ignore:
Timestamp:
Feb 27, 2025 9:41:50 AM (2 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
167771
Message:

VMM/NEMR3Native-win-armv8.cpp: Need to call WHvResumePartitionTime() to get time ticking despite the docs claiming that it is resumed as soon as vCPU starts executing. Also suspend time already when querying the guest CPU tick counter, bugref:10392

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/CPUMR3CpuId-armv8.cpp

    r107650 r108404  
    168168    /* Write ID_AA64ISAR0_EL1 register back. */
    169169    pVM->cpum.s.GuestIdRegs.u64RegIdAa64Isar0El1 = u64IdReg;
     170
     171
     172    u64IdReg = pVM->cpum.s.GuestIdRegs.u64RegIdAa64Dfr0El1;
     173    PORTABLE_DISABLE_FEATURE_BIT_CFG(0, u64IdReg, ARMV8_ID_AA64DFR0_EL1_PMUVER,   ARMV8_ID_AA64DFR0_EL1_PMUVER_SUPPORTED_V3, CPUMISAEXTCFG_DISABLED ,    ARMV8_ID_AA64DFR0_EL1_PMUVER_NOT_IMPL);
     174
     175    pVM->cpum.s.GuestIdRegs.u64RegIdAa64Dfr0El1 = u64IdReg;
    170176
    171177    /** @todo Other ID and feature registers. */
  • trunk/src/VBox/VMM/VMMR3/NEMR3Native-win-armv8.cpp

    r108398 r108404  
    17631763    AssertReturn(VM_IS_NEM_ENABLED(pVM), VERR_NEM_IPE_9);
    17641764
     1765    /* Ensure time for the partition is suspended - it will be resumed as soon as a vCPU starts executing. */
     1766    HRESULT hrc = WHvSuspendPartitionTime(pVM->nem.s.hPartition);
     1767    AssertLogRelMsgReturn(SUCCEEDED(hrc),
     1768                          ("WHvSuspendPartitionTime(%p) -> %Rhrc (Last=%#x/%u)\n",
     1769                           pVM->nem.s.hPartition, hrc, RTNtLastStatusValue(), RTNtLastErrorValue())
     1770                          , VERR_NEM_GET_REGISTERS_FAILED);
     1771
    17651772    /* Call the offical API. */
    17661773    WHV_REGISTER_NAME  enmName = WHvArm64RegisterCntvctEl0;
    17671774    WHV_REGISTER_VALUE Value   = { { {0, 0} } };
    1768     HRESULT hrc = WHvGetVirtualProcessorRegisters(pVM->nem.s.hPartition, pVCpu->idCpu, &enmName, 1, &Value);
     1775    hrc = WHvGetVirtualProcessorRegisters(pVM->nem.s.hPartition, pVCpu->idCpu, &enmName, 1, &Value);
    17691776    AssertLogRelMsgReturn(SUCCEEDED(hrc),
    17701777                          ("WHvGetVirtualProcessorRegisters(%p, %u,{CNTVCT_EL0},1,) -> %Rhrc (Last=%#x/%u)\n",
     
    17721779                          , VERR_NEM_GET_REGISTERS_FAILED);
    17731780    *pcTicks = Value.Reg64;
     1781    LogFlow(("NEMHCQueryCpuTick: %#RX64 (host: %#RX64)\n", *pcTicks, ASMReadTSC()));
    17741782    if (puAux)
    17751783        *puAux =0;
     
    17971805     * Call the offical API to do the job.
    17981806     */
    1799     /* Ensure time for the partition is suspended - it will be resumed as soon as a vCPU starts executing. */
    1800     HRESULT hrc = WHvSuspendPartitionTime(pVM->nem.s.hPartition);
    1801     AssertLogRelMsgReturn(SUCCEEDED(hrc),
    1802                           ("WHvSuspendPartitionTime(%p) -> %Rhrc (Last=%#x/%u)\n",
    1803                            pVM->nem.s.hPartition, hrc, RTNtLastStatusValue(), RTNtLastErrorValue())
    1804                           , VERR_NEM_SET_TSC);
     1807    LogFlow(("NEMHCResumeCpuTickOnAll: %#RX64 (host: %#RX64)\n", uPausedTscValue, ASMReadTSC()));
    18051808
    18061809    /*
     
    18151818        WHV_REGISTER_VALUE Value;
    18161819        Value.Reg64 = uPausedTscValue;
    1817         hrc = WHvSetVirtualProcessorRegisters(pVM->nem.s.hPartition, idCpu, &enmName, 1, &Value);
     1820        HRESULT hrc = WHvSetVirtualProcessorRegisters(pVM->nem.s.hPartition, idCpu, &enmName, 1, &Value);
    18181821        AssertLogRelMsgReturn(SUCCEEDED(hrc),
    18191822                              ("WHvSetVirtualProcessorRegisters(%p, 0,{CNTVCT_EL0},1,%#RX64) -> %Rhrc (Last=%#x/%u)\n",
     
    18251828        pVCpuDst->nem.s.fSyncCntvRegs = true;
    18261829    }
     1830
     1831    HRESULT hrc = WHvResumePartitionTime(pVM->nem.s.hPartition);
     1832    AssertLogRelMsgReturn(SUCCEEDED(hrc),
     1833                          ("WHvResumePartitionTime(%p) -> %Rhrc (Last=%#x/%u)\n",
     1834                           pVM->nem.s.hPartition, hrc, RTNtLastStatusValue(), RTNtLastErrorValue())
     1835                          , VERR_NEM_SET_TSC);
    18271836
    18281837    return VINF_SUCCESS;
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