VirtualBox

Ignore:
Timestamp:
Apr 14, 2015 6:35:43 AM (10 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
99536
Message:

CPUM,IEM: Expose GuestFeatures and HostFeatures (exploded CPUID), making IEM use it. Early XSAVE/AVX guest support preps.

File:
1 edited

Legend:

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

    r53423 r55229  
    13081308{
    13091309    /* AMD prefetch group, Intel implements this as NOP Ev (and so do we). */
    1310     if (!IEM_IS_AMD_CPUID_FEATURES_ANY_PRESENT(X86_CPUID_EXT_FEATURE_EDX_LONG_MODE | X86_CPUID_AMD_FEATURE_EDX_3DNOW,
    1311                                                X86_CPUID_AMD_FEATURE_ECX_3DNOWPRF))
     1310    if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->f3DNowPrefetch)
    13121311    {
    13131312        IEMOP_MNEMONIC("GrpP");
     
    14261425FNIEMOP_DEF(iemOp_3Dnow)
    14271426{
    1428     if (!IEM_IS_AMD_CPUID_FEATURE_PRESENT_EDX(X86_CPUID_AMD_FEATURE_EDX_3DNOW))
     1427    if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->f3DNow)
    14291428    {
    14301429        IEMOP_MNEMONIC("3Dnow");
     
    15561555    {
    15571556        /* The lock prefix can be used to encode CR8 accesses on some CPUs. */
    1558         if (!IEM_IS_AMD_CPUID_FEATURE_PRESENT_ECX(X86_CPUID_AMD_FEATURE_ECX_CR8L))
     1557        if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fMovCr8In32Bit)
    15591558            return IEMOP_RAISE_INVALID_OPCODE(); /* #UD takes precedence over #GP(), see test. */
    15601559        iCrReg |= 8;
     
    16021601    {
    16031602        /* The lock prefix can be used to encode CR8 accesses on some CPUs. */
    1604         if (!IEM_IS_AMD_CPUID_FEATURE_PRESENT_ECX(X86_CPUID_AMD_FEATURE_ECX_CR8L))
     1603        if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fMovCr8In32Bit)
    16051604            return IEMOP_RAISE_INVALID_OPCODE(); /* #UD takes precedence over #GP(), see test. */
    16061605        iCrReg |= 8;
     
    49244923{
    49254924    IEMOP_MNEMONIC("fxsave m512");
    4926     if (!IEM_IS_INTEL_CPUID_FEATURE_PRESENT_EDX(X86_CPUID_FEATURE_EDX_FXSR))
     4925    if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fFxSaveRstor)
    49274926        return IEMOP_RAISE_INVALID_OPCODE();
    49284927
     
    49444943{
    49454944    IEMOP_MNEMONIC("fxrstor m512");
    4946     if (!IEM_IS_INTEL_CPUID_FEATURE_PRESENT_EDX(X86_CPUID_FEATURE_EDX_FXSR))
     4945    if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fFxSaveRstor)
    49474946        return IEMOP_RAISE_INVALID_OPCODE();
    49484947
     
    49844983    IEMOP_MNEMONIC("lfence");
    49854984    IEMOP_HLP_NO_LOCK_PREFIX();
    4986     if (!IEM_IS_INTEL_CPUID_FEATURE_PRESENT_EDX(X86_CPUID_FEATURE_EDX_SSE2))
     4985    if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fSse2)
    49874986        return IEMOP_RAISE_INVALID_OPCODE();
    49884987
    49894988    IEM_MC_BEGIN(0, 0);
    4990     if (IEM_IS_INTEL_CPUID_FEATURE_PRESENT_EDX_ON_HOST(X86_CPUID_FEATURE_EDX_SSE2))
     4989    if (IEM_GET_HOST_CPU_FEATURES(pIemCpu)->fSse2)
    49914990        IEM_MC_CALL_VOID_AIMPL_0(iemAImpl_lfence);
    49924991    else
     
    50035002    IEMOP_MNEMONIC("mfence");
    50045003    IEMOP_HLP_NO_LOCK_PREFIX();
    5005     if (!IEM_IS_INTEL_CPUID_FEATURE_PRESENT_EDX(X86_CPUID_FEATURE_EDX_SSE2))
     5004    if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fSse2)
    50065005        return IEMOP_RAISE_INVALID_OPCODE();
    50075006
    50085007    IEM_MC_BEGIN(0, 0);
    5009     if (IEM_IS_INTEL_CPUID_FEATURE_PRESENT_EDX_ON_HOST(X86_CPUID_FEATURE_EDX_SSE2))
     5008    if (IEM_GET_HOST_CPU_FEATURES(pIemCpu)->fSse2)
    50105009        IEM_MC_CALL_VOID_AIMPL_0(iemAImpl_mfence);
    50115010    else
     
    50225021    IEMOP_MNEMONIC("sfence");
    50235022    IEMOP_HLP_NO_LOCK_PREFIX();
    5024     if (!IEM_IS_INTEL_CPUID_FEATURE_PRESENT_EDX(X86_CPUID_FEATURE_EDX_SSE2))
     5023    if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fSse2)
    50255024        return IEMOP_RAISE_INVALID_OPCODE();
    50265025
    50275026    IEM_MC_BEGIN(0, 0);
    5028     if (IEM_IS_INTEL_CPUID_FEATURE_PRESENT_EDX_ON_HOST(X86_CPUID_FEATURE_EDX_SSE2))
     5027    if (IEM_GET_HOST_CPU_FEATURES(pIemCpu)->fSse2)
    50295028        IEM_MC_CALL_VOID_AIMPL_0(iemAImpl_sfence);
    50305029    else
     
    1055110550    IEMOP_HLP_NO_LOCK_PREFIX();
    1055210551    if (   pIemCpu->enmCpuMode == IEMMODE_64BIT
    10553         && !IEM_IS_AMD_CPUID_FEATURE_PRESENT_ECX(X86_CPUID_EXT_FEATURE_ECX_LAHF_SAHF))
     10552        && !IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fLahfSahf)
    1055410553        return IEMOP_RAISE_INVALID_OPCODE();
    1055510554    IEM_MC_BEGIN(0, 2);
     
    1057510574    IEMOP_HLP_NO_LOCK_PREFIX();
    1057610575    if (   pIemCpu->enmCpuMode == IEMMODE_64BIT
    10577         && !IEM_IS_AMD_CPUID_FEATURE_PRESENT_ECX(X86_CPUID_EXT_FEATURE_ECX_LAHF_SAHF))
     10576        && !IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fLahfSahf)
    1057810577        return IEMOP_RAISE_INVALID_OPCODE();
    1057910578    IEM_MC_BEGIN(0, 1);
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