VirtualBox

Changeset 46949 in vbox


Ignore:
Timestamp:
Jul 3, 2013 7:22:34 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
86957
Message:

Fixed incorrect 64-bit register handling in ParseFixedReg, affecting mov rXX,imm8/V.

Location:
trunk/src/VBox/Disassembler
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Disassembler/DisasmCore.cpp

    r45428 r46949  
    17071707            pParam->cb     = 4;
    17081708        }
    1709         else
    1710         if (pDis->uOpMode == DISCPUMODE_64BIT)
     1709        else if (pDis->uOpMode == DISCPUMODE_64BIT)
    17111710        {
    17121711            /* Use 64-bit registers. */
    17131712            pParam->Base.idxGenReg = pParam->fParam - OP_PARM_REG_GEN32_START;
    1714             if (    (pOp->fOpType & DISOPTYPE_REXB_EXTENDS_OPREG)
    1715                 &&  pParam == &pDis->Param1             /* ugly assumption that it only applies to the first parameter */
    1716                 &&  (pDis->fPrefix & DISPREFIX_REX)
    1717                 &&  (pDis->fRexPrefix & DISPREFIX_REX_FLAGS))
    1718                 pParam->Base.idxGenReg += 8;
    1719 
    17201713            pParam->fUse  |= DISUSE_REG_GEN64;
    17211714            pParam->cb     = 8;
     
    17291722            pParam->fParam = pParam->fParam - OP_PARM_REG_GEN32_START + OP_PARM_REG_GEN16_START;
    17301723        }
    1731     }
    1732     else
    1733     if (pParam->fParam <= OP_PARM_REG_SEG_END)
     1724
     1725        if (    (pOp->fOpType & DISOPTYPE_REXB_EXTENDS_OPREG)
     1726            &&  pParam == &pDis->Param1             /* ugly assumption that it only applies to the first parameter */
     1727            &&  (pDis->fPrefix & DISPREFIX_REX)
     1728            &&  (pDis->fRexPrefix & DISPREFIX_REX_FLAGS_B))
     1729        {
     1730            Assert(pDis->uCpuMode == DISCPUMODE_64BIT);
     1731            pParam->Base.idxGenReg += 8;
     1732        }
     1733    }
     1734    else if (pParam->fParam <= OP_PARM_REG_SEG_END)
    17341735    {
    17351736        /* Segment ES..GS registers. */
     
    17381739        pParam->cb     = 2;
    17391740    }
    1740     else
    1741     if (pParam->fParam <= OP_PARM_REG_GEN16_END)
     1741    else if (pParam->fParam <= OP_PARM_REG_GEN16_END)
    17421742    {
    17431743        /* 16-bit AX..DI registers. */
     
    17461746        pParam->cb     = 2;
    17471747    }
    1748     else
    1749     if (pParam->fParam <= OP_PARM_REG_GEN8_END)
     1748    else if (pParam->fParam <= OP_PARM_REG_GEN8_END)
    17501749    {
    17511750        /* 8-bit AL..DL, AH..DH registers. */
     
    17541753        pParam->cb     = 1;
    17551754
    1756         if (pDis->uOpMode == DISCPUMODE_64BIT)
     1755        if (   pDis->uCpuMode == DISCPUMODE_64BIT
     1756            && (pOp->fOpType & DISOPTYPE_REXB_EXTENDS_OPREG)
     1757            &&  pParam == &pDis->Param1             /* ugly assumption that it only applies to the first parameter */
     1758            &&  (pDis->fPrefix & DISPREFIX_REX))
    17571759        {
    1758             if (    (pOp->fOpType & DISOPTYPE_REXB_EXTENDS_OPREG)
    1759                 &&  pParam == &pDis->Param1             /* ugly assumption that it only applies to the first parameter */
    1760                 &&  (pDis->fPrefix & DISPREFIX_REX)
    1761                 &&  (pDis->fRexPrefix & DISPREFIX_REX_FLAGS))
     1760            if (pDis->fRexPrefix & DISPREFIX_REX_FLAGS_B)
    17621761                pParam->Base.idxGenReg += 8;              /* least significant byte of R8-R15 */
    1763         }
    1764     }
    1765     else
    1766     if (pParam->fParam <= OP_PARM_REG_FP_END)
     1762            else if (   pParam->Base.idxGenReg >= DISGREG_AH
     1763                     && pParam->Base.idxGenReg <= DISGREG_BH)
     1764                pParam->Base.idxGenReg += DISGREG_SPL - DISGREG_AH;
     1765        }
     1766    }
     1767    else if (pParam->fParam <= OP_PARM_REG_FP_END)
    17671768    {
    17681769        /* FPU registers. */
  • trunk/src/VBox/Disassembler/DisasmFormatYasm.cpp

    r46177 r46949  
    10941094                    }
    10951095
    1096                     case 'e': /* Register based on operand size (e.g. %eAX) (ParseFixedReg). */
     1096                    case 'e': /* Register based on operand size (e.g. %eAX, %eAH) (ParseFixedReg). */
    10971097                    {
    1098                         Assert(RT_C_IS_ALPHA(pszFmt[0]) && RT_C_IS_ALPHA(pszFmt[1]) && !RT_C_IS_ALPHA(pszFmt[2])); pszFmt += 2;
     1098                        Assert(RT_C_IS_ALPHA(pszFmt[0]) && RT_C_IS_ALPHA(pszFmt[1]) && !RT_C_IS_ALPHA(pszFmt[2]));
     1099                        pszFmt += 2;
    10991100                        size_t cchReg;
    11001101                        const char *pszReg = disasmFormatYasmBaseReg(pDis, pParam, &cchReg);
  • trunk/src/VBox/Disassembler/DisasmTablesX64.cpp

    r41690 r46949  
    263263
    264264    /* B */
    265     OP("mov AL,%Ib",         IDX_ParseFixedReg,  IDX_ParseImmByte,  0,          OP_MOV,     OP_PARM_REG_AL,     OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_REXB_EXTENDS_OPREG),
    266     OP("mov CL,%Ib",         IDX_ParseFixedReg,  IDX_ParseImmByte,  0,          OP_MOV,     OP_PARM_REG_CL,     OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_REXB_EXTENDS_OPREG),
    267     OP("mov DL,%Ib",         IDX_ParseFixedReg,  IDX_ParseImmByte,  0,          OP_MOV,     OP_PARM_REG_DL,     OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_REXB_EXTENDS_OPREG),
    268     OP("mov BL,%Ib",         IDX_ParseFixedReg,  IDX_ParseImmByte,  0,          OP_MOV,     OP_PARM_REG_BL,     OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_REXB_EXTENDS_OPREG),
    269     OP("mov AH,%Ib",         IDX_ParseFixedReg,  IDX_ParseImmByte,  0,          OP_MOV,     OP_PARM_REG_AH,     OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_REXB_EXTENDS_OPREG),
    270     OP("mov CH,%Ib",         IDX_ParseFixedReg,  IDX_ParseImmByte,  0,          OP_MOV,     OP_PARM_REG_CH,     OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_REXB_EXTENDS_OPREG),
    271     OP("mov DH,%Ib",         IDX_ParseFixedReg,  IDX_ParseImmByte,  0,          OP_MOV,     OP_PARM_REG_DH,     OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_REXB_EXTENDS_OPREG),
    272     OP("mov BH,%Ib",         IDX_ParseFixedReg,  IDX_ParseImmByte,  0,          OP_MOV,     OP_PARM_REG_BH,     OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_REXB_EXTENDS_OPREG),
     265    OP("mov %eAL,%Ib",       IDX_ParseFixedReg,  IDX_ParseImmByte,  0,          OP_MOV,     OP_PARM_REG_AL,     OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_REXB_EXTENDS_OPREG),
     266    OP("mov %eCL,%Ib",       IDX_ParseFixedReg,  IDX_ParseImmByte,  0,          OP_MOV,     OP_PARM_REG_CL,     OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_REXB_EXTENDS_OPREG),
     267    OP("mov %eDL,%Ib",       IDX_ParseFixedReg,  IDX_ParseImmByte,  0,          OP_MOV,     OP_PARM_REG_DL,     OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_REXB_EXTENDS_OPREG),
     268    OP("mov %eBL,%Ib",       IDX_ParseFixedReg,  IDX_ParseImmByte,  0,          OP_MOV,     OP_PARM_REG_BL,     OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_REXB_EXTENDS_OPREG),
     269    OP("mov %eAH,%Ib",       IDX_ParseFixedReg,  IDX_ParseImmByte,  0,          OP_MOV,     OP_PARM_REG_AH,     OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_REXB_EXTENDS_OPREG),
     270    OP("mov %eCH,%Ib",       IDX_ParseFixedReg,  IDX_ParseImmByte,  0,          OP_MOV,     OP_PARM_REG_CH,     OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_REXB_EXTENDS_OPREG),
     271    OP("mov %eDH,%Ib",       IDX_ParseFixedReg,  IDX_ParseImmByte,  0,          OP_MOV,     OP_PARM_REG_DH,     OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_REXB_EXTENDS_OPREG),
     272    OP("mov %eBH,%Ib",       IDX_ParseFixedReg,  IDX_ParseImmByte,  0,          OP_MOV,     OP_PARM_REG_BH,     OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_REXB_EXTENDS_OPREG),
    273273    OP("mov %eAX,%Iv",       IDX_ParseFixedReg,  IDX_ParseImmV,     0,          OP_MOV,     OP_PARM_REG_EAX,    OP_PARM_Iv,     OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_REXB_EXTENDS_OPREG),
    274274    OP("mov %eCX,%Iv",       IDX_ParseFixedReg,  IDX_ParseImmV,     0,          OP_MOV,     OP_PARM_REG_ECX,    OP_PARM_Iv,     OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_REXB_EXTENDS_OPREG),
  • trunk/src/VBox/Disassembler/testcase/Makefile.kmk

    r41868 r46949  
    4545        tstAsmFnstsw-1.asm \
    4646        tstAsmLock-1.asm \
     47        tstAsmMovFixedReg-1.asm \
    4748        tstAsmMovSeg-1.asm \
    4849        tstAsmMovzx-1.asm \
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