VirtualBox

Changeset 107749 in vbox


Ignore:
Timestamp:
Jan 14, 2025 10:28:53 AM (2 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
166860
Message:

VMM/CPUM: Pass thru more MSR_IA32_SPEC_CTRL related stuff to the guest. jiraref:VBP-947

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/cpum.h

    r107729 r107749  
    470470    /** Supports IA32_SPEC_CTRL.STIBP. */
    471471    uint32_t        fStibp : 1;
     472    /** Supports IA32_SPEC_CTRL.SSBD. */
     473    uint32_t        fSsbd : 1;
     474    /** Supports IA32_SPEC_CTRL.PSFD. */
     475    uint32_t        fPsfd : 1;
     476    /** Supports IA32_SPEC_CTRL.IPRED_DIS_U/S. */
     477    uint32_t        fIpredCtrl : 1;
     478    /** Supports IA32_SPEC_CTRL.RRSBA_DIS_U/S. */
     479    uint32_t        fRrsbaCtrl : 1;
     480    /** Supports IA32_SPEC_CTRL.DDPD_DIS_U. */
     481    uint32_t        fDdpdU : 1;
     482    /** Supports IA32_SPEC_CTRL.BHI_S. */
     483    uint32_t        fBhiCtrl : 1;
    472484    /** Supports IA32_FLUSH_CMD. */
    473485    uint32_t        fFlushCmd : 1;
    474486    /** Supports IA32_ARCH_CAP. */
    475487    uint32_t        fArchCap : 1;
     488    /** Supports IA32_CORE_CAP. */
     489    uint32_t        fCoreCap : 1;
    476490    /** Supports MD_CLEAR functionality (VERW, IA32_FLUSH_CMD). */
    477491    uint32_t        fMdsClear : 1;
     492    /** Whether susceptible to MXCSR configuration dependent timing (MCDT) behaviour. */
     493    uint32_t        fMcdtNo : 1;
     494    /** Whether susceptible MONITOR/UMONITOR internal table capacity issues. */
     495    uint32_t        fMonitorMitgNo : 1;
     496    /** Supports the UC-lock disable feature. */
     497    uint32_t        fUcLockDis : 1;
    478498    /** Supports PCID. */
    479499    uint32_t        fPcid : 1;
     
    620640
    621641    /** Alignment padding / reserved for future use. */
    622     uint32_t        fPadding0 : 28;
     642    uint32_t        fPadding0 : 18;
    623643    uint32_t        auPadding[3];
    624644
  • trunk/src/VBox/VMM/VMMAll/CPUMAllCpuId.cpp

    r107731 r107749  
    15051505            pFeatures->fIbrs                = pFeatures->fIbpb;
    15061506            pFeatures->fStibp               = RT_BOOL(pSxfLeaf0->uEdx & X86_CPUID_STEXT_FEATURE_EDX_STIBP);
     1507            pFeatures->fSsbd                = RT_BOOL(pSxfLeaf0->uEdx & X86_CPUID_STEXT_FEATURE_EDX_SSBD);
    15071508            pFeatures->fFlushCmd            = RT_BOOL(pSxfLeaf0->uEdx & X86_CPUID_STEXT_FEATURE_EDX_FLUSH_CMD);
    15081509            pFeatures->fArchCap             = RT_BOOL(pSxfLeaf0->uEdx & X86_CPUID_STEXT_FEATURE_EDX_ARCHCAP);
     1510            pFeatures->fCoreCap             = RT_BOOL(pSxfLeaf0->uEdx & X86_CPUID_STEXT_FEATURE_EDX_CORECAP);
    15091511            pFeatures->fMdsClear            = RT_BOOL(pSxfLeaf0->uEdx & X86_CPUID_STEXT_FEATURE_EDX_MD_CLEAR);
     1512        }
     1513        PCCPUMCPUIDLEAF const pSxfLeaf2 = cpumCpuIdFindLeafEx(paLeaves, cLeaves, 7, 2);
     1514        if (pSxfLeaf2)
     1515        {
     1516            pFeatures->fPsfd                = RT_BOOL(pSxfLeaf2->uEdx & X86_CPUID_STEXT_FEATURE_2_EDX_PSFD);
     1517            pFeatures->fIpredCtrl           = RT_BOOL(pSxfLeaf2->uEdx & X86_CPUID_STEXT_FEATURE_2_EDX_IPRED_CTRL);
     1518            pFeatures->fRrsbaCtrl           = RT_BOOL(pSxfLeaf2->uEdx & X86_CPUID_STEXT_FEATURE_2_EDX_RRSBA_CTRL);
     1519            pFeatures->fDdpdU               = RT_BOOL(pSxfLeaf2->uEdx & X86_CPUID_STEXT_FEATURE_2_EDX_DDPD_U);
     1520            pFeatures->fBhiCtrl             = RT_BOOL(pSxfLeaf2->uEdx & X86_CPUID_STEXT_FEATURE_2_EDX_BHI_CTRL);
     1521            pFeatures->fMcdtNo              = RT_BOOL(pSxfLeaf2->uEdx & X86_CPUID_STEXT_FEATURE_2_EDX_MCDT_NO);
     1522            pFeatures->fUcLockDis           = RT_BOOL(pSxfLeaf2->uEdx & X86_CPUID_STEXT_FEATURE_2_EDX_UC_LOCK_DIS);
     1523            pFeatures->fMonitorMitgNo       = RT_BOOL(pSxfLeaf2->uEdx & X86_CPUID_STEXT_FEATURE_2_EDX_MONITOR_MITG_NO);
    15101524        }
    15111525
  • trunk/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp

    r107731 r107749  
    10661066    CPUMISAEXTCFG   enmFma;
    10671067    CPUMISAEXTCFG   enmF16c;
     1068    CPUMISAEXTCFG   enmMcdtNo;
     1069    CPUMISAEXTCFG   enmMonitorMitgNo;
    10681070
    10691071    CPUMISAEXTCFG   enmAbm;
     
    18601862            case 0:
    18611863            {
    1862                 pCurLeaf->uEax  = 0;    /* Max ECX input is 0. */
     1864                pCurLeaf->uEax  = RT_MIN(pCurLeaf->uEax, 2); /* Max ECX input is 2. */
    18631865                pCurLeaf->uEbx &= 0
    18641866                               | PASSTHRU_FEATURE(pConfig->enmFsGsBase, pHstFeat->fFsGsBase, X86_CPUID_STEXT_FEATURE_EBX_FSGSBASE)
     
    18991901                               ;
    19001902                pCurLeaf->uEdx &= 0
     1903                               //| X86_CPUID_STEXT_FEATURE_EDX_SRBDS_CTRL        RT_BIT(9)
    19011904                               | PASSTHRU_FEATURE(pConfig->enmMdsClear,   pHstFeat->fMdsClear, X86_CPUID_STEXT_FEATURE_EDX_MD_CLEAR)
     1905                               //| X86_CPUID_STEXT_FEATURE_EDX_TSX_FORCE_ABORT   RT_BIT_32(11)
     1906                               //| X86_CPUID_STEXT_FEATURE_EDX_CET_IBT           RT_BIT(20)
    19021907                               //| X86_CPUID_STEXT_FEATURE_EDX_IBRS_IBPB         RT_BIT(26)
    19031908                               //| X86_CPUID_STEXT_FEATURE_EDX_STIBP             RT_BIT(27)
    19041909                               | PASSTHRU_FEATURE(pConfig->enmFlushCmdMsr, pHstFeat->fFlushCmd, X86_CPUID_STEXT_FEATURE_EDX_FLUSH_CMD)
    19051910                               | PASSTHRU_FEATURE(pConfig->enmArchCapMsr,  pHstFeat->fArchCap,  X86_CPUID_STEXT_FEATURE_EDX_ARCHCAP)
     1911                               //| X86_CPUID_STEXT_FEATURE_EDX_CORECAP           RT_BIT_32(30)
     1912                               //| X86_CPUID_STEXT_FEATURE_EDX_SSBD              RT_BIT_32(31)
    19061913                               ;
    19071914
     
    19621969                if (pConfig->enmArchCapMsr == CPUMISAEXTCFG_ENABLED_ALWAYS)
    19631970                    pCurLeaf->uEdx |= X86_CPUID_STEXT_FEATURE_EDX_ARCHCAP;
     1971                break;
     1972            }
     1973
     1974            case 2:
     1975            {
     1976                pCurLeaf->uEax  = 0;
     1977                pCurLeaf->uEbx  = 0;
     1978                pCurLeaf->uEcx  = 0;
     1979                pCurLeaf->uEdx &= 0
     1980                               //| X86_CPUID_STEXT_FEATURE_2_EDX_PSFD              RT_BIT_32(0)
     1981                               //| X86_CPUID_STEXT_FEATURE_2_EDX_IPRED_CTRL        RT_BIT_32(1)
     1982                               //| X86_CPUID_STEXT_FEATURE_2_EDX_RRSBA_CTRL        RT_BIT_32(2)
     1983                               //| X86_CPUID_STEXT_FEATURE_2_EDX_DDPD_U            RT_BIT_32(3)
     1984                               //| X86_CPUID_STEXT_FEATURE_2_EDX_BHI_CTRL          RT_BIT_32(4)
     1985                               | PASSTHRU_FEATURE(pConfig->enmMcdtNo, pHstFeat->fMcdtNo, X86_CPUID_STEXT_FEATURE_2_EDX_MCDT_NO)
     1986                               //| X86_CPUID_STEXT_FEATURE_2_EDX_UC_LOCK_DIS       RT_BIT_32(6)
     1987                               //| Bit 7 - MONITOR_MITG_NO - No need for MONITOR/UMONITOR power mitigrations. */
     1988                               | PASSTHRU_FEATURE(pConfig->enmMonitorMitgNo, pHstFeat->fMonitorMitgNo, X86_CPUID_STEXT_FEATURE_2_EDX_MONITOR_MITG_NO)
     1989                               ;
     1990
     1991                /* Force standard feature bits. */
     1992                if (pConfig->enmMcdtNo == CPUMISAEXTCFG_ENABLED_ALWAYS)
     1993                    pCurLeaf->uEdx |= X86_CPUID_STEXT_FEATURE_2_EDX_MCDT_NO;
     1994                if (pConfig->enmMonitorMitgNo == CPUMISAEXTCFG_ENABLED_ALWAYS)
     1995                    pCurLeaf->uEdx |= X86_CPUID_STEXT_FEATURE_2_EDX_MONITOR_MITG_NO;
    19641996                break;
    19651997            }
     
    28642896                                  "|FMA"
    28652897                                  "|F16C"
     2898                                  "|McdtNo"
     2899                                  "|MonitorMitgNo"
    28662900                                  "|ABM"
    28672901                                  "|SSE4A"
     
    30713105    rc = cpumR3CpuIdReadIsaExtCfgEx(pVM, pIsaExts, "F16C", &pConfig->enmF16c, fNestedPagingAndFullGuestExec /* temporarily */,
    30723106                                    fMayHaveXSave && pConfig->enmXSave && (fXStateHostMask & XSAVE_C_YMM) /*fAllowed*/);
     3107    AssertLogRelRCReturn(rc, rc);
     3108
     3109    /** @cfgm{/CPUM/IsaExts/McdtNo, isaextcfg, true}
     3110     * Whether the CPU is not susceptible to the MXCSR configuration dependent
     3111     * timing (MCDT) behaviour.
     3112     */
     3113    rc = cpumR3CpuIdReadIsaExtCfg(pVM, pIsaExts, "McdtNo", &pConfig->enmMcdtNo, CPUMISAEXTCFG_ENABLED_SUPPORTED);
     3114    AssertLogRelRCReturn(rc, rc);
     3115
     3116    /** @cfgm{/CPUM/IsaExts/MonitorMitgNo, isaextcfg, true}
     3117     * Whether the CPU is not susceptible MONITOR/UMONITOR internal table capacity
     3118     * issues.
     3119     */
     3120    rc = cpumR3CpuIdReadIsaExtCfg(pVM, pIsaExts, "MonitorMitgNo", &pConfig->enmMonitorMitgNo, CPUMISAEXTCFG_ENABLED_SUPPORTED);
    30733121    AssertLogRelRCReturn(rc, rc);
    30743122
     
    39343982#endif
    39353983                {
     3984/** @todo make this more configurable? */
    39363985                    pLeaf->uEdx |= X86_CPUID_STEXT_FEATURE_EDX_IBRS_IBPB;
    39373986                    pVM->cpum.s.GuestFeatures.fIbrs = 1;
     
    39423991                        pLeaf->uEdx |= X86_CPUID_STEXT_FEATURE_EDX_STIBP;
    39433992                        pVM->cpum.s.GuestFeatures.fStibp = 1;
     3993                    }
     3994
     3995#ifdef RT_ARCH_AMD64
     3996                    if (pVM->cpum.s.HostFeatures.s.fSsbd)
     3997#endif
     3998                    {
     3999                        pLeaf->uEdx |= X86_CPUID_STEXT_FEATURE_EDX_SSBD;
     4000                        pVM->cpum.s.GuestFeatures.fSsbd = 1;
     4001                    }
     4002
     4003                    PCPUMCPUIDLEAF const pSubLeaf2 = cpumR3CpuIdGetExactLeaf(&pVM->cpum.s, UINT32_C(0x00000007), 2);
     4004                    if (pSubLeaf2)
     4005                    {
     4006#ifdef RT_ARCH_AMD64
     4007                        if (pVM->cpum.s.HostFeatures.s.fPsfd)
     4008#endif
     4009                        {
     4010                            pSubLeaf2->uEdx |= X86_CPUID_STEXT_FEATURE_2_EDX_PSFD;
     4011                            pVM->cpum.s.GuestFeatures.fPsfd = 1;
     4012                        }
     4013
     4014#ifdef RT_ARCH_AMD64
     4015                        if (pVM->cpum.s.HostFeatures.s.fIpredCtrl)
     4016#endif
     4017                        {
     4018                            pSubLeaf2->uEdx |= X86_CPUID_STEXT_FEATURE_2_EDX_IPRED_CTRL;
     4019                            pVM->cpum.s.GuestFeatures.fIpredCtrl = 1;
     4020                        }
     4021
     4022#ifdef RT_ARCH_AMD64
     4023                        if (pVM->cpum.s.HostFeatures.s.fRrsbaCtrl)
     4024#endif
     4025                        {
     4026                            pSubLeaf2->uEdx |= X86_CPUID_STEXT_FEATURE_2_EDX_RRSBA_CTRL;
     4027                            pVM->cpum.s.GuestFeatures.fRrsbaCtrl = 1;
     4028                        }
     4029
     4030#ifdef RT_ARCH_AMD64
     4031                        if (pVM->cpum.s.HostFeatures.s.fDdpdU)
     4032#endif
     4033                        {
     4034                            pSubLeaf2->uEdx |= X86_CPUID_STEXT_FEATURE_2_EDX_DDPD_U;
     4035                            pVM->cpum.s.GuestFeatures.fDdpdU = 1;
     4036                        }
     4037
     4038#ifdef RT_ARCH_AMD64
     4039                        if (pVM->cpum.s.HostFeatures.s.fBhiCtrl)
     4040#endif
     4041                        {
     4042                            pSubLeaf2->uEdx |= X86_CPUID_STEXT_FEATURE_2_EDX_BHI_CTRL;
     4043                            pVM->cpum.s.GuestFeatures.fBhiCtrl = 1;
     4044                        }
    39444045                    }
    39454046
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