VirtualBox

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


Ignore:
Timestamp:
Jul 25, 2013 10:04:31 PM (12 years ago)
Author:
vboxsync
Message:

IEM: Started introducing some disassembler details in the decoder that can later be used for instruction statistics and building heuristics.

Location:
trunk/src/VBox/VMM/VMMAll
Files:
2 edited

Legend:

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

    r47411 r47413  
    103103#include <VBox/err.h>
    104104#include <VBox/param.h>
     105#include <VBox/dis.h>
     106#include <VBox/disopcode.h>
    105107#include <iprt/assert.h>
    106108#include <iprt/string.h>
    107109#include <iprt/x86.h>
     110
    108111
    109112
     
    77757778        if (pIemCpu->fPrefixes & IEM_OP_PRF_LOCK) \
    77767779            return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
     7780    } while (0)
     7781#define IEMOP_HLP_DECODED_NL_1(a_uDisOpNo, a_fIemOpFlags, a_uDisParam0, a_fDisOpType) \
     7782    do \
     7783    { \
     7784        if (pIemCpu->fPrefixes & IEM_OP_PRF_LOCK) \
     7785        { \
     7786            NOREF(a_uDisOpNo); NOREF(a_fIemOpFlags); NOREF(a_uDisParam0); NOREF(a_fDisOpType); \
     7787            return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
     7788        } \
     7789    } while (0)
     7790#define IEMOP_HLP_DECODED_NL_2(a_uDisOpNo, a_fIemOpFlags, a_uDisParam0, a_uDisParam1, a_fDisOpType) \
     7791    do \
     7792    { \
     7793        if (pIemCpu->fPrefixes & IEM_OP_PRF_LOCK) \
     7794        { \
     7795            NOREF(a_uDisOpNo); NOREF(a_fIemOpFlags); NOREF(a_uDisParam0); NOREF(a_uDisParam1); NOREF(a_fDisOpType); \
     7796            return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
     7797        } \
    77777798    } while (0)
    77787799
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r47411 r47413  
    545545    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    546546    {
    547         IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     547        IEMOP_HLP_DECODED_NL_1(OP_SLDT, IEMOPFORM_M_REG, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
    548548        switch (pIemCpu->enmEffOpSize)
    549549        {
     
    584584        IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    585585        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    586         IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     586        IEMOP_HLP_DECODED_NL_1(OP_SLDT, IEMOPFORM_M_MEM, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
    587587        IEM_MC_FETCH_LDTR_U16(u16Ldtr);
    588588        IEM_MC_STORE_MEM_U16(pIemCpu->iEffSeg, GCPtrEffDst, u16Ldtr);
     
    602602    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    603603    {
    604         IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     604        IEMOP_HLP_DECODED_NL_1(OP_STR, IEMOPFORM_M_REG, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
    605605        switch (pIemCpu->enmEffOpSize)
    606606        {
     
    641641        IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    642642        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    643         IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     643        IEMOP_HLP_DECODED_NL_1(OP_STR, IEMOPFORM_M_MEM, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
    644644        IEM_MC_FETCH_TR_U16(u16Tr);
    645645        IEM_MC_STORE_MEM_U16(pIemCpu->iEffSeg, GCPtrEffDst, u16Tr);
     
    659659    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    660660    {
    661         IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     661        IEMOP_HLP_DECODED_NL_1(OP_LLDT, IEMOPFORM_M_REG, OP_PARM_Ew, DISOPTYPE_DANGEROUS);
    662662        IEM_MC_BEGIN(1, 0);
    663663        IEM_MC_ARG(uint16_t, u16Sel, 0);
     
    673673        IEM_MC_RAISE_GP0_IF_CPL_NOT_ZERO();
    674674        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    675         IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     675        IEMOP_HLP_DECODED_NL_1(OP_LLDT, IEMOPFORM_M_MEM, OP_PARM_Ew, DISOPTYPE_DANGEROUS);
    676676        IEM_MC_FETCH_MEM_U16(u16Sel, pIemCpu->iEffSeg, GCPtrEffSrc);
    677677        IEM_MC_CALL_CIMPL_1(iemCImpl_lldt, u16Sel);
     
    63116311    {
    63126312        case IEM_OP_PRF_SIZE_OP: /* SSE */
    6313             IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     6313            IEMOP_MNEMONIC("pmovmskb Gd,Nq");
     6314            IEMOP_HLP_DECODED_NL_2(OP_PMOVMSKB, IEMOPFORM_RM_REG, OP_PARM_Gd, OP_PARM_Vdq, DISOPTYPE_SSE | DISOPTYPE_HARMLESS);
    63146315            IEM_MC_BEGIN(2, 0);
    63156316            IEM_MC_ARG(uint64_t *,           pDst, 0);
     
    63246325
    63256326        case 0: /* MMX */
    6326             IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     6327            IEMOP_MNEMONIC("pmovmskb Gd,Udq");
     6328            IEMOP_HLP_DECODED_NL_2(OP_PMOVMSKB, IEMOPFORM_RM_REG, OP_PARM_Gd, OP_PARM_Vdq, DISOPTYPE_MMX | DISOPTYPE_HARMLESS);
    63276329            IEM_MC_BEGIN(2, 0);
    63286330            IEM_MC_ARG(uint64_t *,          pDst, 0);
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