VirtualBox

Changeset 8352

Show
Ignore:
Timestamp:
04/24/08 11:50:26 (9 months ago)
Author:
vboxsync
Message:

More 64 bits disasm updates

Files:

Legend:

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

    r8336 r8352  
    146146#define USE_DISPLACEMENT32              RT_BIT_64(16) 
    147147#define USE_DISPLACEMENT64              RT_BIT_64(17) 
    148 #define USE_IMMEDIATE8                  RT_BIT_64(18) 
    149 #define USE_IMMEDIATE8_REL              RT_BIT_64(19) 
    150 #define USE_IMMEDIATE16                 RT_BIT_64(20) 
    151 #define USE_IMMEDIATE16_REL             RT_BIT_64(21) 
    152 #define USE_IMMEDIATE32                 RT_BIT_64(22) 
    153 #define USE_IMMEDIATE32_REL             RT_BIT_64(23) 
    154 #define USE_IMMEDIATE64                 RT_BIT_64(24) 
    155 #define USE_IMMEDIATE_ADDR_0_32         RT_BIT_64(25) 
    156 #define USE_IMMEDIATE_ADDR_16_32        RT_BIT_64(26) 
    157 #define USE_IMMEDIATE_ADDR_0_16         RT_BIT_64(27) 
    158 #define USE_IMMEDIATE_ADDR_16_16        RT_BIT_64(28) 
     148#define USE_RIPDISPLACEMENT32           RT_BIT_64(18) 
     149#define USE_IMMEDIATE8                  RT_BIT_64(19) 
     150#define USE_IMMEDIATE8_REL              RT_BIT_64(20) 
     151#define USE_IMMEDIATE16                 RT_BIT_64(21) 
     152#define USE_IMMEDIATE16_REL             RT_BIT_64(22) 
     153#define USE_IMMEDIATE32                 RT_BIT_64(23) 
     154#define USE_IMMEDIATE32_REL             RT_BIT_64(24) 
     155#define USE_IMMEDIATE64                 RT_BIT_64(25) 
     156#define USE_IMMEDIATE_ADDR_0_32         RT_BIT_64(26) 
     157#define USE_IMMEDIATE_ADDR_16_32        RT_BIT_64(27) 
     158#define USE_IMMEDIATE_ADDR_0_16         RT_BIT_64(28) 
     159#define USE_IMMEDIATE_ADDR_16_16        RT_BIT_64(29) 
    159160/** DS:ESI */ 
    160 #define USE_POINTER_DS_BASED            RT_BIT_64(29
     161#define USE_POINTER_DS_BASED            RT_BIT_64(30
    161162/** ES:EDI */ 
    162 #define USE_POINTER_ES_BASED            RT_BIT_64(30
    163 #define USE_IMMEDIATE16_SX8             RT_BIT_64(31
    164 #define USE_IMMEDIATE32_SX8             RT_BIT_64(32
     163#define USE_POINTER_ES_BASED            RT_BIT_64(31
     164#define USE_IMMEDIATE16_SX8             RT_BIT_64(32
     165#define USE_IMMEDIATE32_SX8             RT_BIT_64(33
    165166 
    166167#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) 
  • trunk/src/VBox/Disassembler/DisasmCore.cpp

    r8336 r8352  
    270270        { 
    271271            pCpu->lastprefix = opcode; 
     272 
     273            /* The REX prefix must precede the opcode byte(s). Any other placement is ignored. */ 
     274            if (opcode != OP_REX) 
     275                pCpu->prefix &= ~PREFIX_REX; 
     276 
    272277            switch (opcode) 
    273278            { 
     
    324329                pCpu->prefix    |= PREFIX_REX; 
    325330                pCpu->prefix_rex = PREFIX_REX_OP_2_FLAGS(opcode); 
     331 
     332                if (pCpu->prefix_rex & PREFIX_REX_FLAGS_W) 
     333                    pCpu->opmode = CPUMODE_64BIT;  /* overrides size prefix byte */ 
    326334                break; 
    327335            } 
     
    537545    if (pCpu->prefix & PREFIX_REX) 
    538546    { 
    539         pCpu->SIB.Bits.Base  |= ((!!(pCpu->prefix_rex & PREFIX_REX_FLAGS_B)) << 3); 
     547        /* REX.B extends the Base field if not scaled index + disp32 */ 
     548        if (!(pCpu->SIB.Bits.Base == 5 && pCpu->ModRM.Bits.Mod == 0)) 
     549            pCpu->SIB.Bits.Base  |= ((!!(pCpu->prefix_rex & PREFIX_REX_FLAGS_B)) << 3); 
     550 
    540551        pCpu->SIB.Bits.Index |= ((!!(pCpu->prefix_rex & PREFIX_REX_FLAGS_X)) << 3); 
    541552    } 
     
    651662    } 
    652663 
    653     //TODO: bound 
    654  
    655     if (pCpu->addrmode == CPUMODE_32BIT) 
    656     {//32 bits addressing mode 
     664    /* @todo bound */ 
     665 
     666    if (pCpu->addrmode != CPUMODE_16BIT) 
     667    { 
     668        Assert(pCpu->addrmode == CPUMODE_32BIT || pCpu->addrmode == CPUMODE_64BIT); 
     669 
     670        /* 
     671         * Note: displacements in long mode are 8 or 32 bits and sign-extended to 64 bits 
     672         */ 
    657673        switch (mod) 
    658674        { 
     
    660676            disasmGetPtrString(pCpu, pOp, pParam); 
    661677            disasmAddChar(pParam->szParam, '['); 
    662             if (rm == 4) {//SIB byte follows ModRM 
     678            if (rm == 4)  
     679            {   /* SIB byte follows ModRM */ 
    663680                UseSIB(lpszCodeBlock, pOp, pParam, pCpu); 
    664681            } 
    665682            else 
    666             if (rm == 5) {//32 bits displacement 
    667                 pParam->flags |= USE_DISPLACEMENT32; 
    668                 pParam->disp32 = pCpu->disp; 
    669                 disasmPrintDisp32(pParam); 
     683            if (rm == 5)  
     684            { 
     685                /* 32 bits displacement */ 
     686                if (pCpu->mode == CPUMODE_32BIT) 
     687                { 
     688                    pParam->flags |= USE_DISPLACEMENT32; 
     689                    pParam->disp32 = pCpu->disp; 
     690                    disasmPrintDisp32(pParam); 
     691                } 
     692                else 
     693                { 
     694                    pParam->flags |= USE_RIPDISPLACEMENT32; 
     695                    pParam->disp32 = pCpu->disp; 
     696                    disasmAddStringF(pParam->szParam, sizeof(pParam->szParam), "RIP+"); 
     697                    disasmPrintDisp32(pParam); 
     698                } 
    670699            } 
    671700            else {//register address 
     
    967996    if (pCpu->prefix & PREFIX_REX) 
    968997    { 
     998        Assert(pCpu->mode == CPUMODE_64BIT); 
     999 
    9691000        /* REX.R extends the Reg field. */ 
    9701001        pCpu->ModRM.Bits.Reg |= ((!!(pCpu->prefix_rex & PREFIX_REX_FLAGS_R)) << 3); 
    9711002 
    972         /* REX.B extends the Rm field if there is no SIB byte. */ 
    973         if (    pCpu->ModRM.Bits.Mod != 3  
    974             &&  pCpu->ModRM.Bits.Rm == 4) 
     1003        /* REX.B extends the Rm field if there is no SIB byte nor a 32 bits displacement */ 
     1004        if (!(    pCpu->ModRM.Bits.Mod != 3  
     1005              &&  pCpu->ModRM.Bits.Rm  == 4) 
     1006            && 
     1007            !(    pCpu->ModRM.Bits.Mod == 0 
     1008              &&  pCpu->ModRM.Bits.Rm  == 5)) 
    9751009        { 
    9761010            pCpu->ModRM.Bits.Rm |= ((!!(pCpu->prefix_rex & PREFIX_REX_FLAGS_B)) << 3); 
     
    9811015 
    9821016    UseModRM(lpszCodeBlock, pOp, pParam, pCpu); 
    983  
    9841017    return size; 
    9851018} 
     
    10001033    if (pCpu->prefix & PREFIX_REX) 
    10011034    { 
     1035        Assert(pCpu->mode == CPUMODE_64BIT); 
     1036 
    10021037        /* REX.R extends the Reg field. */ 
    10031038        pCpu->ModRM.Bits.Reg |= ((!!(pCpu->prefix_rex & PREFIX_REX_FLAGS_R)) << 3); 
    10041039 
    1005         /* REX.B extends the Rm field if there is no SIB byte. */ 
    1006         if (    pCpu->ModRM.Bits.Mod != 3  
    1007             &&  pCpu->ModRM.Bits.Rm == 4) 
     1040        /* REX.B extends the Rm field if there is no SIB byte nor a 32 bits displacement */ 
     1041        if (!(    pCpu->ModRM.Bits.Mod != 3  
     1042              &&  pCpu->ModRM.Bits.Rm  == 4) 
     1043            && 
     1044            !(    pCpu->ModRM.Bits.Mod == 0 
     1045              &&  pCpu->ModRM.Bits.Rm  == 5)) 
    10081046        { 
    10091047            pCpu->ModRM.Bits.Rm |= ((!!(pCpu->prefix_rex & PREFIX_REX_FLAGS_B)) << 3); 
     
    13051343    } 
    13061344 
     1345    AssertCompile(OP_PARM_REG_GEN32_END < OP_PARM_REG_SEG_END); 
     1346    AssertCompile(OP_PARM_REG_SEG_END < OP_PARM_REG_GEN16_END); 
     1347    AssertCompile(OP_PARM_REG_GEN16_END < OP_PARM_REG_GEN8_END); 
     1348    AssertCompile(OP_PARM_REG_GEN8_END < OP_PARM_REG_FP_END); 
     1349 
    13071350    if (pParam->param <= OP_PARM_REG_GEN32_END) 
    13081351    { 
    13091352        /* 32-bit EAX..EDI registers. */ 
    1310  
    13111353        if (pCpu->opmode == CPUMODE_32BIT) 
    13121354        { 
     
    13691411        pParam->size   = 10; 
    13701412    } 
     1413    Assert(!(pParam->param >= OP_PARM_REG_GEN64_START && pParam->param <= OP_PARM_REG_GEN64_END)); 
     1414 
    13711415    /* else - not supported for now registers. */ 
    13721416 
     
    19361980    else 
    19371981    if (subtype == OP_PARM_v || subtype == OP_PARM_NONE) 
    1938         subtype = (pCpu->opmode == CPUMODE_32BIT) ? OP_PARM_d : OP_PARM_w; 
     1982    { 
     1983        switch(pCpu->opmode) 
     1984        { 
     1985        case CPUMODE_32BIT: 
     1986            subtype = OP_PARM_d; 
     1987            break; 
     1988        case CPUMODE_64BIT: 
     1989            subtype = OP_PARM_q; 
     1990            break; 
     1991        case CPUMODE_16BIT: 
     1992            subtype = OP_PARM_w; 
     1993            break; 
     1994        } 
     1995    } 
    19391996 
    19401997    switch (subtype) 
     
    19552012        disasmAddString(pParam->szParam, szModRMReg32[idx]); 
    19562013        pParam->flags |= USE_REG_GEN32; 
     2014        pParam->base.reg_gen = idx; 
     2015        break; 
     2016 
     2017    case OP_PARM_q: 
     2018        disasmAddString(pParam->szParam, szModRMReg64[idx]); 
     2019        pParam->flags |= USE_REG_GEN64; 
    19572020        pParam->base.reg_gen = idx; 
    19582021        break; 
  • trunk/src/VBox/Disassembler/DisasmTablesX64.cpp

    r8299 r8352  
    174174 
    175175    /* 5 */ 
    176     OP("push %eAX",          IDX_ParseFixedReg,  0,          0,          OP_PUSH,    OP_PARM_REG_RAX,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
    177     OP("push %eCX",          IDX_ParseFixedReg,  0,          0,          OP_PUSH,    OP_PARM_REG_RCX,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
    178     OP("push %eDX",          IDX_ParseFixedReg,  0,          0,          OP_PUSH,    OP_PARM_REG_RDX,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
    179     OP("push %eBX",          IDX_ParseFixedReg,  0,          0,          OP_PUSH,    OP_PARM_REG_RBX,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
    180     OP("push %eSP",          IDX_ParseFixedReg,  0,          0,          OP_PUSH,    OP_PARM_REG_RSP,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
    181     OP("push %eBP",          IDX_ParseFixedReg,  0,          0,          OP_PUSH,    OP_PARM_REG_RBP,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
    182     OP("push %eSI",          IDX_ParseFixedReg,  0,          0,          OP_PUSH,    OP_PARM_REG_RSI,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
    183     OP("push %eDI",          IDX_ParseFixedReg,  0,          0,          OP_PUSH,    OP_PARM_REG_RDI,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
    184     OP("pop %eAX",           IDX_ParseFixedReg,  0,          0,          OP_POP,     OP_PARM_REG_RAX,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
    185     OP("pop %eCX",           IDX_ParseFixedReg,  0,          0,          OP_POP,     OP_PARM_REG_RCX,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
    186     OP("pop %eDX",           IDX_ParseFixedReg,  0,          0,          OP_POP,     OP_PARM_REG_RDX,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
    187     OP("pop %eBX",           IDX_ParseFixedReg,  0,          0,          OP_POP,     OP_PARM_REG_RBX,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
    188     OP("pop %eSP",           IDX_ParseFixedReg,  0,          0,          OP_POP,     OP_PARM_REG_RSP,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
    189     OP("pop %eBP",           IDX_ParseFixedReg,  0,          0,          OP_POP,     OP_PARM_REG_RBP,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
    190     OP("pop %eSI",           IDX_ParseFixedReg,  0,          0,          OP_POP,     OP_PARM_REG_RSI,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
    191     OP("pop %eDI",           IDX_ParseFixedReg,  0,          0,          OP_POP,     OP_PARM_REG_RDI,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
     176    OP("push %eAX",          IDX_ParseFixedReg,  0,          0,          OP_PUSH,    OP_PARM_REG_EAX,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
     177    OP("push %eCX",          IDX_ParseFixedReg,  0,          0,          OP_PUSH,    OP_PARM_REG_ECX,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
     178    OP("push %eDX",          IDX_ParseFixedReg,  0,          0,          OP_PUSH,    OP_PARM_REG_EDX,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
     179    OP("push %eBX",          IDX_ParseFixedReg,  0,          0,          OP_PUSH,    OP_PARM_REG_EBX,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
     180    OP("push %eSP",          IDX_ParseFixedReg,  0,          0,          OP_PUSH,    OP_PARM_REG_ESP,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
     181    OP("push %eBP",          IDX_ParseFixedReg,  0,          0,          OP_PUSH,    OP_PARM_REG_EBP,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
     182    OP("push %eSI",          IDX_ParseFixedReg,  0,          0,          OP_PUSH,    OP_PARM_REG_ESI,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
     183    OP("push %eDI",          IDX_ParseFixedReg,  0,          0,          OP_PUSH,    OP_PARM_REG_EDI,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
     184    OP("pop %eAX",           IDX_ParseFixedReg,  0,          0,          OP_POP,     OP_PARM_REG_EAX,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
     185    OP("pop %eCX",           IDX_ParseFixedReg,  0,          0,          OP_POP,     OP_PARM_REG_ECX,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
     186    OP("pop %eDX",           IDX_ParseFixedReg,  0,          0,          OP_POP,     OP_PARM_REG_EDX,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
     187    OP("pop %eBX",           IDX_ParseFixedReg,  0,          0,          OP_POP,     OP_PARM_REG_EBX,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
     188    OP("pop %eSP",           IDX_ParseFixedReg,  0,          0,          OP_POP,     OP_PARM_REG_ESP,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
     189    OP("pop %eBP",           IDX_ParseFixedReg,  0,          0,          OP_POP,     OP_PARM_REG_EBP,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
     190    OP("pop %eSI",           IDX_ParseFixedReg,  0,          0,          OP_POP,     OP_PARM_REG_ESI,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
     191    OP("pop %eDI",           IDX_ParseFixedReg,  0,          0,          OP_POP,     OP_PARM_REG_EDI,    OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
    192192 
    193193    /* 6 */ 

© 2008 Sun Microsystems, Inc.
ContactPrivacy policy