VirtualBox

Changeset 66403 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Apr 3, 2017 3:21:26 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
114356
Message:

CPUM: Added the MXCSR mask to the CPU database and CPUM::GuestInfo as well as the host one to CPUM::fHostMxCsrMask. Need it for correctly implementing LDMXCSR, FXRSTOR and XSTOR.

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

Legend:

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

    r66227 r66403  
    25282528}
    25292529
     2530
     2531/**
     2532 * Gets the guest MXCSR_MASK value.
     2533 *
     2534 * This does not access the x87 state, but the value we determined at VM
     2535 * initialization.
     2536 *
     2537 * @returns MXCSR mask.
     2538 * @param   pVM                 The cross context VM structure.
     2539 */
     2540VMMDECL(uint32_t) CPUMGetGuestMxCsrMask(PVM pVM)
     2541{
     2542    return pVM->cpum.s.GuestInfo.fMxCsrMask;
     2543}
     2544
  • trunk/src/VBox/VMM/VMMR3/CPUM.cpp

    r66276 r66403  
    884884    }
    885885
     886    pVM->cpum.s.fHostMxCsrMask = CPUMR3DeterminHostMxCsrMask();
     887
    886888    PCPUMCPUIDLEAF  paLeaves;
    887889    uint32_t        cLeaves;
  • trunk/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp

    r66331 r66403  
    550550
    551551
     552/**
     553 * Determins the host CPU MXCSR mask.
     554 *
     555 * @returns MXCSR mask.
     556 */
     557VMMR3DECL(uint32_t) CPUMR3DeterminHostMxCsrMask(void)
     558{
     559    if (   ASMHasCpuId()
     560        && ASMIsValidStdRange(ASMCpuId_EAX(0))
     561        && ASMCpuId_EDX(1) & X86_CPUID_FEATURE_EDX_FXSR)
     562    {
     563        uint8_t volatile abBuf[sizeof(X86FXSTATE) + 64];
     564        PX86FXSTATE      pState = (PX86FXSTATE)&abBuf[64 - ((uintptr_t)&abBuf[0] & 63)];
     565        RT_ZERO(*pState);
     566        ASMFxSave(pState);
     567        if (pState->MXCSR_MASK == 0)
     568            return 0xffbf;
     569        return pState->MXCSR_MASK;
     570    }
     571    return 0;
     572}
     573
    552574
    553575/**
     
    39824004             : rc;
    39834005
     4006    if (pCpum->GuestInfo.fMxCsrMask & ~pVM->cpum.s.fHostMxCsrMask)
     4007    {
     4008        LogRel(("Stripping unsupported MXCSR bits from guest mask: %#x -> %#x (host: %#x)\n", pCpum->GuestInfo.fMxCsrMask,
     4009                pCpum->GuestInfo.fMxCsrMask & pVM->cpum.s.fHostMxCsrMask, pVM->cpum.s.fHostMxCsrMask));
     4010        pCpum->GuestInfo.fMxCsrMask &= pVM->cpum.s.fHostMxCsrMask;
     4011    }
     4012    LogRel(("CPUM: MXCSR_MASK=%#x (host: %#x)\n", pCpum->GuestInfo.fMxCsrMask, pVM->cpum.s.fHostMxCsrMask));
     4013
    39844014    /** @cfgm{/CPUM/MSRs/[Name]/[First|Last|Type|Value|...],}
    39854015     * Overrides the guest MSRs.
  • trunk/src/VBox/VMM/VMMR3/CPUMR3Db.cpp

    r63820 r66403  
    5858     * the value in CPUID leaf 0x80000008 when present. */
    5959    uint8_t         cMaxPhysAddrWidth;
     60    /** The MXCSR mask. */
     61    uint32_t        fMxCsrMask;
    6062    /** Pointer to an array of CPUID leaves.  */
    6163    PCCPUMCPUIDLEAF paCpuIdLeaves;
     
    6769    CPUMCPUID       DefUnknownCpuId;
    6870
    69     /** MSR mask.  Several microarchitectures ignore higher bits of the    */
     71    /** MSR mask.  Several microarchitectures ignore the higher bits of ECX in
     72     *  the RDMSR and WRMSR instructions. */
    7073    uint32_t        fMsrMask;
    7174
     
    800803        if (RT_FAILURE(rc))
    801804            return rc;
     805        pInfo->fMxCsrMask = CPUMR3DeterminHostMxCsrMask();
    802806
    803807        /* Lookup database entry for MSRs. */
     
    917921
    918922        pInfo->enmUnknownCpuIdMethod = pEntry->enmUnknownCpuId;
    919         pInfo->DefCpuId         = pEntry->DefUnknownCpuId;
     923        pInfo->DefCpuId              = pEntry->DefUnknownCpuId;
     924        pInfo->fMxCsrMask            = pEntry->fMxCsrMask;
    920925
    921926        LogRel(("CPUM: Using CPU DB entry '%s' (%s %#x/%#x/%#x %s)\n",
     
    926931    pInfo->fMsrMask             = pEntry->fMsrMask;
    927932    pInfo->iFirstExtCpuIdLeaf   = 0; /* Set by caller. */
    928     pInfo->uPadding             = 0;
    929933    pInfo->uScalableBusFreq     = pEntry->uScalableBusFreq;
    930934    pInfo->paCpuIdLeavesR0      = NIL_RTR0PTR;
  • trunk/src/VBox/VMM/VMMR3/cpus/AMD_Athlon_64_3200.h

    r62478 r66403  
    208208    /*.fFlags           = */ 0,
    209209    /*.cMaxPhysAddrWidth= */ 40,
     210    /*.fMxCsrMask       = */ 0xffff, ///< @todo check.
    210211    /*.paCpuIdLeaves    = */ NULL_ALONE(g_aCpuIdLeaves_AMD_Athlon_64_3200),
    211212    /*.cCpuIdLeaves     = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_AMD_Athlon_64_3200)),
  • trunk/src/VBox/VMM/VMMR3/cpus/AMD_Athlon_64_X2_Dual_Core_4200.h

    r62478 r66403  
    216216    /*.fFlags           = */ 0,
    217217    /*.cMaxPhysAddrWidth= */ 40,
     218    /*.fMxCsrMask       = */ 0xffff,
    218219    /*.paCpuIdLeaves    = */ NULL_ALONE(g_aCpuIdLeaves_AMD_Athlon_64_X2_Dual_Core_4200),
    219220    /*.cCpuIdLeaves     = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_AMD_Athlon_64_X2_Dual_Core_4200)),
  • trunk/src/VBox/VMM/VMMR3/cpus/AMD_FX_8150_Eight_Core.h

    r62478 r66403  
    367367    /*.fFlags           = */ 0,
    368368    /*.cMaxPhysAddrWidth= */ 48,
     369    /*.fMxCsrMask       = */ 0x2ffff,
    369370    /*.paCpuIdLeaves    = */ NULL_ALONE(g_aCpuIdLeaves_AMD_FX_8150_Eight_Core),
    370371    /*.cCpuIdLeaves     = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_AMD_FX_8150_Eight_Core)),
  • trunk/src/VBox/VMM/VMMR3/cpus/AMD_Phenom_II_X6_1100T.h

    r62478 r66403  
    256256    /*.fFlags           = */ 0,
    257257    /*.cMaxPhysAddrWidth= */ 48,
     258    /*.fMxCsrMask       = */ 0x2ffff,
    258259    /*.paCpuIdLeaves    = */ NULL_ALONE(g_aCpuIdLeaves_AMD_Phenom_II_X6_1100T),
    259260    /*.cCpuIdLeaves     = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_AMD_Phenom_II_X6_1100T)),
  • trunk/src/VBox/VMM/VMMR3/cpus/Intel_80186.h

    r60411 r66403  
    5959    /*.fFlags           = */ CPUDB_F_EXECUTE_ALL_IN_IEM,
    6060    /*.cMaxPhysAddrWidth= */ 20,
     61    /*.fMxCsrMask       = */ 0,
    6162    /*.paCpuIdLeaves    = */ NULL_ALONE(g_aCpuIdLeaves_Intel_80186),
    6263    /*.cCpuIdLeaves     = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_80186)),
  • trunk/src/VBox/VMM/VMMR3/cpus/Intel_80286.h

    r60411 r66403  
    5959    /*.fFlags           = */ CPUDB_F_EXECUTE_ALL_IN_IEM,
    6060    /*.cMaxPhysAddrWidth= */ 24,
     61    /*.fMxCsrMask       = */ 0,
    6162    /*.paCpuIdLeaves    = */ NULL_ALONE(g_aCpuIdLeaves_Intel_80286),
    6263    /*.cCpuIdLeaves     = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_80286)),
  • trunk/src/VBox/VMM/VMMR3/cpus/Intel_80386.h

    r60664 r66403  
    5959    /*.fFlags           = */ CPUDB_F_EXECUTE_ALL_IN_IEM,
    6060    /*.cMaxPhysAddrWidth= */ 24,
     61    /*.fMxCsrMask       = */ 0,
    6162    /*.paCpuIdLeaves    = */ NULL_ALONE(g_aCpuIdLeaves_Intel_80386),
    6263    /*.cCpuIdLeaves     = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_80386)),
  • trunk/src/VBox/VMM/VMMR3/cpus/Intel_8086.h

    r60411 r66403  
    5959    /*.fFlags           = */ CPUDB_F_EXECUTE_ALL_IN_IEM,
    6060    /*.cMaxPhysAddrWidth= */ 20,
     61    /*.fMxCsrMask       = */ 0,
    6162    /*.paCpuIdLeaves    = */ NULL_ALONE(g_aCpuIdLeaves_Intel_8086),
    6263    /*.cCpuIdLeaves     = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_8086)),
  • trunk/src/VBox/VMM/VMMR3/cpus/Intel_Atom_330_1_60GHz.h

    r62478 r66403  
    194194    /*.fFlags           = */ 0,
    195195    /*.cMaxPhysAddrWidth= */ 32,
     196    /*.fMxCsrMask       = */ 0xffff,
    196197    /*.paCpuIdLeaves    = */ NULL_ALONE(g_aCpuIdLeaves_Intel_Atom_330_1_60GHz),
    197198    /*.cCpuIdLeaves     = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_Atom_330_1_60GHz)),
  • trunk/src/VBox/VMM/VMMR3/cpus/Intel_Core_i5_3570.h

    r62478 r66403  
    323323    /*.fFlags           = */ 0,
    324324    /*.cMaxPhysAddrWidth= */ 36,
     325    /*.fMxCsrMask       = */ 0xffff,
    325326    /*.paCpuIdLeaves    = */ NULL_ALONE(g_aCpuIdLeaves_Intel_Core_i5_3570),
    326327    /*.cCpuIdLeaves     = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_Core_i5_3570)),
  • trunk/src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_2635QM.h

    r62478 r66403  
    316316    /*.fFlags           = */ 0,
    317317    /*.cMaxPhysAddrWidth= */ 36,
     318    /*.fMxCsrMask       = */ 0xffff,
    318319    /*.paCpuIdLeaves    = */ NULL_ALONE(g_aCpuIdLeaves_Intel_Core_i7_2635QM),
    319320    /*.cCpuIdLeaves     = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_Core_i7_2635QM)),
  • trunk/src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_3960X.h

    r62478 r66403  
    353353    /*.fFlags           = */ 0,
    354354    /*.cMaxPhysAddrWidth= */ 46,
     355    /*.fMxCsrMask       = */ 0xffff,
    355356    /*.paCpuIdLeaves    = */ NULL_ALONE(g_aCpuIdLeaves_Intel_Core_i7_3960X),
    356357    /*.cCpuIdLeaves     = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_Core_i7_3960X)),
  • trunk/src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_5600U.h

    r62478 r66403  
    352352    /*.fFlags           = */ 0,
    353353    /*.cMaxPhysAddrWidth= */ 39,
     354    /*.fMxCsrMask       = */ 0xffff,
    354355    /*.paCpuIdLeaves    = */ NULL_ALONE(g_aCpuIdLeaves_Intel_Core_i7_5600U),
    355356    /*.cCpuIdLeaves     = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_Core_i7_5600U)),
  • trunk/src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_6700K.h

    r62478 r66403  
    494494    /*.fFlags           = */ 0,
    495495    /*.cMaxPhysAddrWidth= */ 39,
     496    /*.fMxCsrMask       = */ 0xffff,
    496497    /*.paCpuIdLeaves    = */ NULL_ALONE(g_aCpuIdLeaves_Intel_Core_i7_6700K),
    497498    /*.cCpuIdLeaves     = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_Core_i7_6700K)),
  • trunk/src/VBox/VMM/VMMR3/cpus/Intel_Pentium_4_3_00GHz.h

    r62478 r66403  
    261261    /*.fFlags           = */ 0,
    262262    /*.cMaxPhysAddrWidth= */ 36,
     263    /*.fMxCsrMask       = */ 0xffff,
    263264    /*.paCpuIdLeaves    = */ NULL_ALONE(g_aCpuIdLeaves_Intel_Pentium_4_3_00GHz),
    264265    /*.cCpuIdLeaves     = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_Pentium_4_3_00GHz)),
  • trunk/src/VBox/VMM/VMMR3/cpus/Intel_Pentium_M_processor_2_00GHz.h

    r62478 r66403  
    200200    /*.fFlags           = */ 0,
    201201    /*.cMaxPhysAddrWidth= */ 32,
     202    /*.fMxCsrMask       = */ 0xffbf, ///< @todo check this
    202203    /*.paCpuIdLeaves    = */ NULL_ALONE(g_aCpuIdLeaves_Intel_Pentium_M_processor_2_00GHz),
    203204    /*.cCpuIdLeaves     = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_Pentium_M_processor_2_00GHz)),
  • trunk/src/VBox/VMM/VMMR3/cpus/Intel_Pentium_N3530_2_16GHz.h

    r62478 r66403  
    249249    /*.fFlags           = */ 0,
    250250    /*.cMaxPhysAddrWidth= */ 36,
     251    /*.fMxCsrMask       = */ 0xffff,
    251252    /*.paCpuIdLeaves    = */ NULL_ALONE(g_aCpuIdLeaves_Intel_Pentium_N3530_2_16GHz),
    252253    /*.cCpuIdLeaves     = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_Pentium_N3530_2_16GHz)),
  • trunk/src/VBox/VMM/VMMR3/cpus/Intel_Xeon_X5482_3_20GHz.h

    r62478 r66403  
    229229    /*.fFlags           = */ 0,
    230230    /*.cMaxPhysAddrWidth= */ 38,
     231    /*.fMxCsrMask       = */ 0xffff,
    231232    /*.paCpuIdLeaves    = */ NULL_ALONE(g_aCpuIdLeaves_Intel_Xeon_X5482_3_20GHz),
    232233    /*.cCpuIdLeaves     = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_Xeon_X5482_3_20GHz)),
  • trunk/src/VBox/VMM/VMMR3/cpus/Quad_Core_AMD_Opteron_2384.h

    r62478 r66403  
    254254    /*.fFlags           = */ 0,
    255255    /*.cMaxPhysAddrWidth= */ 48,
     256    /*.fMxCsrMask       = */ 0x2ffff,
    256257    /*.paCpuIdLeaves    = */ NULL_ALONE(g_aCpuIdLeaves_Quad_Core_AMD_Opteron_2384),
    257258    /*.cCpuIdLeaves     = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Quad_Core_AMD_Opteron_2384)),
  • trunk/src/VBox/VMM/VMMR3/cpus/VIA_QuadCore_L4700_1_2_GHz.h

    r62478 r66403  
    388388    /*.fFlags           = */ 0,
    389389    /*.cMaxPhysAddrWidth= */ 36,
     390    /*.fMxCsrMask       = */ 0xffff,
    390391    /*.paCpuIdLeaves    = */ NULL_ALONE(g_aCpuIdLeaves_VIA_QuadCore_L4700_1_2_GHz),
    391392    /*.cCpuIdLeaves     = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_VIA_QuadCore_L4700_1_2_GHz)),
  • trunk/src/VBox/VMM/include/CPUMInternal.h

    r62478 r66403  
    157157    uint32_t                    fMsrMask;
    158158
     159    /** MXCSR mask. */
     160    uint32_t                    fMxCsrMask;
     161
    159162    /** The number of CPUID leaves (CPUMCPUIDLEAF) in the array pointed to below. */
    160163    uint32_t                    cCpuIdLeaves;
     
    162165     *  Set to cCpuIdLeaves if none present. */
    163166    uint32_t                    iFirstExtCpuIdLeaf;
    164     /** Alignment padding. */
    165     uint32_t                    uPadding;
    166167    /** How to handle unknown CPUID leaves. */
    167168    CPUMUNKNOWNCPUID            enmUnknownCpuIdMethod;
     
    403404     * to the guest.  This is 0 if no XSAVE/XRSTOR bits can be exposed. */
    404405    uint64_t                fXStateHostMask;
    405     uint8_t                 abPadding1[24];
     406
     407    /** The host MXCSR mask (determined at init). */
     408    uint32_t                fHostMxCsrMask;
     409    uint8_t                 abPadding1[20];
    406410
    407411    /** Host CPU feature information.
     
    499503    bool                    fCpuIdApicFeatureVisible;
    500504
    501     /** Align the next member on a 64-bit boundrary. */
     505    /** Align the next member on a 64-byte boundrary. */
    502506    uint8_t                 abPadding2[64 - 16 - (HC_ARCH_BITS == 64 ? 8 : 4) - 4 - 1 - 3];
    503507
  • trunk/src/VBox/VMM/include/CPUMInternal.mac

    r66276 r66403  
    3939    .cMsrRanges             resd 1                  ; uint32_t
    4040    .fMsrMask               resd 1                  ; uint32_t
     41    .fMxCsrMask             resd 1                  ; uint32_t
    4142    .cCpuIdLeaves           resd 1                  ; uint32_t
    4243    .iFirstExtCpuIdLeaf     resd 1                  ; uint32_t
    43     .uPadding               resd 1                  ; uint32_t
    4444    .enmUnknownCpuIdMethod  resd 1                  ; CPUMUNKNOWNCPUID
    4545    .DefCpuId               resb CPUMCPUID_size     ; CPUMCPUID
  • trunk/src/VBox/VMM/tools/VBoxCpuReport.cpp

    r66104 r66403  
    7171/** The alternative debug stream. */
    7272static PRTSTREAM        g_pDebugOut;
     73/** Whether to skip MSR collection.   */
     74static bool             g_fNoMsrs = false;
    7375
    7476/** Snooping info storage for vbCpuRepGuessScalableBusFrequencyName. */
     
    163165{
    164166    uint8_t  cMaxWidth;
    165     uint32_t cMaxExt = ASMCpuId_EAX(0x80000000);
    166167    if (!ASMHasCpuId())
    167168        cMaxWidth = 32;
    168     else if (ASMIsValidExtRange(cMaxExt)&& cMaxExt >= 0x80000008)
    169         cMaxWidth = ASMCpuId_EAX(0x80000008) & 0xff;
    170     else if (   ASMIsValidStdRange(ASMCpuId_EAX(0))
    171              && (ASMCpuId_EDX(1) & X86_CPUID_FEATURE_EDX_PSE36))
    172         cMaxWidth = 36;
    173169    else
    174         cMaxWidth = 32;
     170    {
     171        uint32_t cMaxExt = ASMCpuId_EAX(0x80000000);
     172        if (ASMIsValidExtRange(cMaxExt)&& cMaxExt >= 0x80000008)
     173            cMaxWidth = ASMCpuId_EAX(0x80000008) & 0xff;
     174        else if (   ASMIsValidStdRange(ASMCpuId_EAX(0))
     175                 && (ASMCpuId_EDX(1) & X86_CPUID_FEATURE_EDX_PSE36))
     176            cMaxWidth = 36;
     177        else
     178            cMaxWidth = 32;
     179    }
    175180    return cMaxWidth;
    176181}
     
    43314336        return VINF_SUCCESS;
    43324337    }
     4338    if (g_fNoMsrs)
     4339    {
     4340        vbCpuRepDebug("Skipping MSR probing (--no-msr).\n");
     4341        return VINF_SUCCESS;
     4342    }
    43334343
    43344344    /*
     
    47184728                   "    /*.fFlags           = */ 0,\n"
    47194729                   "    /*.cMaxPhysAddrWidth= */ %u,\n"
     4730                   "    /*.fMxCsrMask       = */ %#010x,\n"
    47204731                   "    /*.paCpuIdLeaves    = */ NULL_ALONE(g_aCpuIdLeaves_%s),\n"
    47214732                   "    /*.cCpuIdLeaves     = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_%s)),\n"
     
    47404751                   vbCpuRepGuessScalableBusFrequencyName(),
    47414752                   vbCpuRepGetPhysAddrWidth(),
     4753                   CPUMR3DeterminHostMxCsrMask(),
    47424754                   szNameC,
    47434755                   szNameC,
     
    47704782        { "--msrs-only", 'm', RTGETOPT_REQ_NOTHING },
    47714783        { "--msrs-dev",  'd', RTGETOPT_REQ_NOTHING },
     4784        { "--no-msrs",   'n', RTGETOPT_REQ_NOTHING },
    47724785        { "--output",    'o', RTGETOPT_REQ_STRING  },
    47734786        { "--log",       'l', RTGETOPT_REQ_STRING  },
     
    48014814                break;
    48024815
     4816            case 'n':
     4817                g_fNoMsrs = true;
     4818                break;
     4819
    48034820            case 'o':
    48044821                pszOutput = ValueUnion.psz;
     
    48104827
    48114828            case 'h':
    4812                 RTPrintf("Usage: VBoxCpuReport [-m|--msrs-only] [-d|--msrs-dev] [-h|--help] [-V|--version] [-o filename.h] [-l debug.log]\n");
     4829                RTPrintf("Usage: VBoxCpuReport [-m|--msrs-only] [-d|--msrs-dev] [-n|--no-msrs] [-h|--help] [-V|--version] [-o filename.h] [-l debug.log]\n");
    48134830                RTPrintf("Internal tool for gathering information to the VMM CPU database.\n");
    48144831                return RTEXITCODE_SUCCESS;
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