VirtualBox

Changeset 40001 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Feb 5, 2012 9:30:40 PM (13 years ago)
Author:
vboxsync
Message:

IEM: Filled in some NOPs and PREFETCHes.

Location:
trunk/src/VBox/VMM/VMMAll
Files:
2 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,
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