VirtualBox

Changeset 72522 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Jun 12, 2018 8:45:27 AM (7 years ago)
Author:
vboxsync
Message:

NEM,TM: Work on TSC and NEM/win. bugref:9044 [=>office]

Location:
trunk/src/VBox/VMM/VMMAll
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/CPUMAllMsrs.cpp

    r72358 r72522  
    63056305}
    63066306
    6307 #ifdef IN_RING0
    63086307
    63096308/**
     
    63146313 * @thread  EMT(pVCpu)
    63156314 */
    6316 VMMR0_INT_DECL(uint64_t) CPUMR0GetGuestTscAux(PVMCPU pVCpu)
    6317 {
     6315VMM_INT_DECL(uint64_t) CPUMGetGuestTscAux(PVMCPU pVCpu)
     6316{
     6317    Assert(!(pVCpu->cpum.s.Guest.fExtrn & CPUMCTX_EXTRN_TSC_AUX));
    63186318    return pVCpu->cpum.s.GuestMsrs.msr.TscAux;
    63196319}
     
    63276327 * @thread  EMT(pVCpu)
    63286328 */
    6329 VMMR0_INT_DECL(void) CPUMR0SetGuestTscAux(PVMCPU pVCpu, uint64_t uValue)
    6330 {
     6329VMM_INT_DECL(void) CPUMSetGuestTscAux(PVMCPU pVCpu, uint64_t uValue)
     6330{
     6331    pVCpu->cpum.s.Guest.fExtrn &= ~CPUMCTX_EXTRN_TSC_AUX;
    63316332    pVCpu->cpum.s.GuestMsrs.msr.TscAux = uValue;
    63326333}
     
    63396340 * @thread  EMT(pVCpu)
    63406341 */
    6341 VMMR0_INT_DECL(uint64_t) CPUMR0GetGuestSpecCtrl(PVMCPU pVCpu)
     6342VMM_INT_DECL(uint64_t) CPUMGetGuestSpecCtrl(PVMCPU pVCpu)
    63426343{
    63436344    return pVCpu->cpum.s.GuestMsrs.msr.SpecCtrl;
     
    63526353 * @thread  EMT(pVCpu)
    63536354 */
    6354 VMMR0_INT_DECL(void) CPUMR0SetGuestSpecCtrl(PVMCPU pVCpu, uint64_t uValue)
     6355VMM_INT_DECL(void) CPUMSetGuestSpecCtrl(PVMCPU pVCpu, uint64_t uValue)
    63556356{
    63566357    pVCpu->cpum.s.GuestMsrs.msr.SpecCtrl = uValue;
    63576358}
    63586359
    6359 #endif /* IN_RING0 */
    6360 
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r72518 r72522  
    69046904}
    69056905
     6906
    69066907/** Opcode 0xf3 0x0f 0xae 11b/1. */
    69076908FNIEMOP_DEF_1(iemOp_Grp15_rdgsbase, uint8_t, bRm)
     
    69316932    return VINF_SUCCESS;
    69326933}
     6934
    69336935
    69346936/** Opcode 0xf3 0x0f 0xae 11b/2. */
     
    69606962    return VINF_SUCCESS;
    69616963}
     6964
    69626965
    69636966/** Opcode 0xf3 0x0f 0xae 11b/3. */
  • trunk/src/VBox/VMM/VMMAll/NEMAll.cpp

    r72484 r72522  
    131131#endif
    132132
     133#ifndef VBOX_WITH_NATIVE_NEM
     134VMM_INT_DECL(int) NEMHCQueryCpuTick(PVMCPU pVCpu, uint64_t *pcTicks, uint32_t *puAux)
     135{
     136    RT_NOREF(pVCpu, pcTicks, puAux);
     137    AssertFailed();
     138    return VERR_NEM_IPE_9;
     139}
     140#endif
     141
  • trunk/src/VBox/VMM/VMMAll/NEMAllNativeTemplate-win.cpp.h

    r72490 r72522  
    10921092    return nemHCWinCopyStateFromHyperV(pVCpu->pVMR3, pVCpu, pCtx, fWhat);
    10931093#endif
     1094}
     1095
     1096
     1097/**
     1098 * Query the CPU tick counter and optionally the TSC_AUX MSR value.
     1099 *
     1100 * @returns VBox status code.
     1101 * @param   pVCpu       The cross context CPU structure.
     1102 * @param   pcTicks     Where to return the CPU tick count.
     1103 * @param   puAux       Where to return the TSC_AUX register value.
     1104 */
     1105VMM_INT_DECL(int) NEMHCQueryCpuTick(PVMCPU pVCpu, uint64_t *pcTicks, uint32_t *puAux)
     1106{
     1107#ifdef IN_RING3
     1108    PVM pVM = pVCpu->CTX_SUFF(pVM);
     1109    VMCPU_ASSERT_EMT_RETURN(pVCpu, VERR_VM_THREAD_NOT_EMT);
     1110    AssertReturn(VM_IS_NEM_ENABLED(pVM), VERR_NEM_IPE_9);
     1111
     1112# ifdef NEM_WIN_USE_HYPERCALLS_FOR_REGISTERS
     1113    /* Call ring-0 and get the values. */
     1114    int rc = VMMR3CallR0Emt(pVM, pVCpu, VMMR0_DO_NEM_QUERY_CPU_TICK, 0, NULL);
     1115    AssertLogRelRCReturn(rc, rc);
     1116    *pcTicks = pVCpu->nem.s.Hypercall.QueryCpuTick.cTicks;
     1117    if (puAux)
     1118        *puAux = pVCpu->cpum.GstCtx.fExtrn & CPUMCTX_EXTRN_TSC_AUX
     1119               ? pVCpu->nem.s.Hypercall.QueryCpuTick.uAux : CPUMGetGuestTscAux(pVCpu);
     1120    return VINF_SUCCESS;
     1121
     1122# else
     1123    /* Call the offical API. */
     1124    WHV_REGISTER_NAME  aenmNames[2] = { WHvX64RegisterTsc, WHvX64RegisterTscAux };
     1125    WHV_REGISTER_VALUE aValues[2]   = { {0, 0}, {0, 0} };
     1126    Assert(RT_ELEMENTS(aenmNames) == RT_ELEMENTS(aValues));
     1127    HRESULT hrc = WHvGetVirtualProcessorRegisters(pVM->nem.s.hPartition, pVCpu->idCpu, aenmNames, 2, aValues);
     1128    AssertLogRelMsgReturn(SUCCEEDED(hrc),
     1129                          ("WHvGetVirtualProcessorRegisters(%p, %u,{tsc,tsc_aux},2,) -> %Rhrc (Last=%#x/%u)\n",
     1130                           pVM->nem.s.hPartition, pVCpu->idCpu, hrc, RTNtLastStatusValue(), RTNtLastErrorValue())
     1131                          , VERR_NEM_GET_REGISTERS_FAILED);
     1132    *pcTicks = aValues[0].Reg64;
     1133    if (puAux)
     1134        *pcTicks = pVCpu->cpum.GstCtx.fExtrn & CPUMCTX_EXTRN_TSC_AUX ? aValues[0].Reg64 : CPUMGetGuestTscAux(pVCpu);
     1135    return VINF_SUCCESS;
     1136#endif
     1137#else  /* IN_RING0 */
     1138    /** @todo improve and secure this translation */
     1139    PGVM pGVM = GVMMR0ByHandle(pVCpu->pVMR0->hSelf);
     1140    AssertReturn(pGVM, VERR_INVALID_VMCPU_HANDLE);
     1141    VMCPUID idCpu = pVCpu->idCpu;
     1142    ASMCompilerBarrier();
     1143    AssertReturn(idCpu < pGVM->cCpus, VERR_INVALID_VMCPU_HANDLE);
     1144
     1145    int rc = nemR0WinQueryCpuTick(pGVM, &pGVM->aCpus[idCpu], pcTicks, puAux);
     1146    if (RT_SUCCESS(rc) && puAux && !(pVCpu->cpum.GstCtx.fExtrn & CPUMCTX_EXTRN_TSC_AUX))
     1147        *puAux = CPUMGetGuestTscAux(pVCpu);
     1148    return rc;
     1149#endif /* IN_RING0 */
    10941150}
    10951151
     
    42224278}
    42234279
     4280
  • trunk/src/VBox/VMM/VMMAll/TMAllCpu.cpp

    r69111 r72522  
    2222#define LOG_GROUP LOG_GROUP_TM
    2323#include <VBox/vmm/tm.h>
     24#include <VBox/vmm/gim.h>
     25#include <VBox/vmm/dbgf.h>
     26#include <VBox/vmm/nem.h>
    2427#include <iprt/asm-amd64-x86.h> /* for SUPGetCpuHzFromGIP */
    2528#include "TMInternal.h"
    2629#include <VBox/vmm/vm.h>
    27 #include <VBox/vmm/gim.h>
    28 #include <VBox/vmm/dbgf.h>
    2930#include <VBox/sup.h>
    3031
     
    8283        /** @todo Test that pausing and resuming doesn't cause lag! (I.e. that we're
    8384         *        unpaused before the virtual time and stopped after it. */
    84         if (pVM->tm.s.enmTSCMode == TMTSCMODE_REAL_TSC_OFFSET)
    85             pVCpu->tm.s.offTSCRawSrc = SUPReadTsc() - pVCpu->tm.s.u64TSC;
    86         else
    87             pVCpu->tm.s.offTSCRawSrc = tmCpuTickGetRawVirtual(pVM, false /* don't check for pending timers */)
    88                                      - pVCpu->tm.s.u64TSC;
     85        switch (pVM->tm.s.enmTSCMode)
     86        {
     87            case TMTSCMODE_REAL_TSC_OFFSET:
     88                pVCpu->tm.s.offTSCRawSrc = SUPReadTsc() - pVCpu->tm.s.u64TSC;
     89                break;
     90            case TMTSCMODE_VIRT_TSC_EMULATED:
     91            case TMTSCMODE_DYNAMIC:
     92                pVCpu->tm.s.offTSCRawSrc = tmCpuTickGetRawVirtual(pVM, false /* don't check for pending timers */)
     93                                         - pVCpu->tm.s.u64TSC;
     94                break;
     95            case TMTSCMODE_NATIVE_API:
     96                pVCpu->tm.s.offTSCRawSrc = 0; /** @todo ?? */
     97                break;
     98            default:
     99                AssertFailedReturn(VERR_IPE_NOT_REACHED_DEFAULT_CASE);
     100        }
    89101        return VINF_SUCCESS;
    90102    }
     
    117129
    118130            /* When resuming, use the TSC value of the last stopped VCPU to avoid the TSC going back. */
    119             if (pVM->tm.s.enmTSCMode == TMTSCMODE_REAL_TSC_OFFSET)
    120                 pVCpu->tm.s.offTSCRawSrc = SUPReadTsc() - pVM->tm.s.u64LastPausedTSC;
    121             else
    122                 pVCpu->tm.s.offTSCRawSrc = tmCpuTickGetRawVirtual(pVM, false /* don't check for pending timers */)
    123                                          - pVM->tm.s.u64LastPausedTSC;
     131            switch (pVM->tm.s.enmTSCMode)
     132            {
     133                case TMTSCMODE_REAL_TSC_OFFSET:
     134                    pVCpu->tm.s.offTSCRawSrc = SUPReadTsc() - pVM->tm.s.u64LastPausedTSC;
     135                    break;
     136                case TMTSCMODE_VIRT_TSC_EMULATED:
     137                case TMTSCMODE_DYNAMIC:
     138                    pVCpu->tm.s.offTSCRawSrc = tmCpuTickGetRawVirtual(pVM, false /* don't check for pending timers */)
     139                                             - pVM->tm.s.u64LastPausedTSC;
     140                    break;
     141                case TMTSCMODE_NATIVE_API:
     142                    pVCpu->tm.s.offTSCRawSrc = 0; /** @todo ?? */
     143                    break;
     144                default:
     145                    AssertFailedReturn(VERR_IPE_NOT_REACHED_DEFAULT_CASE);
     146            }
    124147
    125148            /* Calculate the offset for other VCPUs to use. */
     
    413436    {
    414437        PVM pVM = pVCpu->CTX_SUFF(pVM);
    415         if (pVM->tm.s.enmTSCMode == TMTSCMODE_REAL_TSC_OFFSET)
    416             u64 = SUPReadTsc();
    417         else
    418             u64 = tmCpuTickGetRawVirtual(pVM, fCheckTimers);
     438        switch (pVM->tm.s.enmTSCMode)
     439        {
     440            case TMTSCMODE_REAL_TSC_OFFSET:
     441                u64 = SUPReadTsc();
     442                break;
     443            case TMTSCMODE_VIRT_TSC_EMULATED:
     444            case TMTSCMODE_DYNAMIC:
     445                u64 = tmCpuTickGetRawVirtual(pVM, fCheckTimers);
     446                break;
     447#ifndef IN_RC
     448            case TMTSCMODE_NATIVE_API:
     449            {
     450                u64 = 0;
     451                int rcNem = NEMHCQueryCpuTick(pVCpu, &u64, NULL);
     452                AssertLogRelRCReturn(rcNem, SUPReadTsc());
     453                break;
     454            }
     455#endif
     456            default:
     457                AssertFailedBreakStmt(u64 = SUPReadTsc());
     458        }
    419459        u64 -= pVCpu->tm.s.offTSCRawSrc;
    420460
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