VirtualBox

Ignore:
Timestamp:
Oct 31, 2014 5:44:19 PM (10 years ago)
Author:
vboxsync
Message:

DIS: #6249: Complex instructions support (like gather) and some fixes. VSIB fix.

File:
1 edited

Legend:

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

    r53155 r53172  
    709709    unsigned index = pDis->SIB.Bits.Index;
    710710
    711     unsigned regtype;
    712     if (pDis->uAddrMode == DISCPUMODE_32BIT)
    713         regtype    = DISUSE_REG_GEN32;
    714     else
    715         regtype    = DISUSE_REG_GEN64;
     711    unsigned regtype, vregtype;
     712    /* There's no way to distinguish between SIB and VSIB
     713     * and having special parameter to parse explicitly VSIB
     714     * is not an options since only one instruction (gather)
     715     * supports it currently. May be changed in the future. */
     716        if (pDis->uAddrMode == DISCPUMODE_32BIT)
     717            regtype    = DISUSE_REG_GEN32;
     718        else
     719            regtype    = DISUSE_REG_GEN64;
     720    if (pDis->pCurInstr->uOpcode == OP_GATHER)
     721        vregtype = (VEXREG_IS256B(pDis->bVexDestReg) ? DISUSE_REG_YMM : DISUSE_REG_XMM);
     722    else
     723        vregtype = regtype;
    716724
    717725    if (index != 4)
    718726    {
    719          pParam->fUse |= DISUSE_INDEX | regtype;
    720          pParam->Index.idxGenReg = index;
    721 
    722          if (scale != 0)
    723          {
    724              pParam->fUse  |= DISUSE_SCALE;
    725              pParam->uScale = (1<<scale);
    726          }
     727        pParam->fUse |= DISUSE_INDEX | vregtype;
     728        pParam->Index.idxGenReg = index;
     729
     730        if (scale != 0)
     731        {
     732            pParam->fUse  |= DISUSE_SCALE;
     733            pParam->uScale = (1<<scale);
     734        }
    727735    }
    728736
     
    24882496            pOpCode = g_aVexOpcodesMap[0] + pDis->bOpCode;
    24892497        break;
    2490         // OPSIZE 0x66 prefix
     2498        // 0x66 prefix
    24912499        case 1:
    24922500            pOpCode = g_aVexOpcodesMap_66H[0] + pDis->bOpCode;
    24932501
    2494             /* TODO: Check if we need to set this prefix */
    2495             pDis->fPrefix |= DISPREFIX_OPSIZE;
    2496             if (pDis->uCpuMode == DISCPUMODE_16BIT)
    2497                 pDis->uOpMode = DISCPUMODE_32BIT;
    2498             else
    2499                 pDis->uOpMode = DISCPUMODE_16BIT;  /* for 32 and 64 bits mode (there is no 32 bits operand size override prefix) */
    25002502        break;
    25012503
    2502         // REPE 0xF3 prefix
     2504        // 0xF3 prefix
    25032505        case 2:
    25042506            pOpCode = g_aVexOpcodesMap_F3H[0] + pDis->bOpCode;
    25052507        break;
    25062508
    2507         // REPNE 0xF2 prefix
     2509        // 0xF2 prefix
    25082510        case 3:
    25092511            pOpCode = g_aVexOpcodesMap_F2H[0] + pDis->bOpCode;
     
    25302532    uint8_t implOpcode = (byte1 & 0x1f);
    25312533
    2532     if (pDis->uCpuMode == DISCPUMODE_64BIT)
    2533     {
    2534         // REX.RXB
    2535         if (~(byte1 & 0xe0))
    2536         {
    2537             pDis->fRexPrefix = (byte1 >> 5) ^ 7;
    2538             if (pDis->fRexPrefix)
    2539                 pDis->fPrefix |= DISPREFIX_REX;
    2540         }
    2541 
    2542         // REX.W
    2543         if (!(byte2 & 0x80))
    2544         {
    2545             pDis->fRexPrefix |= DISPREFIX_REX_FLAGS_W;
    2546             if (pDis->fRexPrefix)
    2547                  pDis->fPrefix |= DISPREFIX_REX;
    2548         }
    2549     }
     2534    // REX.RXB
     2535    if (pDis->uCpuMode == DISCPUMODE_64BIT && ~(byte1 & 0xe0))
     2536        pDis->fRexPrefix |= (byte1 >> 5) ^ 7;
     2537
     2538    // VEX.W
     2539    pDis->bVexWFlag = !(byte2 & 0x80);
     2540
     2541    if (pDis->fRexPrefix)
     2542        pDis->fPrefix |= DISPREFIX_REX;
    25502543
    25512544    switch(byte2 & 3)
     
    25702563            }
    25712564        break;
    2572         // OPSIZE 0x66 prefix
     2565        // 0x66 prefix
    25732566        case 1:
    25742567            if (implOpcode >= 1 && implOpcode <= 3) // Other values are #UD.
     
    25772570                if (pOpCode != NULL)
    25782571                    pOpCode = &pOpCode[pDis->bOpCode];
    2579                 /* TODO: check if we need to set this prefix */
    2580                 pDis->fPrefix |= DISPREFIX_OPSIZE;
    2581                 if (pDis->uCpuMode == DISCPUMODE_16BIT)
    2582                     pDis->uOpMode = DISCPUMODE_32BIT;
    2583                 else
    2584                     pDis->uOpMode = DISCPUMODE_16BIT;  /* for 32 and 64 bits mode (there is no 32 bits operand size override prefix) */
    25852572            }
    25862573        break;
    25872574
    2588         // REPE 0xF3 prefix
     2575        // 0xF3 prefix
    25892576        case 2:
    25902577            if (implOpcode >= 1 && implOpcode <= 3) // Other values are #UD.
     
    26082595        break;
    26092596
    2610         // REPNE 0xF2 prefix
     2597        // 0xF2 prefix
    26112598        case 3:
    26122599            if (implOpcode >= 1 && implOpcode <= 3) // Other values are #UD.
     
    28242811
    28252812        /* Check if this is a VEX prefix. Not for 32-bit mode. */
    2826         if ((opcode == OP_LES || opcode == OP_LDS)
    2827             && (disReadByte(pDis, offInstr) & 0xc0) == 0xc0
    2828             && (opcode != OP_LES || pDis->uCpuMode == DISCPUMODE_64BIT || !(disReadByte(pDis, offInstr + 1) & 0x80)))
     2813        if (pDis->uCpuMode != DISCPUMODE_64BIT
     2814            && (opcode == OP_LES || opcode == OP_LDS)
     2815            && (disReadByte(pDis, offInstr) & 0xc0) == 0xc0)
    28292816        {
    28302817            paOneByteMap = g_aOneByteMapX64;
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