- Timestamp:
- Oct 25, 2007 11:47:19 PM (17 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/TM.cpp
r5398 r5505 102 102 #include <VBox/dbgf.h> 103 103 #include <VBox/rem.h> 104 #include <VBox/pdm.h> 104 105 #include "TMInternal.h" 105 106 #include <VBox/vm.h> … … 223 224 N_("The GIP update interval is too big. u32UpdateIntervalNS=%RU32 (u32UpdateHz=%RU32)\n"), 224 225 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 } 225 279 226 280 /* … … 419 473 * Register statistics. 420 474 */ 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."); 425 483 426 484 #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 427 492 STAM_REG(pVM, &pVM->tm.s.StatDoQueues, STAMTYPE_PROFILE, "/TM/DoQueues", STAMUNIT_TICKS_PER_CALL, "Profiling timer TMR3TimerQueuesDo."); 428 493 STAM_REG(pVM, &pVM->tm.s.StatDoQueuesSchedule, STAMTYPE_PROFILE_ADV, "/TM/DoQueues/Schedule",STAMUNIT_TICKS_PER_CALL, "The scheduling part."); … … 661 726 TMR3DECL(void) TMR3Relocate(PVM pVM, RTGCINTPTR offDelta) 662 727 { 728 int rc; 663 729 LogFlow(("TMR3Relocate\n")); 730 664 731 pVM->tm.s.pvGIPGC = MMHyperR3ToGC(pVM, pVM->tm.s.pvGIPR3); 665 732 pVM->tm.s.paTimerQueuesGC = MMHyperR3ToGC(pVM, pVM->tm.s.paTimerQueuesR3); 666 733 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(); 667 752 668 753 /* -
trunk/src/VBox/VMM/TMInternal.h
r4787 r5505 21 21 #include <VBox/cdefs.h> 22 22 #include <VBox/types.h> 23 #include <iprt/time.h> 23 24 #include <iprt/timer.h> 24 25 #include <VBox/stam.h> … … 331 332 * This is a valid range u64NanoTS to u64NanoTS + 1000000000 (ie. 1sec). */ 332 333 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; 338 348 /** The guest virtual timer synchronous time when fVirtualSyncTicking is cleared. */ 339 349 uint64_t volatile u64VirtualSync; … … 478 488 #endif 479 489 490 DECLEXPORT(void) tmVirtualNanoTSBad(PRTTIMENANOTSDATA pData, uint64_t u64NanoTS, uint64_t u64DeltaPrev, uint64_t u64PrevNanoTS); 491 DECLEXPORT(uint64_t) tmVirtualNanoTSRediscover(PRTTIMENANOTSDATA pData); 492 480 493 /** @} */ 481 494 -
trunk/src/VBox/VMM/VMMAll/TMAllVirtual.cpp
r5400 r5505 42 42 static DECLCALLBACK(int) tmVirtualSetWarpDrive(PVM pVM, uint32_t u32Percent); 43 43 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 */ 53 DECLEXPORT(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 */ 72 DECLEXPORT(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 */ 85 DECLINLINE(uint64_t) tmVirtualGetRawNanoTS(PVM pVM) 86 { 87 return CTXALLSUFF(pVM->tm.s.pfnVirtualGetRaw)(&CTXALLSUFF(pVM->tm.s.VirtualGetRawData)); 88 } 89 90 #else 44 91 45 92 /** … … 167 214 { 168 215 /* occasional - u64NanoTS is in the 'past' relative to previous returns. */ 169 ASMAtomicIncU32(&pVM->tm.s. c1nsVirtualRawSteps);216 ASMAtomicIncU32(&pVM->tm.s.CTXALLSUFF(VirtualGetRawData).c1nsSteps); 170 217 u64NanoTS = u64PrevNanoTS + 1; 171 218 } … … 173 220 { 174 221 /* 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); 176 223 if ((int64_t)u64DeltaPrev < 0) 177 224 LogRel(("TM: u64DeltaPrev=%RI64 u64PrevNanoTS=0x%016RX64 u64NanoTS=0x%016RX64 u64Delta=%#RX64\n", … … 212 259 return u64NanoTS; 213 260 } 261 262 #endif 214 263 215 264 -
trunk/src/VBox/VMM/testcase/tstVMStructGC.cpp
r5375 r5505 122 122 123 123 GEN_CHECK_SIZE(IOM); 124 124 125 125 GEN_CHECK_SIZE(IOMMMIORANGER0); 126 126 GEN_CHECK_OFF(IOMMMIORANGER0, GCPhys); … … 677 677 GEN_CHECK_OFF(TM, u64Virtual); 678 678 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); 681 706 GEN_CHECK_OFF(TM, u64VirtualWarpDriveStart); 682 707 GEN_CHECK_OFF(TM, u64VirtualSync);
Note:
See TracChangeset
for help on using the changeset viewer.