VirtualBox

Changeset 5505 in vbox for trunk


Ignore:
Timestamp:
Oct 25, 2007 11:47:19 PM (17 years ago)
Author:
vboxsync
Message:

Hooked up the new IPRT time code.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/TM.cpp

    r5398 r5505  
    102102#include <VBox/dbgf.h>
    103103#include <VBox/rem.h>
     104#include <VBox/pdm.h>
    104105#include "TMInternal.h"
    105106#include <VBox/vm.h>
     
    223224                          N_("The GIP update interval is too big. u32UpdateIntervalNS=%RU32 (u32UpdateHz=%RU32)\n"),
    224225                          g_pSUPGlobalInfoPage->u32UpdateIntervalNS, g_pSUPGlobalInfoPage->u32UpdateHz);
     226
     227    /*
     228     * Setup the VirtualGetRaw backend.
     229     */
     230    pVM->tm.s.VirtualGetRawDataR3.pu64Prev = &pVM->tm.s.u64VirtualRawPrev;
     231    pVM->tm.s.VirtualGetRawDataR3.pfnBad = tmVirtualNanoTSBad;
     232    pVM->tm.s.VirtualGetRawDataR3.pfnRediscover = tmVirtualNanoTSRediscover;
     233
     234    pVM->tm.s.VirtualGetRawDataGC.pu64Prev = MMHyperR3ToGC(pVM, (void *)&pVM->tm.s.u64VirtualRawPrev);
     235#if 0 /* too early */
     236    rc = PDMR3GetSymbolGCLazy(pVM, NULL, "tmVirtualNanoTSBad",          &pVM->tm.s.VirtualGetRawDataGC.pfnBad);
     237    AssertRCReturn(rc, rc);
     238    rc = PDMR3GetSymbolGCLazy(pVM, NULL, "tmVirtualNanoTSRediscover",   &pVM->tm.s.VirtualGetRawDataGC.pfnRediscover);
     239    AssertRCReturn(rc, rc);
     240#endif
     241
     242    pVM->tm.s.VirtualGetRawDataR0.pu64Prev = MMHyperR3ToR0(pVM, (void *)&pVM->tm.s.u64VirtualRawPrev);
     243    AssertReturn(pVM->tm.s.VirtualGetRawDataR0.pu64Prev, VERR_INTERNAL_ERROR);
     244    rc = PDMR3GetSymbolR0Lazy(pVM, NULL, "tmVirtualNanoTSBad",          &pVM->tm.s.VirtualGetRawDataR0.pfnBad);
     245    AssertRCReturn(rc, rc);
     246    rc = PDMR3GetSymbolR0Lazy(pVM, NULL, "tmVirtualNanoTSRediscover",   &pVM->tm.s.VirtualGetRawDataR0.pfnRediscover);
     247    AssertRCReturn(rc, rc);
     248
     249    if (ASMCpuId_EDX(1) & X86_CPUID_FEATURE_EDX_SSE2)
     250    {
     251        if (g_pSUPGlobalInfoPage->u32Mode == SUPGIPMODE_SYNC_TSC)
     252        {
     253            pVM->tm.s.pfnVirtualGetRawR3 = RTTimeNanoTSLFenceSync;
     254            rc = PDMR3GetSymbolR0Lazy(pVM, NULL, "RTTimeNanoTSLFenceSync", &pVM->tm.s.pfnVirtualGetRawR0);
     255            AssertRCReturn(rc, rc);
     256        }
     257        else
     258        {
     259            pVM->tm.s.pfnVirtualGetRawR3 = RTTimeNanoTSLFenceAsync;
     260            rc = PDMR3GetSymbolR0Lazy(pVM, NULL, "RTTimeNanoTSLFenceAsync", &pVM->tm.s.pfnVirtualGetRawR0);
     261            AssertRCReturn(rc, rc);
     262        }
     263    }
     264    else
     265    {
     266        if (g_pSUPGlobalInfoPage->u32Mode == SUPGIPMODE_SYNC_TSC)
     267        {
     268            pVM->tm.s.pfnVirtualGetRawR3 = RTTimeNanoTSLegacySync;
     269            rc = PDMR3GetSymbolR0Lazy(pVM, NULL, "RTTimeNanoTSLegacySync", &pVM->tm.s.pfnVirtualGetRawR0);
     270            AssertRCReturn(rc, rc);
     271        }
     272        else
     273        {
     274            pVM->tm.s.pfnVirtualGetRawR3 = RTTimeNanoTSLegacyAsync;
     275            rc = PDMR3GetSymbolR0Lazy(pVM, NULL, "RTTimeNanoTSLegacyAsync", &pVM->tm.s.pfnVirtualGetRawR0);
     276            AssertRCReturn(rc, rc);
     277        }
     278    }
    225279
    226280    /*
     
    419473     * Register statistics.
    420474     */
    421     STAM_REL_REG_USED(pVM, (void *)&pVM->tm.s.c1nsVirtualRawSteps,   STAMTYPE_U32, "/TM/1nsSteps",                  STAMUNIT_OCCURENCES, "Virtual time 1ns steps (due to TSC / GIP variations)");
    422     STAM_REL_REG_USED(pVM, (void *)&pVM->tm.s.cVirtualRawBadRawPrev, STAMTYPE_U32, "/TM/BadPrevTime",               STAMUNIT_OCCURENCES, "Times the previous virtual time was considered erratic (shouldn't ever happen).");
    423     STAM_REL_REG(     pVM, (void *)&pVM->tm.s.offVirtualSync,        STAMTYPE_U64, "/TM/VirtualSync/CurrentOffset", STAMUNIT_NS,         "The current offset. (subtract GivenUp to get the lag)");
    424     STAM_REL_REG_USED(pVM, (void *)&pVM->tm.s.offVirtualSyncGivenUp, STAMTYPE_U64, "/TM/VirtualSync/GivenUp",       STAMUNIT_NS,         "Nanoseconds of the 'CurrentOffset' that's been given up and won't ever be attemted caught up with.");
     475    STAM_REL_REG_USED(pVM, (void *)&pVM->tm.s.VirtualGetRawDataR3.c1nsSteps,   STAMTYPE_U32, "/TM/R3/1nsSteps",                  STAMUNIT_OCCURENCES, "Virtual time 1ns steps (due to TSC / GIP variations).");
     476    STAM_REL_REG_USED(pVM, (void *)&pVM->tm.s.VirtualGetRawDataR3.cBadPrev,    STAMTYPE_U32, "/TM/R3/cBadPrev",                  STAMUNIT_OCCURENCES, "Times the previous virtual time was considered erratic (shouldn't ever happen).");
     477    STAM_REL_REG_USED(pVM, (void *)&pVM->tm.s.VirtualGetRawDataR0.c1nsSteps,   STAMTYPE_U32, "/TM/R0/1nsSteps",                  STAMUNIT_OCCURENCES, "Virtual time 1ns steps (due to TSC / GIP variations).");
     478    STAM_REL_REG_USED(pVM, (void *)&pVM->tm.s.VirtualGetRawDataR0.cBadPrev,    STAMTYPE_U32, "/TM/R0/cBadPrev",                  STAMUNIT_OCCURENCES, "Times the previous virtual time was considered erratic (shouldn't ever happen).");
     479    STAM_REL_REG_USED(pVM, (void *)&pVM->tm.s.VirtualGetRawDataGC.c1nsSteps,   STAMTYPE_U32, "/TM/GC/1nsSteps",                  STAMUNIT_OCCURENCES, "Virtual time 1ns steps (due to TSC / GIP variations).");
     480    STAM_REL_REG_USED(pVM, (void *)&pVM->tm.s.VirtualGetRawDataGC.cBadPrev,    STAMTYPE_U32, "/TM/GC/cBadPrev",                  STAMUNIT_OCCURENCES, "Times the previous virtual time was considered erratic (shouldn't ever happen).");
     481    STAM_REL_REG(     pVM, (void *)&pVM->tm.s.offVirtualSync,                  STAMTYPE_U64, "/TM/VirtualSync/CurrentOffset",   STAMUNIT_NS,          "The current offset. (subtract GivenUp to get the lag)");
     482    STAM_REL_REG_USED(pVM, (void *)&pVM->tm.s.offVirtualSyncGivenUp,           STAMTYPE_U64, "/TM/VirtualSync/GivenUp",         STAMUNIT_NS,          "Nanoseconds of the 'CurrentOffset' that's been given up and won't ever be attemted caught up with.");
    425483
    426484#ifdef VBOX_WITH_STATISTICS
     485    STAM_REG_USED(    pVM, (void *)&pVM->tm.s.VirtualGetRawDataR3.cExpired,    STAMTYPE_U32, "/TM/R3/cExpired",                  STAMUNIT_OCCURENCES, "Times the TSC interval expired (overlaps 1ns steps).");
     486    STAM_REG_USED(    pVM, (void *)&pVM->tm.s.VirtualGetRawDataR3.cUpdateRaces,STAMTYPE_U32, "/TM/R3/cUpdateRaces",              STAMUNIT_OCCURENCES, "Thread races when updating the previous timestamp.");
     487    STAM_REG_USED(    pVM, (void *)&pVM->tm.s.VirtualGetRawDataR0.cExpired,    STAMTYPE_U32, "/TM/R0/cExpired",                  STAMUNIT_OCCURENCES, "Times the TSC interval expired (overlaps 1ns steps).");
     488    STAM_REG_USED(    pVM, (void *)&pVM->tm.s.VirtualGetRawDataR0.cUpdateRaces,STAMTYPE_U32, "/TM/R0/cUpdateRaces",              STAMUNIT_OCCURENCES, "Thread races when updating the previous timestamp.");
     489    STAM_REG_USED(    pVM, (void *)&pVM->tm.s.VirtualGetRawDataGC.cExpired,    STAMTYPE_U32, "/TM/GC/cExpired",                  STAMUNIT_OCCURENCES, "Times the TSC interval expired (overlaps 1ns steps).");
     490    STAM_REG_USED(    pVM, (void *)&pVM->tm.s.VirtualGetRawDataGC.cUpdateRaces,STAMTYPE_U32, "/TM/GC/cUpdateRaces",              STAMUNIT_OCCURENCES, "Thread races when updating the previous timestamp.");
     491
    427492    STAM_REG(pVM, &pVM->tm.s.StatDoQueues,          STAMTYPE_PROFILE,       "/TM/DoQueues",         STAMUNIT_TICKS_PER_CALL,    "Profiling timer TMR3TimerQueuesDo.");
    428493    STAM_REG(pVM, &pVM->tm.s.StatDoQueuesSchedule,  STAMTYPE_PROFILE_ADV,   "/TM/DoQueues/Schedule",STAMUNIT_TICKS_PER_CALL,    "The scheduling part.");
     
    661726TMR3DECL(void) TMR3Relocate(PVM pVM, RTGCINTPTR offDelta)
    662727{
     728    int rc;
    663729    LogFlow(("TMR3Relocate\n"));
     730
    664731    pVM->tm.s.pvGIPGC = MMHyperR3ToGC(pVM, pVM->tm.s.pvGIPR3);
    665732    pVM->tm.s.paTimerQueuesGC = MMHyperR3ToGC(pVM, pVM->tm.s.paTimerQueuesR3);
    666733    pVM->tm.s.paTimerQueuesR0 = MMHyperR3ToR0(pVM, pVM->tm.s.paTimerQueuesR3);
     734
     735    pVM->tm.s.VirtualGetRawDataGC.pu64Prev = MMHyperR3ToGC(pVM, (void *)&pVM->tm.s.u64VirtualRawPrev);
     736    AssertFatal(pVM->tm.s.VirtualGetRawDataGC.pu64Prev);
     737    rc = PDMR3GetSymbolGCLazy(pVM, NULL, "tmVirtualNanoTSBad",          &pVM->tm.s.VirtualGetRawDataGC.pfnBad);
     738    AssertFatalRC(rc);
     739    rc = PDMR3GetSymbolGCLazy(pVM, NULL, "tmVirtualNanoTSRediscover",   &pVM->tm.s.VirtualGetRawDataGC.pfnRediscover);
     740    AssertFatalRC(rc);
     741
     742    if (pVM->tm.s.pfnVirtualGetRawR3       == RTTimeNanoTSLFenceSync)
     743        rc = PDMR3GetSymbolGCLazy(pVM, NULL, "RTTimeNanoTSLFenceSync",  &pVM->tm.s.pfnVirtualGetRawGC);
     744    else if (pVM->tm.s.pfnVirtualGetRawR3  == RTTimeNanoTSLFenceAsync)
     745        rc = PDMR3GetSymbolGCLazy(pVM, NULL, "RTTimeNanoTSLFenceAsync", &pVM->tm.s.pfnVirtualGetRawGC);
     746    else if (pVM->tm.s.pfnVirtualGetRawR3  == RTTimeNanoTSLegacySync)
     747        rc = PDMR3GetSymbolGCLazy(pVM, NULL, "RTTimeNanoTSLegacySync",  &pVM->tm.s.pfnVirtualGetRawGC);
     748    else if (pVM->tm.s.pfnVirtualGetRawR3  == RTTimeNanoTSLegacyAsync)
     749        rc = PDMR3GetSymbolGCLazy(pVM, NULL, "RTTimeNanoTSLegacyAsync", &pVM->tm.s.pfnVirtualGetRawGC);
     750    else
     751        AssertFatalFailed();
    667752
    668753    /*
  • trunk/src/VBox/VMM/TMInternal.h

    r4787 r5505  
    2121#include <VBox/cdefs.h>
    2222#include <VBox/types.h>
     23#include <iprt/time.h>
    2324#include <iprt/timer.h>
    2425#include <VBox/stam.h>
     
    331332     * This is a valid range u64NanoTS to u64NanoTS + 1000000000 (ie. 1sec). */
    332333    uint64_t volatile           u64VirtualRawPrev;
    333     /** The number of times we've had to resort to 1ns walking. */
    334     uint32_t volatile           c1nsVirtualRawSteps;
    335     /** Number of times u64VirtualRawPrev has been considered bad. */
    336     uint32_t volatile           cVirtualRawBadRawPrev;
    337 
     334    /** The ring-3 data structure for the RTTimeNanoTS workers used by tmVirtualGetRawNanoTS. */
     335    RTTIMENANOTSDATAR3          VirtualGetRawDataR3;
     336    /** The ring-0 data structure for the RTTimeNanoTS workers used by tmVirtualGetRawNanoTS. */
     337    RTTIMENANOTSDATAR0          VirtualGetRawDataR0;
     338    /** The ring-0 data structure for the RTTimeNanoTS workers used by tmVirtualGetRawNanoTS. */
     339    RTTIMENANOTSDATAGC          VirtualGetRawDataGC;
     340    /** Pointer to the ring-3 tmVirtualGetRawNanoTS worker function. */
     341    R3PTRTYPE(PFNTIMENANOTSINTERNAL) pfnVirtualGetRawR3;
     342    /** Pointer to the ring-3 tmVirtualGetRawNanoTS worker function. */
     343    R0PTRTYPE(PFNTIMENANOTSINTERNAL) pfnVirtualGetRawR0;
     344    /** Pointer to the ring-3 tmVirtualGetRawNanoTS worker function. */
     345    GCPTRTYPE(PFNTIMENANOTSINTERNAL) pfnVirtualGetRawGC;
     346    /** Alignment. */
     347    RTGCPTR                     AlignmentGCPtr;
    338348    /** The guest virtual timer synchronous time when fVirtualSyncTicking is cleared. */
    339349    uint64_t volatile           u64VirtualSync;
     
    478488#endif
    479489
     490DECLEXPORT(void) tmVirtualNanoTSBad(PRTTIMENANOTSDATA pData, uint64_t u64NanoTS, uint64_t u64DeltaPrev, uint64_t u64PrevNanoTS);
     491DECLEXPORT(uint64_t) tmVirtualNanoTSRediscover(PRTTIMENANOTSDATA pData);
     492
    480493/** @} */
    481494
  • trunk/src/VBox/VMM/VMMAll/TMAllVirtual.cpp

    r5400 r5505  
    4242static DECLCALLBACK(int) tmVirtualSetWarpDrive(PVM pVM, uint32_t u32Percent);
    4343
     44
     45/**
     46 * Helper function that's used by the assembly routines when something goes bust.
     47 *
     48 * @param   pData           Pointer to the data structure.
     49 * @param   u64NanoTS       The calculated nano ts.
     50 * @param   u64DeltaPrev    The delta relative to the previously returned timestamp.
     51 * @param   u64PrevNanoTS   The previously returned timestamp (as it was read it).
     52 */
     53DECLEXPORT(void) tmVirtualNanoTSBad(PRTTIMENANOTSDATA pData, uint64_t u64NanoTS, uint64_t u64DeltaPrev, uint64_t u64PrevNanoTS)
     54{
     55    //PVM pVM = (PVM)((uint8_t *)pData - RT_OFFSETOF(VM, CTXALLSUFF(s.tm.VirtualGetRawData)));
     56    pData->cBadPrev++;
     57    if ((int64_t)u64DeltaPrev < 0)
     58        LogRel(("TM: u64DeltaPrev=%RI64 u64PrevNanoTS=0x%016RX64 u64NanoTS=0x%016RX64\n",
     59                u64DeltaPrev, u64PrevNanoTS, u64NanoTS));
     60    else
     61        Log(("TM: u64DeltaPrev=%RI64 u64PrevNanoTS=0x%016RX64 u64NanoTS=0x%016RX64 (debugging?)\n",
     62             u64DeltaPrev, u64PrevNanoTS, u64NanoTS));
     63}
     64
     65
     66/**
     67 * Called the first time somebody asks for the time or when the GIP
     68 * is mapped/unmapped.
     69 *
     70 * This should never ever happen.
     71 */
     72DECLEXPORT(uint64_t) tmVirtualNanoTSRediscover(PRTTIMENANOTSDATA pData)
     73{
     74    //PVM pVM = (PVM)((uint8_t *)pData - RT_OFFSETOF(VM, CTXALLSUFF(s.tm.VirtualGetRawData)));
     75    PSUPGLOBALINFOPAGE pGip = g_pSUPGlobalInfoPage;
     76    AssertFatalMsgFailed(("pGip=%p u32Magic=%#x\n", pGip, VALID_PTR(pGip) ? pGip->u32Magic : 0));
     77}
     78
     79
     80#if 1
     81
     82/**
     83 * Wrapper around the IPRT GIP time methods.
     84 */
     85DECLINLINE(uint64_t) tmVirtualGetRawNanoTS(PVM pVM)
     86{
     87    return CTXALLSUFF(pVM->tm.s.pfnVirtualGetRaw)(&CTXALLSUFF(pVM->tm.s.VirtualGetRawData));
     88}
     89
     90#else
    4491
    4592/**
     
    167214    {
    168215        /* occasional - u64NanoTS is in the 'past' relative to previous returns. */
    169         ASMAtomicIncU32(&pVM->tm.s.c1nsVirtualRawSteps);
     216        ASMAtomicIncU32(&pVM->tm.s.CTXALLSUFF(VirtualGetRawData).c1nsSteps);
    170217        u64NanoTS = u64PrevNanoTS + 1;
    171218    }
     
    173220    {
    174221        /* Something has gone bust, if negative offset it's real bad. */
    175         ASMAtomicIncU32(&pVM->tm.s.cVirtualRawBadRawPrev);
     222        ASMAtomicIncU32(&pVM->tm.s.CTXALLSUFF(VirtualGetRawData).cBadPrev);
    176223        if ((int64_t)u64DeltaPrev < 0)
    177224            LogRel(("TM: u64DeltaPrev=%RI64 u64PrevNanoTS=0x%016RX64 u64NanoTS=0x%016RX64 u64Delta=%#RX64\n",
     
    212259    return u64NanoTS;
    213260}
     261
     262#endif
    214263
    215264
  • trunk/src/VBox/VMM/testcase/tstVMStructGC.cpp

    r5375 r5505  
    122122
    123123    GEN_CHECK_SIZE(IOM);
    124              
     124
    125125    GEN_CHECK_SIZE(IOMMMIORANGER0);
    126126    GEN_CHECK_OFF(IOMMMIORANGER0, GCPhys);
     
    677677    GEN_CHECK_OFF(TM, u64Virtual);
    678678    GEN_CHECK_OFF(TM, u64VirtualRawPrev);
    679     GEN_CHECK_OFF(TM, c1nsVirtualRawSteps);
    680     GEN_CHECK_OFF(TM, cVirtualRawBadRawPrev);
     679    GEN_CHECK_OFF(TM, VirtualGetRawDataR3);
     680    GEN_CHECK_OFF(TM, VirtualGetRawDataR3.pu64Prev);
     681    GEN_CHECK_OFF(TM, VirtualGetRawDataR3.pfnBad);
     682    GEN_CHECK_OFF(TM, VirtualGetRawDataR3.pfnRediscover);
     683    GEN_CHECK_OFF(TM, VirtualGetRawDataR3.c1nsSteps);
     684    GEN_CHECK_OFF(TM, VirtualGetRawDataR3.cBadPrev);
     685    GEN_CHECK_OFF(TM, VirtualGetRawDataR3.cExpired);
     686    GEN_CHECK_OFF(TM, VirtualGetRawDataR3.cUpdateRaces);
     687    GEN_CHECK_OFF(TM, VirtualGetRawDataR0);
     688    GEN_CHECK_OFF(TM, VirtualGetRawDataR0.pu64Prev);
     689    GEN_CHECK_OFF(TM, VirtualGetRawDataR0.pfnBad);
     690    GEN_CHECK_OFF(TM, VirtualGetRawDataR0.pfnRediscover);
     691    GEN_CHECK_OFF(TM, VirtualGetRawDataR0.c1nsSteps);
     692    GEN_CHECK_OFF(TM, VirtualGetRawDataR0.cBadPrev);
     693    GEN_CHECK_OFF(TM, VirtualGetRawDataR0.cExpired);
     694    GEN_CHECK_OFF(TM, VirtualGetRawDataR0.cUpdateRaces);
     695    GEN_CHECK_OFF(TM, VirtualGetRawDataGC);
     696    GEN_CHECK_OFF(TM, VirtualGetRawDataGC.pu64Prev);
     697    GEN_CHECK_OFF(TM, VirtualGetRawDataGC.pfnBad);
     698    GEN_CHECK_OFF(TM, VirtualGetRawDataGC.pfnRediscover);
     699    GEN_CHECK_OFF(TM, VirtualGetRawDataGC.c1nsSteps);
     700    GEN_CHECK_OFF(TM, VirtualGetRawDataGC.cBadPrev);
     701    GEN_CHECK_OFF(TM, VirtualGetRawDataGC.cExpired);
     702    GEN_CHECK_OFF(TM, VirtualGetRawDataGC.cUpdateRaces);
     703    GEN_CHECK_OFF(TM, pfnVirtualGetRawR3);
     704    GEN_CHECK_OFF(TM, pfnVirtualGetRawR0);
     705    GEN_CHECK_OFF(TM, pfnVirtualGetRawGC);
    681706    GEN_CHECK_OFF(TM, u64VirtualWarpDriveStart);
    682707    GEN_CHECK_OFF(TM, u64VirtualSync);
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