VirtualBox

Changeset 8789 in vbox


Ignore:
Timestamp:
May 13, 2008 3:43:59 PM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
30788
Message:

Windows host: also check for tsc consistency across cores/cpus. The TSC invariant cpuid bit doesn't always imply consistent behaviour on the new barcelona cpus.

Location:
trunk/src/VBox/HostDrivers/Support
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/Support/SUPDRV.h

    r8155 r8789  
    709709    /** GIP timer interval (ms). */
    710710    ULONG                   ulGipTimerInterval;
     711    /** Flag to force async GIP timer mode. */
     712    BOOLEAN                 fForceAsyncTsc;
    711713#endif
    712714#ifdef RT_OS_LINUX
     
    759761void  VBOXCALL  supdrvOSGipSuspend(PSUPDRVDEVEXT pDevExt);
    760762unsigned VBOXCALL supdrvOSGetCPUCount(void);
    761 bool VBOXCALL   supdrvOSGetForcedAsyncTscMode(void);
     763bool VBOXCALL   supdrvOSGetForcedAsyncTscMode(PSUPDRVDEVEXT pDevExt);
    762764#endif
    763765
  • trunk/src/VBox/HostDrivers/Support/SUPDRVShared.c

    r8155 r8789  
    4545#include <iprt/cpuset.h>
    4646#include <iprt/log.h>
     47#include <VBox/x86.h>
    4748
    4849/*
     
    236237static void     supdrvLdrFree(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage);
    237238static SUPPAGINGMODE supdrvIOCtl_GetPagingMode(void);
    238 static SUPGIPMODE supdrvGipDeterminTscMode(void);
     239static SUPGIPMODE supdrvGipDeterminTscMode(PSUPDRVDEVEXT pDevExt);
    239240#ifdef RT_OS_WINDOWS
    240241static int      supdrvPageGetPhys(PSUPDRVSESSION pSession, RTR3PTR pvR3, uint32_t cPages, PRTHCPHYS paPages);
     
    38503851    pGip->u32Magic          = SUPGLOBALINFOPAGE_MAGIC;
    38513852    pGip->u32Version        = SUPGLOBALINFOPAGE_VERSION;
    3852     pGip->u32Mode           = supdrvGipDeterminTscMode();
     3853    pGip->u32Mode           = supdrvGipDeterminTscMode(pDevExt);
    38533854    pGip->u32UpdateHz       = uUpdateHz;
    38543855    pGip->u32UpdateIntervalNS = 1000000000 / uUpdateHz;
     
    38923893 *
    38933894 * @returns The most suitable TSC mode.
    3894  */
    3895 static SUPGIPMODE supdrvGipDeterminTscMode(void)
     3895 * @param   pDevExt     Pointer to the device instance data.
     3896 */
     3897static SUPGIPMODE supdrvGipDeterminTscMode(PSUPDRVDEVEXT pDevExt)
    38963898{
    38973899#ifndef USE_NEW_OS_INTERFACE_FOR_GIP
     
    39123914
    39133915        /* Permit user users override. */
    3914         if (supdrvOSGetForcedAsyncTscMode())
     3916        if (supdrvOSGetForcedAsyncTscMode(pDevExt))
    39153917            return SUPGIPMODE_ASYNC_TSC;
    39163918
    39173919        /* Check for "AuthenticAMD" */
    39183920        ASMCpuId(0, &uEAX, &uEBX, &uECX, &uEDX);
    3919         if (uEAX >= 1 && uEBX == 0x68747541 && uECX == 0x444d4163 && uEDX == 0x69746e65)
     3921        if (    uEAX >= 1
     3922            &&  uEBX == X86_CPUID_VENDOR_AMD_EBX
     3923            &&  uECX == X86_CPUID_VENDOR_AMD_ECX
     3924            &&  uEDX == X86_CPUID_VENDOR_AMD_EDX)
    39203925        {
    39213926            /* Check for APM support and that TscInvariant is cleared. */
  • trunk/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c

    r8347 r8789  
    14051405 * @todo add a module argument for this.
    14061406 */
    1407 bool VBOXCALL  supdrvOSGetForcedAsyncTscMode(void)
     1407bool VBOXCALL  supdrvOSGetForcedAsyncTscMode(PSUPDRVDEVEXT pDevExt)
    14081408{
    14091409    return force_async_tsc != 0;
  • trunk/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp

    r8155 r8789  
    120120        if (NT_SUCCESS(rc))
    121121        {
     122            uint64_t  u64DiffCores;
     123
    122124            /*
    123125             * Initialize the device extension.
     
    125127            PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)pDevObj->DeviceExtension;
    126128            memset(pDevExt, 0, sizeof(*pDevExt));
     129
     130            /* Make sure the tsc is consistent across cpus/cores. */
     131            pDevExt->fForceAsyncTsc = supdrvDetermineAsyncTsc(&u64DiffCores);
     132            dprintf(("supdrvDetermineAsyncTsc: fAsync=%d u64DiffCores=%u.\n", pDevExt->fForceAsyncTsc, (uint32_t)u64DiffCores));
     133
    127134            int vrc = supdrvInitDevExt(pDevExt);
    128135            if (!vrc)
     
    767774 * Force async tsc mode (stub).
    768775 */
    769 bool VBOXCALL  supdrvOSGetForcedAsyncTscMode(void)
    770 {
    771     return false;
     776bool VBOXCALL  supdrvOSGetForcedAsyncTscMode(PSUPDRVDEVEXT pDevExt)
     777{
     778    return pDevExt->fForceAsyncTsc != 0;
    772779}
    773780
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