VirtualBox

Changeset 8999 in vbox for trunk/src/VBox


Ignore:
Timestamp:
May 21, 2008 8:48:11 AM (17 years ago)
Author:
vboxsync
Message:

Disassembler updates for 64 bits code

Location:
trunk/src/VBox/Disassembler
Files:
6 edited

Legend:

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

    r8987 r8999  
    112112    ParseEscFP,
    113113    ParseNopPause,
    114     ParseImmByteSX
     114    ParseImmByteSX,
     115    ParseImmZ
    115116};
    116117
     
    153154    ParseEscFP,
    154155    ParseNopPause,
    155     ParseImmByteSX_SizeOnly
     156    ParseImmByteSX_SizeOnly,
     157    ParseImmZ_SizeOnly
    156158};
    157159
     
    12271229    }
    12281230    else
     1231    if (pCpu->opmode == CPUMODE_64BIT)
     1232    {
     1233        pParam->parval = DISReadQWord(pCpu, lpszCodeBlock);
     1234        pParam->flags |= USE_IMMEDIATE64;
     1235
     1236        disasmAddStringF(pParam->szParam, sizeof(pParam->szParam), "0%VX64h", pParam->parval);
     1237        return sizeof(uint64_t);
     1238    }
     1239    else
    12291240    {
    12301241        pParam->parval = DISReadWord(pCpu, lpszCodeBlock);
     
    12411252    if (pCpu->opmode == CPUMODE_32BIT)
    12421253        return sizeof(uint32_t);
     1254    else
     1255    if (pCpu->opmode == CPUMODE_64BIT)
     1256        return sizeof(uint64_t);
     1257
    12431258    return sizeof(uint16_t);
    12441259}
     1260//*****************************************************************************
     1261//*****************************************************************************
     1262unsigned ParseImmZ(RTUINTPTR lpszCodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
     1263{
     1264    /* Word for 16-bit operand-size or doubleword for 32 or 64-bit operand-size. */
     1265    if (pCpu->opmode == CPUMODE_16BIT)
     1266    {
     1267        pParam->parval = DISReadWord(pCpu, lpszCodeBlock);
     1268        pParam->flags |= USE_IMMEDIATE16;
     1269
     1270        disasmAddStringF(pParam->szParam, sizeof(pParam->szParam), "0%04Xh", (uint32_t)pParam->parval);
     1271        return sizeof(uint16_t);
     1272    }
     1273    else
     1274    {
     1275        pParam->parval = DISReadDWord(pCpu, lpszCodeBlock);
     1276        pParam->flags |= USE_IMMEDIATE32;
     1277
     1278        disasmAddStringF(pParam->szParam, sizeof(pParam->szParam), "0%08Xh", (uint32_t)pParam->parval);
     1279        return sizeof(uint32_t);
     1280    }
     1281}
     1282//*****************************************************************************
     1283//*****************************************************************************
     1284unsigned ParseImmZ_SizeOnly(RTUINTPTR lpszCodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
     1285{
     1286    /* Word for 16-bit operand-size or doubleword for 32 or 64-bit operand-size. */
     1287    if (pCpu->opmode == CPUMODE_16BIT)
     1288        return sizeof(uint16_t);
     1289    return sizeof(uint32_t);
     1290}
     1291
    12451292//*****************************************************************************
    12461293// Relative displacement for branches (rel. to next instruction)
     
    12751322    }
    12761323    else
     1324    if (pCpu->opmode == CPUMODE_64BIT)
     1325    {
     1326        pParam->parval = DISReadQWord(pCpu, lpszCodeBlock);
     1327        pParam->flags |= USE_IMMEDIATE64_REL;
     1328
     1329        disasmAddStringF(pParam->szParam, sizeof(pParam->szParam), " (0%VX64h)", pParam->parval);
     1330        return sizeof(int64_t);
     1331    }
     1332    else
    12771333    {
    12781334        pParam->parval = DISReadWord(pCpu, lpszCodeBlock);
     
    12901346    if (pCpu->opmode == CPUMODE_32BIT)
    12911347        return sizeof(int32_t);
     1348    else
     1349    if (pCpu->opmode == CPUMODE_64BIT)
     1350        return sizeof(int64_t);
    12921351    return sizeof(uint16_t);
    12931352}
  • trunk/src/VBox/Disassembler/DisasmInternal.h

    r8936 r8999  
    6969#define IDX_ParseNopPause           35
    7070#define IDX_ParseImmByteSX          36
    71 #define IDX_ParseMax                (IDX_ParseImmByteSX+1)
     71#define IDX_ParseImmZ               37
     72#define IDX_ParseMax                (IDX_ParseImmZ+1)
    7273
    7374#ifdef IN_RING0
     
    104105unsigned ParseImmVRel(RTUINTPTR pu8CodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu);
    105106unsigned ParseImmVRel_SizeOnly(RTUINTPTR pu8CodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu);
     107unsigned ParseImmZ(RTUINTPTR pu8CodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu);
     108unsigned ParseImmZ_SizeOnly(RTUINTPTR pu8CodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu);
    106109
    107110unsigned ParseImmAddr(RTUINTPTR pu8CodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu);
  • trunk/src/VBox/Disassembler/DisasmTables.cpp

    r8361 r8999  
    309309    OP("les %Gv,%Mp",        IDX_ParseModRM,     IDX_UseModRM,      0,          OP_LES,         OP_PARM_Gv,      OP_PARM_Mp,     OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_INVALID_64),
    310310    OP("lds %Gv,%Mp",        IDX_ParseModRM,     IDX_UseModRM,      0,          OP_LDS,         OP_PARM_Gv,      OP_PARM_Mp,     OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_RRM_DANGEROUS | OPTYPE_INVALID_64),
    311     /* @todo these two are groups */
     311    /* @todo these two are actually group11 */
    312312    OP("mov %Eb,%Ib",        IDX_ParseModRM,     IDX_ParseImmByte,  0,          OP_MOV,         OP_PARM_Eb,      OP_PARM_Ib,     OP_PARM_NONE,   OPTYPE_HARMLESS),
    313     OP("mov %Ev,%Iv",        IDX_ParseModRM,     IDX_ParseImmV,     0,          OP_MOV,         OP_PARM_Ev,      OP_PARM_Iv,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     313    OP("mov %Ev,%Iz",        IDX_ParseModRM,     IDX_ParseImmZ,     0,          OP_MOV,         OP_PARM_Ev,      OP_PARM_Iz,     OP_PARM_NONE,   OPTYPE_HARMLESS),
    314314    OP("enter %Iw,%Ib",      IDX_ParseImmUshort, IDX_ParseImmByte,  0,          OP_ENTER,       OP_PARM_Iw,      OP_PARM_Ib,     OP_PARM_NONE,   OPTYPE_HARMLESS),
    315315    OP("leave",              0,                  0,                 0,          OP_LEAVE,       OP_PARM_NONE,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE),
     
    22952295    INVALID_OPCODE,
    22962296    /* 0F C7 */
    2297     OP("mov %Ev,%Iv",        IDX_ParseModRM,     IDX_ParseImmV,      0,          OP_MOV,     OP_PARM_Ev,         OP_PARM_Iz ,    OP_PARM_NONE,   OPTYPE_HARMLESS),
     2297    OP("mov %Ev,%Iz",        IDX_ParseModRM,     IDX_ParseImmZ,      0,          OP_MOV,     OP_PARM_Ev,         OP_PARM_Iz ,    OP_PARM_NONE,   OPTYPE_HARMLESS),
    22982298    INVALID_OPCODE,
    22992299    INVALID_OPCODE,
  • trunk/src/VBox/Disassembler/DisasmTablesX64.cpp

    r8361 r8999  
    309309    INVALID_OPCODE,
    310310    INVALID_OPCODE,
     311    /* @todo these two are actually group11 */
    311312    OP("mov %Eb,%Ib",        IDX_ParseModRM,     IDX_ParseImmByte,  0,          OP_MOV,         OP_PARM_Eb,      OP_PARM_Ib,     OP_PARM_NONE,   OPTYPE_HARMLESS),
    312     OP("mov %Ev,%Iv",        IDX_ParseModRM,     IDX_ParseImmV,     0,          OP_MOV,         OP_PARM_Ev,      OP_PARM_Iv,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     313    OP("mov %Ev,%Iz",        IDX_ParseModRM,     IDX_ParseImmZ,     0,          OP_MOV,         OP_PARM_Ev,      OP_PARM_Iz,     OP_PARM_NONE,   OPTYPE_HARMLESS),
    313314    OP("enter %Iw,%Ib",      IDX_ParseImmUshort, IDX_ParseImmByte,  0,          OP_ENTER,       OP_PARM_Iw,      OP_PARM_Ib,     OP_PARM_NONE,   OPTYPE_HARMLESS),
    314315    OP("leave",              0,                  0,                 0,          OP_LEAVE,       OP_PARM_NONE,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE),
  • trunk/src/VBox/Disassembler/DisasmTest.cpp

    r8491 r8999  
    7777            memset(&cpu, 0, sizeof(cpu));
    7878            cpu.mode = CPUMODE_64BIT;
    79 //__debugbreak();
     79__debugbreak();
    8080            if (VBOX_SUCCESS(DISInstr(&cpu, pInstr, 0, &cb, szOutput)))
    8181                printf(szOutput);
  • trunk/src/VBox/Disassembler/DisasmTestA.asm

    r8491 r8999  
    7070align 16
    7171BEGINPROC TestProc64
     72      ;incorrectly assembled by yasm; REX.W should not be added!
     73      ;test rax, dword 0cc90cc90h
     74      mov rax, dword 0cc90cc90h
     75      mov rax, qword 0ffffcc90cc90h
     76
    7277      movzx rax,byte  [edx]
    7378      movzx rax,word  [edx]
     
    9196      movss xmm0, xmm14
    9297      movsd xmm6, xmm1
     98
    9399      ret
    94100ENDPROC   TestProc64
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