VirtualBox

Changeset 5461 in vbox for trunk/src/VBox/Runtime


Ignore:
Timestamp:
Oct 24, 2007 2:18:28 AM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
25635
Message:

Made u64Prev a pointer so TM can share it between contexts. Added R3, R0 and GC layouts.

Location:
trunk/src/VBox/Runtime
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/Makefile.kmk

    r5459 r5461  
    209209        r3/tcp.cpp
    210210
    211 #if1of ($(BUILD_TARGET_ARCH),amd64 x86)
    212 # RuntimeR3_SOURCES += common/time/timesupA.asm
    213 #else
     211if1of ($(BUILD_TARGET_ARCH),amd64 x86)
     212 RuntimeR3_SOURCES += common/time/timesupA.asm
     213else
    214214 RuntimeR3_SOURCES += common/time/timesupref.cpp
    215 #endif
     215endif
    216216
    217217ifdef IPRT_WITH_KLDR
     
    680680        VBox/strformat-vbox.cpp
    681681
    682 #if1of ($(BUILD_TARGET_ARCH),amd64 x86)
    683 # RuntimeR0_SOURCES += common/time/timesupA.asm
    684 #else
     682if1of ($(BUILD_TARGET_ARCH),amd64 x86)
     683 RuntimeR0_SOURCES += common/time/timesupA.asm
     684else
    685685 RuntimeR0_SOURCES += common/time/timesupref.cpp
    686 #endif
     686endif
    687687
    688688RuntimeR0_SOURCES.win.amd64 = $(RuntimeWin64ASM_SOURCES)
     
    10101010        VBox/strformat-vbox.cpp \
    10111011
    1012 #if1of ($(BUILD_TARGET_ARCH),amd64 x86)
    1013 # RuntimeGC_SOURCES += common/time/timesupA.asm
    1014 #else
     1012if1of ($(BUILD_TARGET_ARCH),amd64 x86)
     1013 RuntimeGC_SOURCES += common/time/timesupA.asm
     1014else
    10151015 RuntimeGC_SOURCES += common/time/timesupref.cpp
    1016 #endif
     1016endif
    10171017
    10181018ifeq ($(VBOX_LDR_FMT32),lx)
  • trunk/src/VBox/Runtime/common/time/timesup.cpp

    r5456 r5461  
    4747*******************************************************************************/
    4848#ifndef IN_GUEST
     49/** The previous timestamp value returned by RTTimeNanoTS. */
     50static uint64_t         g_TimeNanoTSPrev = 0;
     51
    4952/** The RTTimeNanoTS data structure that's passed down to the worker functions.  */
    5053static RTTIMENANOTSDATA g_TimeNanoTSData =
    5154{
    52     /* .u64Prev       = */ 0,
     55    /* .pu64Prev      = */ &g_TimeNanoTSPrev,
     56    /* .pfnBad        = */ rtTimeNanoTSInternalBitch,
     57    /* .pfnRediscover = */ rtTimeNanoTSInternalRediscover,
    5358    /* .c1nsSteps     = */ 0,
    5459    /* .cExpired      = */ 0,
    5560    /* .cBadPrev      = */ 0,
    56     /* .cUpdateRaces  = */ 0,
    57     /* .pfnBad        = */ rtTimeNanoTSInternalBitch,
    58     /* .pfnRediscover = */ rtTimeNanoTSInternalRediscover
     61    /* .cUpdateRaces  = */ 0
    5962};
    6063
  • trunk/src/VBox/Runtime/common/time/timesupA.asm

    r5457 r5461  
    2525;; Keep this in sync with iprt/time.h.
    2626struc RTTIMENANOTSDATA
    27     .u64Prev            resq 1
     27    .pu64Prev           RTCCPTR_RES 1
     28    .pfnBad             RTCCPTR_RES 1
     29    .pfnRediscover      RTCCPTR_RES 1
    2830    .c1nsSteps          resd 1
    2931    .cExpired           resd 1
    3032    .cBadPrev           resd 1
    3133    .cUpdateRaces       resd 1
    32     .pfnBad             RTCCPTR_RES 1
    33     .pfnRediscover      RTCCPTR_RES 1
    3434endstruc
    3535
  • trunk/src/VBox/Runtime/common/time/timesupA.mac

    r5460 r5461  
    104104    ;   RDTSC result, we try to make sure it has completed as well.
    105105    mov     esi, pData
     106    mov     esi, [esi + RTTIMENANOTSDATA.pu64Prev]
    106107    mov     ebx, eax
    107108    mov     ecx, edx
    108     lock cmpxchg8b [esi + RTTIMENANOTSDATA.u64Prev]
     109    lock cmpxchg8b [esi]
    109110    mov     u64PrevNanoTS, eax
    110111    mov     u64PrevNanoTS_Hi, edx
     
    191192    mov     ecx, edx
    192193    mov     esi, pData
     194    mov     esi, [esi + RTTIMENANOTSDATA.pu64Prev]
    193195    mov     eax, u64PrevNanoTS
    194196    mov     edx, u64PrevNanoTS_Hi
    195     lock cmpxchg8b [esi + RTTIMENANOTSDATA.u64Prev]
     197    lock cmpxchg8b [esi]
    196198    jnz     .UpdateFailed
    197199
     
    498500    mov     u32UpdateIntervalTSC, [pGipCPU + SUPGIPCPU.u32UpdateIntervalTSC]
    499501    rdtsc
    500     mov     u64PrevNanoTS,        [pData + RTTIMENANOTSDATA.u64Prev]
     502    mov     u64PrevNanoTS,        [pData + RTTIMENANOTSDATA.pu64Prev]
     503    mov     u64PrevNanoTS,        [u64PrevNanoTS]
    501504    shl     rdx, 32
    502505 %ifdef u64SavedRetNanoTS               ; doing this here saves a tick or so.
     
    574577.Update:
    575578    ; if (RT_LIKELY(ASMAtomicCmpXchgU64(&pData->u64Prev, u64RetNanoTS, u64PrevNanoTS)))
     579    mov     rbx, [pData + RTTIMENANOTSDATA.pu64Prev]
    576580    mov     rcx, rax
    577581    mov     rax, u64PrevNanoTS
    578     lock cmpxchg [pData + RTTIMENANOTSDATA.u64Prev], rcx
     582    lock cmpxchg [rbx], rcx
    579583    jnz     .UpdateFailed
    580584
     
    691695    lock inc dword [pData + RTTIMENANOTSDATA.cUpdateRaces]
    692696    ; for (i = 0; i < 10; i++)
    693     mov     ebx, 10
     697    mov     edx, 10
    694698.UpdateLoop:
    695699    ; if (u64PrevNanoTS >= u64RetNanoTS)
     
    699703.UpdateLoopLess:
    700704    ; retry
    701     lock cmpxchg [pData + RTTIMENANOTSDATA.u64Prev], rcx
     705    lock cmpxchg [rbx], rcx
    702706    jz      .Updated
    703     dec     ebx
     707    dec     edx
    704708    jnz     .UpdateLoop
    705709    jmp     .Updated
  • trunk/src/VBox/Runtime/common/time/timesupref.h

    r5456 r5461  
    7272        u32NanoTSFactor0 = pGip->u32UpdateIntervalNS;
    7373        u64Delta = ASMReadTSC();
    74         u64PrevNanoTS = ASMAtomicReadU64(&pData->u64Prev);
     74        u64PrevNanoTS = ASMAtomicReadU64(pData->pu64Prev);
    7575
    7676#ifdef NEED_TRANSACTION_ID
     
    142142    }
    143143
    144     if (RT_LIKELY(ASMAtomicCmpXchgU64(&pData->u64Prev, u64NanoTS, u64PrevNanoTS)))
     144    if (RT_LIKELY(ASMAtomicCmpXchgU64(pData->pu64Prev, u64NanoTS, u64PrevNanoTS)))
    145145    {
    146146        /*
     
    154154        for (int cTries = 25;;)
    155155        {
    156             u64PrevNanoTS = ASMAtomicReadU64(&pData->u64Prev);
     156            u64PrevNanoTS = ASMAtomicReadU64(pData->pu64Prev);
    157157            if (u64PrevNanoTS >= u64NanoTS)
    158158                break;
    159             if (ASMAtomicCmpXchgU64(&pData->u64Prev, u64NanoTS, u64PrevNanoTS))
     159            if (ASMAtomicCmpXchgU64(pData->pu64Prev, u64NanoTS, u64PrevNanoTS))
    160160                break;
    161161            AssertBreak(--cTries <= 0, );
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