VirtualBox

Changeset 40001 in vbox


Ignore:
Timestamp:
Feb 5, 2012 9:30:40 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
76112
Message:

IEM: Filled in some NOPs and PREFETCHes.

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

Legend:

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

    r39971 r40001  
    208208 */
    209209#define IEM_IS_AMD_CPUID_FEATURE_PRESENT_ECX(a_fEcx)    iemRegIsAmdCpuIdFeaturePresent(pIemCpu, 0, (a_fEcx))
     210
     211/**
     212 * Tests if an AMD CPUID feature (extended) is marked present - EDX.
     213 */
     214#define IEM_IS_AMD_CPUID_FEATURE_PRESENT_EDX(a_fEdx)    iemRegIsAmdCpuIdFeaturePresent(pIemCpu, (a_fEdx), 0)
     215
     216/**
     217 * Tests if at least on of the specified AMD CPUID features (extended) are
     218 * marked present.
     219 */
     220#define IEM_IS_AMD_CPUID_FEATURES_ANY_PRESENT(a_fEdx, a_fEcx)   iemRegIsAmdCpuIdFeaturePresent(pIemCpu, (a_fEdx), (a_fEcx))
    210221
    211222/**
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r40000 r40001  
    942942/** Opcode 0x0f 0x0b. */
    943943FNIEMOP_STUB(iemOp_ud2);
     944
    944945/** Opcode 0x0f 0x0d. */
    945 FNIEMOP_STUB(iemOp_nop_Ev_prefetch);
     946FNIEMOP_DEF(iemOp_nop_Ev_GrpP)
     947{
     948    /* AMD prefetch group, Intel implements this as NOP Ev (and so do we). */
     949    if (!IEM_IS_AMD_CPUID_FEATURES_ANY_PRESENT(X86_CPUID_AMD_FEATURE_EDX_LONG_MODE | X86_CPUID_AMD_FEATURE_EDX_3DNOW,
     950                                               X86_CPUID_AMD_FEATURE_ECX_3DNOWPRF))
     951    {
     952        IEMOP_MNEMONIC("GrpP");
     953        return IEMOP_RAISE_INVALID_OPCODE();
     954    }
     955
     956    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     957    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     958    {
     959        IEMOP_MNEMONIC("GrpP");
     960        return IEMOP_RAISE_INVALID_OPCODE();
     961    }
     962
     963    IEMOP_HLP_NO_LOCK_PREFIX();
     964    switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
     965    {
     966        case 2: /* Aliased to /0 for the time being. */
     967        case 4: /* Aliased to /0 for the time being. */
     968        case 5: /* Aliased to /0 for the time being. */
     969        case 6: /* Aliased to /0 for the time being. */
     970        case 7: /* Aliased to /0 for the time being. */
     971        case 0: IEMOP_MNEMONIC("prefetch"); break;
     972        case 1: IEMOP_MNEMONIC("prefetchw "); break;
     973        case 3: IEMOP_MNEMONIC("prefetchw"); break;
     974        IEM_NOT_REACHED_DEFAULT_CASE_RET();
     975    }
     976
     977    IEM_MC_BEGIN(0, 1);
     978    IEM_MC_LOCAL(RTGCPTR,  GCPtrEffSrc);
     979    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm);
     980    /* Currently a NOP. */
     981    IEM_MC_ADVANCE_RIP();
     982    IEM_MC_END();
     983    return VINF_SUCCESS;
     984}
     985
     986
    946987/** Opcode 0x0f 0x0e. */
    947988FNIEMOP_STUB(iemOp_femms);
     
    9641005/** Opcode 0x0f 0x17. */
    9651006FNIEMOP_STUB(iemOp_movhps_Mq_Vq__movhpd_Mq_Vq);
     1007
     1008
    9661009/** Opcode 0x0f 0x18. */
    967 FNIEMOP_STUB(iemOp_prefetch_Grp16);
     1010FNIEMOP_DEF(iemOp_prefetch_Grp16)
     1011{
     1012    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     1013    if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
     1014    {
     1015        IEMOP_HLP_NO_LOCK_PREFIX();
     1016        switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
     1017        {
     1018            case 4: /* Aliased to /0 for the time being according to AMD. */
     1019            case 5: /* Aliased to /0 for the time being according to AMD. */
     1020            case 6: /* Aliased to /0 for the time being according to AMD. */
     1021            case 7: /* Aliased to /0 for the time being according to AMD. */
     1022            case 0: IEMOP_MNEMONIC("prefetchNTA m8"); break;
     1023            case 1: IEMOP_MNEMONIC("prefetchT0  m8"); break;
     1024            case 2: IEMOP_MNEMONIC("prefetchT1  m8"); break;
     1025            case 3: IEMOP_MNEMONIC("prefetchT2  m8"); break;
     1026            IEM_NOT_REACHED_DEFAULT_CASE_RET();
     1027        }
     1028
     1029        IEM_MC_BEGIN(0, 1);
     1030        IEM_MC_LOCAL(RTGCPTR,  GCPtrEffSrc);
     1031        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm);
     1032        /* Currently a NOP. */
     1033        IEM_MC_ADVANCE_RIP();
     1034        IEM_MC_END();
     1035        return VINF_SUCCESS;
     1036    }
     1037
     1038    return IEMOP_RAISE_INVALID_OPCODE();
     1039}
     1040
     1041
     1042/** Opcode 0x0f 0x19..0x1f. */
     1043FNIEMOP_DEF(iemOp_nop_Ev)
     1044{
     1045    IEMOP_HLP_NO_LOCK_PREFIX();
     1046    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     1047    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     1048    {
     1049        IEM_MC_BEGIN(0, 0);
     1050        IEM_MC_ADVANCE_RIP();
     1051        IEM_MC_END();
     1052    }
     1053    else
     1054    {
     1055        IEM_MC_BEGIN(0, 1);
     1056        IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
     1057        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm);
     1058        /* Currently a NOP. */
     1059        IEM_MC_ADVANCE_RIP();
     1060        IEM_MC_END();
     1061    }
     1062    return VINF_SUCCESS;
     1063}
    9681064
    9691065
     
    33643460
    33653461            default:
    3366                 IEMOP_RAISE_INVALID_OPCODE();
     3462                return IEMOP_RAISE_INVALID_OPCODE();
    33673463        }
    33683464    }
    3369 
    3370 
    3371 
    3372     if ((bRm & X86_MODRM_REG_MASK) != (0 << X86_MODRM_REG_SHIFT)) /* only mov Eb,Ib in this group. */
    3373         return IEMOP_RAISE_INVALID_LOCK_PREFIX();
    3374     IEMOP_MNEMONIC("mov Eb,Ib");
    3375 
    3376     if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    3377     {
    3378         /* register access */
    3379         uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
    3380         IEM_MC_BEGIN(0, 0);
    3381         IEM_MC_STORE_GREG_U8((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u8Imm);
    3382         IEM_MC_ADVANCE_RIP();
    3383         IEM_MC_END();
    3384     }
    3385     else
    3386     {
    3387         /* memory access. */
    3388         IEM_MC_BEGIN(0, 1);
    3389         IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    3390         IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm);
    3391         uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
    3392         IEM_MC_STORE_MEM_U8(pIemCpu->iEffSeg, GCPtrEffDst, u8Imm);
    3393         IEM_MC_ADVANCE_RIP();
    3394         IEM_MC_END();
    3395     }
    3396     return VINF_SUCCESS;
    33973465}
    33983466
     
    44474515    /* 0x04 */  iemOp_Invalid,          iemOp_syscall,          iemOp_clts,             iemOp_sysret,
    44484516    /* 0x08 */  iemOp_invd,             iemOp_wbinvd,           iemOp_Invalid,          iemOp_ud2,
    4449     /* 0x0c */  iemOp_Invalid,          iemOp_nop_Ev_prefetch,  iemOp_femms,            iemOp_3Dnow,
     4517    /* 0x0c */  iemOp_Invalid,          iemOp_nop_Ev_GrpP,      iemOp_femms,            iemOp_3Dnow,
    44504518    /* 0x10 */  iemOp_movups_Vps_Wps__movupd_Vpd_Wpd__movss_Vss_Wss__movsd_Vsd_Wsd,
    44514519    /* 0x11 */  iemOp_movups_Wps_Vps__movupd_Wpd_Vpd__movss_Wss_Vss__movsd_Vsd_Wsd,
     
    44564524    /* 0x16 */  iemOp_movhps_Vq_Mq__movlhps_Vq_Uq__movhpd_Vq_Mq__movshdup_Vq_Wq,
    44574525    /* 0x17 */  iemOp_movhps_Mq_Vq__movhpd_Mq_Vq,
    4458     /* 0x18 */  iemOp_prefetch_Grp16,   iemOp_Invalid,          iemOp_Invalid,          iemOp_Invalid,
    4459     /* 0x1c */  iemOp_Invalid,          iemOp_Invalid,          iemOp_Invalid,          iemOp_Invalid,
     4526    /* 0x18 */  iemOp_prefetch_Grp16,   iemOp_nop_Ev,           iemOp_nop_Ev,           iemOp_nop_Ev,
     4527    /* 0x1c */  iemOp_nop_Ev,           iemOp_nop_Ev,           iemOp_nop_Ev,           iemOp_nop_Ev,
    44604528    /* 0x20 */  iemOp_mov_Rd_Cd,        iemOp_mov_Rd_Dd,        iemOp_mov_Cd_Rd,        iemOp_mov_Dd_Rd,
    44614529    /* 0x24 */  iemOp_mov_Rd_Td,        iemOp_Invalid,          iemOp_mov_Td_Rd,        iemOp_Invalid,
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r39970 r40001  
    112112#define IEM_IS_REAL_MODE(a_pIemCpu)                         (g_fRandom)
    113113#define IEM_IS_AMD_CPUID_FEATURE_PRESENT_ECX(a_fEcx)        (g_fRandom)
     114#define IEM_IS_AMD_CPUID_FEATURE_PRESENT_EDX(a_fEdx)        (g_fRandom)
     115#define IEM_IS_AMD_CPUID_FEATURES_ANY_PRESENT(a_fEdx, a_fEcx) (g_fRandom)
    114116#define IEM_IS_INTEL_CPUID_FEATURE_PRESENT_EDX(a_fEdx)      (g_fRandom)
    115117
  • trunk/src/VBox/VMM/testcase/tstX86-1.cpp

    r39999 r40001  
    6969DECLASM(int32_t) x861_Test2(void);
    7070DECLASM(int32_t) x861_Test3(void);
     71DECLASM(int32_t) x861_Test4(void);
    7172
    7273
     
    227228            RTTestFailed(hTest, "x861_Test2 -> %d", rc);
    228229
    229 #endif
    230230        RTTestSub(hTest, "fxsave / fxrstor and #PFs");
    231231        rc = x861_Test3();
    232232        if (rc != 0)
    233233            RTTestFailed(hTest, "x861_Test3 -> %d", rc);
     234#endif
     235        RTTestSub(hTest, "Multibyte NOPs");
     236        rc = x861_Test4();
     237        if (rc != 0)
     238            RTTestFailed(hTest, "x861_Test4 -> %d", rc);
    234239    }
    235240
  • trunk/src/VBox/VMM/testcase/tstX86-1A.asm

    r39998 r40001  
    12191219
    12201220;;
     1221; Tests various multibyte NOP sequences.
     1222;
     1223BEGINPROC   x861_Test4
     1224        SAVE_ALL_PROLOGUE
     1225        call    x861_ClearRegisters
     1226
     1227        ; Intel recommended sequences.
     1228        nop
     1229        db 066h, 090h
     1230        db 00fh, 01fh, 000h
     1231        db 00fh, 01fh, 040h, 000h
     1232        db 00fh, 01fh, 044h, 000h, 000h
     1233        db 066h, 00fh, 01fh, 044h, 000h, 000h
     1234        db 00fh, 01fh, 080h, 000h, 000h, 000h, 000h
     1235        db 00fh, 01fh, 084h, 000h, 000h, 000h, 000h, 000h
     1236        db 066h, 00fh, 01fh, 084h, 000h, 000h, 000h, 000h, 000h
     1237
     1238        ; Check that the NOPs are allergic to lock prefixing.
     1239        ShouldTrap X86_XCPT_UD, db 0f0h, 090h               ; lock prefixed NOP.
     1240        ShouldTrap X86_XCPT_UD, db 0f0h, 066h, 090h         ; lock prefixed two byte NOP.
     1241        ShouldTrap X86_XCPT_UD, db 0f0h, 00fh, 01fh, 000h   ; lock prefixed three byte NOP.
     1242
     1243        ; Check the range of instructions that AMD marks as NOPs.
     1244%macro TST_NOP 1
     1245        db 00fh, %1, 000h
     1246        db 00fh, %1, 040h, 000h
     1247        db 00fh, %1, 044h, 000h, 000h
     1248        db 066h, 00fh, %1, 044h, 000h, 000h
     1249        db 00fh, %1, 080h, 000h, 000h, 000h, 000h
     1250        db 00fh, %1, 084h, 000h, 000h, 000h, 000h, 000h
     1251        db 066h, 00fh, %1, 084h, 000h, 000h, 000h, 000h, 000h
     1252        ShouldTrap X86_XCPT_UD, db 0f0h, 00fh, %1, 000h
     1253%endmacro
     1254        TST_NOP 019h
     1255        TST_NOP 01ah
     1256        TST_NOP 01bh
     1257        TST_NOP 01ch
     1258        TST_NOP 01dh
     1259        TST_NOP 01eh
     1260        TST_NOP 01fh
     1261
     1262        ; The AMD P group, intel marks this as a NOP.
     1263        TST_NOP 00dh
     1264
     1265.success:
     1266        xor     eax, eax
     1267.return:
     1268        SAVE_ALL_EPILOGUE
     1269        ret
     1270ENDPROC     x861_Test4
     1271
     1272;;
    12211273; Terminate the trap info array with a NIL entry.
    12221274BEGINDATA
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