VirtualBox

Changeset 8999

Show
Ignore:
Timestamp:
05/21/08 10:48:11 (8 months ago)
Author:
vboxsync
Message:

Disassembler updates for 64 bits code

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/include/VBox/dis.h

    r8357 r8999  
    155155#define USE_IMMEDIATE32_REL             RT_BIT_64(24) 
    156156#define USE_IMMEDIATE64                 RT_BIT_64(25) 
    157 #define USE_IMMEDIATE_ADDR_0_32         RT_BIT_64(26) 
    158 #define USE_IMMEDIATE_ADDR_16_32        RT_BIT_64(27) 
    159 #define USE_IMMEDIATE_ADDR_0_16         RT_BIT_64(28) 
    160 #define USE_IMMEDIATE_ADDR_16_16        RT_BIT_64(29) 
     157#define USE_IMMEDIATE64_REL             RT_BIT_64(26) 
     158#define USE_IMMEDIATE_ADDR_0_32         RT_BIT_64(27) 
     159#define USE_IMMEDIATE_ADDR_16_32        RT_BIT_64(28) 
     160#define USE_IMMEDIATE_ADDR_0_16         RT_BIT_64(29) 
     161#define USE_IMMEDIATE_ADDR_16_16        RT_BIT_64(30) 
    161162/** DS:ESI */ 
    162 #define USE_POINTER_DS_BASED            RT_BIT_64(30
     163#define USE_POINTER_DS_BASED            RT_BIT_64(31
    163164/** ES:EDI */ 
    164 #define USE_POINTER_ES_BASED            RT_BIT_64(31
    165 #define USE_IMMEDIATE16_SX8             RT_BIT_64(32
    166 #define USE_IMMEDIATE32_SX8             RT_BIT_64(33
    167  
    168 #define USE_IMMEDIATE                   (USE_IMMEDIATE8|USE_IMMEDIATE16|USE_IMMEDIATE32|USE_IMMEDIATE64|USE_IMMEDIATE8_REL|USE_IMMEDIATE16_REL|USE_IMMEDIATE32_REL|USE_IMMEDIATE_ADDR_0_32|USE_IMMEDIATE_ADDR_16_32|USE_IMMEDIATE_ADDR_0_16|USE_IMMEDIATE_ADDR_16_16|USE_IMMEDIATE16_SX8|USE_IMMEDIATE32_SX8) 
     165#define USE_POINTER_ES_BASED            RT_BIT_64(32
     166#define USE_IMMEDIATE16_SX8             RT_BIT_64(33
     167#define USE_IMMEDIATE32_SX8             RT_BIT_64(34
     168 
     169#define USE_IMMEDIATE                   (USE_IMMEDIATE8|USE_IMMEDIATE16|USE_IMMEDIATE32|USE_IMMEDIATE64|USE_IMMEDIATE8_REL|USE_IMMEDIATE16_REL|USE_IMMEDIATE32_REL|USE_IMMEDIATE64_REL|USE_IMMEDIATE_ADDR_0_32|USE_IMMEDIATE_ADDR_16_32|USE_IMMEDIATE_ADDR_0_16|USE_IMMEDIATE_ADDR_16_16|USE_IMMEDIATE16_SX8|USE_IMMEDIATE32_SX8) 
    169170 
    170171/** @} */ 
  • 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 

© 2008 Sun Microsystems, Inc.
ContactPrivacy policy