VirtualBox

Changeset 70612 in vbox for trunk/src/VBox/VMM/VMMR3


Ignore:
Timestamp:
Jan 17, 2018 6:12:23 PM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
120334
Message:

VMM: Expose PCID, INVPCID, FSGSBASE features to guests. Implemented the relevant instructions in IEM.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp

    r70606 r70612  
    17351735        pFeatures->fMovCmpXchg16b       = RT_BOOL(pStd1Leaf->uEcx & X86_CPUID_FEATURE_ECX_CX16);
    17361736        pFeatures->fClFlush             = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_CLFSH);
     1737        pFeatures->fPcid                = RT_BOOL(pStd1Leaf->uEcx & X86_CPUID_FEATURE_ECX_PCID);
    17371738
    17381739        /* Structured extended features. */
     
    17401741        if (pSxfLeaf0)
    17411742        {
     1743            pFeatures->fFsGsBase            = RT_BOOL(pSxfLeaf0->uEbx & X86_CPUID_STEXT_FEATURE_EBX_FSGSBASE);
    17421744            pFeatures->fAvx2                = RT_BOOL(pSxfLeaf0->uEbx & X86_CPUID_STEXT_FEATURE_EBX_AVX2);
    17431745            pFeatures->fAvx512Foundation    = RT_BOOL(pSxfLeaf0->uEbx & X86_CPUID_STEXT_FEATURE_EBX_AVX512F);
    17441746            pFeatures->fClFlushOpt          = RT_BOOL(pSxfLeaf0->uEbx & X86_CPUID_STEXT_FEATURE_EBX_CLFLUSHOPT);
     1747            pFeatures->fInvpcid             = RT_BOOL(pSxfLeaf0->uEbx & X86_CPUID_STEXT_FEATURE_EBX_INVPCID);
    17451748
    17461749            pFeatures->fIbpb                = RT_BOOL(pSxfLeaf0->uEdx & X86_CPUID_STEXT_FEATURE_EDX_IBRS_IBPB);
     
    23392342    CPUMISAEXTCFG   enmRdSeed;
    23402343    CPUMISAEXTCFG   enmCLFlushOpt;
     2344    CPUMISAEXTCFG   enmFsGsBase;
     2345    CPUMISAEXTCFG   enmPcid;
     2346    CPUMISAEXTCFG   enmInvpcid;
    23412347
    23422348    CPUMISAEXTCFG   enmAbm;
     
    26732679                           //| X86_CPUID_FEATURE_ECX_TPRUPDATE
    26742680                           //| X86_CPUID_FEATURE_ECX_PDCM  - not implemented yet.
    2675                            //| X86_CPUID_FEATURE_ECX_PCID  - not implemented yet.
     2681                           | (pConfig->enmPcid ? X86_CPUID_FEATURE_ECX_PCID : 0)
    26762682                           //| X86_CPUID_FEATURE_ECX_DCA   - not implemented yet.
    26772683                           | (pConfig->enmSse41 ? X86_CPUID_FEATURE_ECX_SSE4_1 : 0)
     
    26902696                           ;
    26912697
     2698    /* Mask out the PCID unless FSGSBASE is exposed due to a bug in Windows 10 SMP guests, see @bugref{9089#c15}. */
     2699    if (   !pVM->cpum.s.GuestFeatures.fFsGsBase
     2700        && (pStdFeatureLeaf->uEcx & X86_CPUID_FEATURE_ECX_PCID))
     2701    {
     2702        pStdFeatureLeaf->uEcx &= ~X86_CPUID_FEATURE_ECX_PCID;
     2703        LogRel(("CPUM: Disabled PCID without FSGSBASE to workaround buggy guests\n"));
     2704    }
     2705
    26922706    if (pCpum->u8PortableCpuIdLevel > 0)
    26932707    {
    26942708        PORTABLE_CLEAR_BITS_WHEN(1, pStdFeatureLeaf->uEax, ProcessorType, (UINT32_C(3) << 12), (UINT32_C(2) << 12));
    26952709        PORTABLE_DISABLE_FEATURE_BIT(    1, pStdFeatureLeaf->uEcx, SSSE3,  X86_CPUID_FEATURE_ECX_SSSE3);
     2710        PORTABLE_DISABLE_FEATURE_BIT_CFG(1, pStdFeatureLeaf->uEcx, PCID,   X86_CPUID_FEATURE_ECX_PCID,   pConfig->enmPcid);
    26962711        PORTABLE_DISABLE_FEATURE_BIT_CFG(1, pStdFeatureLeaf->uEcx, SSE4_1, X86_CPUID_FEATURE_ECX_SSE4_1, pConfig->enmSse41);
    26972712        PORTABLE_DISABLE_FEATURE_BIT_CFG(1, pStdFeatureLeaf->uEcx, SSE4_2, X86_CPUID_FEATURE_ECX_SSE4_2, pConfig->enmSse42);
     
    30953110                pCurLeaf->uEax  = 0;    /* Max ECX input is 0. */
    30963111                pCurLeaf->uEbx &= 0
    3097                                //| X86_CPUID_STEXT_FEATURE_EBX_FSGSBASE          RT_BIT(0)
     3112                               | (pConfig->enmFsGsBase ? X86_CPUID_STEXT_FEATURE_EBX_FSGSBASE : 0)
    30983113                               //| X86_CPUID_STEXT_FEATURE_EBX_TSC_ADJUST        RT_BIT(1)
    30993114                               //| X86_CPUID_STEXT_FEATURE_EBX_SGX               RT_BIT(2)
     
    31053120                               //| X86_CPUID_STEXT_FEATURE_EBX_BMI2              RT_BIT(8)
    31063121                               //| X86_CPUID_STEXT_FEATURE_EBX_ERMS              RT_BIT(9)
    3107                                //| X86_CPUID_STEXT_FEATURE_EBX_INVPCID           RT_BIT(10)
     3122                               | (pConfig->enmInvpcid ? X86_CPUID_STEXT_FEATURE_EBX_INVPCID : 0)
    31083123                               //| X86_CPUID_STEXT_FEATURE_EBX_RTM               RT_BIT(11)
    31093124                               //| X86_CPUID_STEXT_FEATURE_EBX_PQM               RT_BIT(12)
     
    31353150                if (pCpum->u8PortableCpuIdLevel > 0)
    31363151                {
    3137                     PORTABLE_DISABLE_FEATURE_BIT(    1, pCurLeaf->uEbx, FSGSBASE,   X86_CPUID_STEXT_FEATURE_EBX_FSGSBASE);
     3152                    PORTABLE_DISABLE_FEATURE_BIT_CFG(1, pCurLeaf->uEbx, FSGSBASE,   X86_CPUID_STEXT_FEATURE_EBX_FSGSBASE, pConfig->enmFsGsBase);
    31383153                    PORTABLE_DISABLE_FEATURE_BIT(    1, pCurLeaf->uEbx, SGX,        X86_CPUID_STEXT_FEATURE_EBX_SGX);
    31393154                    PORTABLE_DISABLE_FEATURE_BIT_CFG(1, pCurLeaf->uEbx, AVX2,       X86_CPUID_STEXT_FEATURE_EBX_AVX2, pConfig->enmAvx2);
    31403155                    PORTABLE_DISABLE_FEATURE_BIT(    1, pCurLeaf->uEbx, SMEP,       X86_CPUID_STEXT_FEATURE_EBX_SMEP);
    31413156                    PORTABLE_DISABLE_FEATURE_BIT(    1, pCurLeaf->uEbx, BMI2,       X86_CPUID_STEXT_FEATURE_EBX_BMI2);
    3142                     PORTABLE_DISABLE_FEATURE_BIT(    1, pCurLeaf->uEbx, INVPCID,    X86_CPUID_STEXT_FEATURE_EBX_INVPCID);
     3157                    PORTABLE_DISABLE_FEATURE_BIT_CFG(1, pCurLeaf->uEbx, INVPCID,    X86_CPUID_STEXT_FEATURE_EBX_INVPCID, pConfig->enmInvpcid);
    31433158                    PORTABLE_DISABLE_FEATURE_BIT(    1, pCurLeaf->uEbx, AVX512F,    X86_CPUID_STEXT_FEATURE_EBX_AVX512F);
    31443159                    PORTABLE_DISABLE_FEATURE_BIT_CFG(1, pCurLeaf->uEbx, RDSEED,     X86_CPUID_STEXT_FEATURE_EBX_RDSEED, pConfig->enmRdSeed);
     
    31533168
    31543169                /* Force standard feature bits. */
     3170                if (pConfig->enmFsGsBase == CPUMISAEXTCFG_ENABLED_ALWAYS)
     3171                    pCurLeaf->uEbx |= X86_CPUID_STEXT_FEATURE_EBX_FSGSBASE;
    31553172                if (pConfig->enmAvx2 == CPUMISAEXTCFG_ENABLED_ALWAYS)
    31563173                    pCurLeaf->uEbx |= X86_CPUID_STEXT_FEATURE_EBX_AVX2;
     
    31593176                if (pConfig->enmCLFlushOpt == CPUMISAEXTCFG_ENABLED_ALWAYS)
    31603177                    pCurLeaf->uEbx |= X86_CPUID_STEXT_FEATURE_EBX_CLFLUSHOPT;
     3178                if (pConfig->enmInvpcid == CPUMISAEXTCFG_ENABLED_ALWAYS)
     3179                    pCurLeaf->uEbx |= X86_CPUID_STEXT_FEATURE_EBX_INVPCID;
    31613180                break;
    31623181            }
     
    39253944                                  "|RDSEED"
    39263945                                  "|CLFLUSHOPT"
     3946                                  "|FSGSBASE"
     3947                                  "|PCID"
     3948                                  "|INVPCID"
    39273949                                  "|ABM"
    39283950                                  "|SSE4A"
     
    40604082     */
    40614083    rc = cpumR3CpuIdReadIsaExtCfg(pVM, pIsaExts, "CLFLUSHOPT", &pConfig->enmCLFlushOpt, fNestedPagingAndFullGuestExec);
     4084    AssertLogRelRCReturn(rc, rc);
     4085
     4086    /** @cfgm{/CPUM/IsaExts/FSGSBASE, isaextcfg, true}
     4087     * Whether to expose the read/write FSGSBASE instructions to the guest.
     4088     */
     4089    rc = cpumR3CpuIdReadIsaExtCfg(pVM, pIsaExts, "FSGSBASE", &pConfig->enmFsGsBase, true);
     4090    AssertLogRelRCReturn(rc, rc);
     4091
     4092    /** @cfgm{/CPUM/IsaExts/PCID, isaextcfg, true}
     4093     * Whether to expose the PCID feature to the guest.
     4094     */
     4095    rc = cpumR3CpuIdReadIsaExtCfg(pVM, pIsaExts, "PCID", &pConfig->enmPcid, true);
     4096    AssertLogRelRCReturn(rc, rc);
     4097
     4098    /** @cfgm{/CPUM/IsaExts/INVPCID, isaextcfg, true}
     4099     * Whether to expose the INVPCID instruction to the guest.
     4100     */
     4101    rc = cpumR3CpuIdReadIsaExtCfg(pVM, pIsaExts, "INVPCID", &pConfig->enmInvpcid, true);
    40624102    AssertLogRelRCReturn(rc, rc);
    40634103
     
    51975237        CPUID_RAW_FEATURE_IGN(Std, uEcx, X86_CPUID_FEATURE_ECX_PDCM);
    51985238        CPUID_RAW_FEATURE_RET(Std, uEcx, RT_BIT_32(16) /*reserved*/);
    5199         CPUID_RAW_FEATURE_IGN(Std, uEcx, X86_CPUID_FEATURE_ECX_PCID);
     5239        CPUID_RAW_FEATURE_RET(Std, uEcx, X86_CPUID_FEATURE_ECX_PCID);
    52005240        CPUID_RAW_FEATURE_IGN(Std, uEcx, X86_CPUID_FEATURE_ECX_DCA);
    52015241        CPUID_RAW_FEATURE_RET(Std, uEcx, X86_CPUID_FEATURE_ECX_SSE4_1);
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