VirtualBox

Changeset 8361

Show
Ignore:
Timestamp:
04/24/08 15:59:24 (9 months ago)
Author:
vboxsync
Message:

Even more disassembler updates

Files:

Legend:

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

    r8336 r8361  
    4646#define OP_INVALID      0 
    4747#define OP_OPSIZE       1 
    48 #define OP_ADRSIZE      2 
     48#define OP_ADDRSIZE     2 
    4949#define OP_SEG          3 
    5050#define OP_REPNE        4 
  • trunk/src/VBox/Disassembler/Disasm.cpp

    r8333 r8361  
    9292 */ 
    9393DISDECL(int) DISInstr(PDISCPUSTATE pCpu, RTUINTPTR pu8Instruction, unsigned u32EipOffset, unsigned *pcbSize, 
    94                       char *pszOutput) 
     94                      char *pszOutput) 
    9595{ 
    9696    return DISInstrEx(pCpu, pu8Instruction, u32EipOffset, pcbSize, pszOutput, OPTYPE_ALL); 
     
    113113 */ 
    114114DISDECL(int) DISInstrEx(PDISCPUSTATE pCpu, RTUINTPTR pu8Instruction, unsigned u32EipOffset, unsigned *pcbSize, 
    115                         char *pszOutput, unsigned uFilter) 
     115                        char *pszOutput, unsigned uFilter) 
    116116{ 
    117117    unsigned i = 0, prefixbytes; 
     
    124124    pCpu->prefix      = PREFIX_NONE; 
    125125    pCpu->prefix_seg  = 0; 
    126     pCpu->addrmode    = pCpu->mode; 
    127     pCpu->opmode      = pCpu->mode; 
    128126    pCpu->ModRM.u     = 0; 
    129127    pCpu->SIB.u       = 0; 
     
    147145        *pszOutput = '\0'; 
    148146 
     147    if (pCpu->mode == CPUMODE_64BIT) 
     148    { 
     149        pCpu->addrmode   = CPUMODE_64BIT; 
     150        pCpu->opmode     = CPUMODE_32BIT; 
     151    } 
     152    else 
     153    { 
     154        pCpu->addrmode   = pCpu->mode; 
     155        pCpu->opmode     = pCpu->mode; 
     156    } 
     157 
    149158    prefixbytes = 0; 
    150159#ifndef __L4ENV__  /* Unfortunately, we have no exception handling in l4env */ 
     
    164173            { 
    165174                pCpu->lastprefix = opcode; 
     175 
     176                /* The REX prefix must precede the opcode byte(s). Any other placement is ignored. */ 
     177                if (opcode != OP_REX) 
     178                    pCpu->prefix &= ~PREFIX_REX; 
     179 
    166180                switch(opcode) 
    167181                { 
     
    175189                case OP_SEG: 
    176190                    pCpu->prefix_seg = g_aOneByteMapX86[codebyte].param1 - OP_PARM_REG_SEG_START; 
    177                     pCpu->prefix |= PREFIX_SEG; 
     191                    /* Segment prefixes for CS, DS, ES and SS are ignored in long mode. */ 
     192                    if (   pCpu->mode != CPUMODE_64BIT 
     193                        || pCpu->prefix_seg >= OP_PARM_REG_FS) 
     194                    { 
     195                        pCpu->prefix    |= PREFIX_SEG; 
     196                    } 
    178197                    i += sizeof(uint8_t); 
    179198                    prefixbytes++; 
     
    188207 
    189208                // address size override prefix byte 
    190                 case OP_ADRSIZE: 
     209                case OP_ADDRSIZE: 
    191210                    pCpu->prefix |= PREFIX_ADDRSIZE; 
    192                     if(pCpu->mode == CPUMODE_16BIT) 
    193                          pCpu->addrmode = CPUMODE_32BIT; 
    194                     else pCpu->addrmode = CPUMODE_16BIT; 
     211                    if (pCpu->mode == CPUMODE_16BIT) 
     212                        pCpu->addrmode = CPUMODE_32BIT; 
     213                    else  
     214                    if (pCpu->mode == CPUMODE_32BIT) 
     215                        pCpu->addrmode = CPUMODE_16BIT; 
     216                    else 
     217                        pCpu->addrmode = CPUMODE_32BIT;     /* 64 bits */ 
     218 
    195219                    i += sizeof(uint8_t); 
    196220                    prefixbytes++; 
     
    200224                case OP_OPSIZE: 
    201225                    pCpu->prefix |= PREFIX_OPSIZE; 
    202                     if(pCpu->mode == CPUMODE_16BIT) 
    203                          pCpu->opmode = CPUMODE_32BIT; 
    204                     else pCpu->opmode = CPUMODE_16BIT; 
     226                    if (pCpu->mode == CPUMODE_16BIT) 
     227                        pCpu->opmode = CPUMODE_32BIT; 
     228                    else  
     229                        pCpu->opmode = CPUMODE_16BIT;  /* for 32 and 64 bits mode (there is no 32 bits operand size override prefix) */ 
     230 
    205231                    i += sizeof(uint8_t); 
    206232                    prefixbytes++; 
     
    225251                    pCpu->prefix    |= PREFIX_REX; 
    226252                    pCpu->prefix_rex = PREFIX_REX_OP_2_FLAGS(opcode); 
     253 
     254                    if (pCpu->prefix_rex & PREFIX_REX_FLAGS_W) 
     255                        pCpu->opmode = CPUMODE_64BIT;  /* overrides size prefix byte */ 
    227256                    break; 
    228257                } 
     
    390419            case 'e': //register based on operand size (e.g. %eAX) 
    391420                if(pCpu->opmode == CPUMODE_32BIT) 
    392                 { 
    393421                    RTStrPrintf(&pszOutput[strlen(pszOutput)], 64, "E"); 
    394                 } 
     422                if(pCpu->opmode == CPUMODE_64BIT) 
     423                    RTStrPrintf(&pszOutput[strlen(pszOutput)], 64, "R"); 
     424 
    395425                RTStrPrintf(&pszOutput[strlen(pszOutput)], 64, "%c%c", lpszFormat[2], lpszFormat[3]); 
    396426                break; 
  • trunk/src/VBox/Disassembler/DisasmCore.cpp

    r8357 r8361  
    174174    pCpu->prefix_seg = 0; 
    175175    pCpu->lastprefix = 0; 
    176     pCpu->addrmode   = pCpu->mode; 
    177     pCpu->opmode     = pCpu->mode; 
    178176    pCpu->ModRM.u    = 0; 
    179177    pCpu->SIB.u      = 0; 
     
    221219    pCpu->lastprefix = 0; 
    222220    pCpu->mode       = enmCpuMode; 
    223     pCpu->addrmode   = enmCpuMode; 
    224     pCpu->opmode     = enmCpuMode; 
    225221    pCpu->ModRM.u    = 0; 
    226222    pCpu->SIB.u      = 0; 
     
    261257    unsigned  cbInc; 
    262258 
     259    if (pCpu->mode == CPUMODE_64BIT) 
     260    { 
     261        pCpu->addrmode   = CPUMODE_64BIT; 
     262        pCpu->opmode     = CPUMODE_32BIT; 
     263    } 
     264    else 
     265    { 
     266        pCpu->addrmode   = pCpu->mode; 
     267        pCpu->opmode     = pCpu->mode; 
     268    } 
     269 
    263270    while(1) 
    264271    { 
     
    284291            case OP_SEG: 
    285292                pCpu->prefix_seg = g_aOneByteMapX86[codebyte].param1 - OP_PARM_REG_SEG_START; 
    286                 pCpu->prefix    |= PREFIX_SEG; 
    287                 iByte           += sizeof(uint8_t); 
     293                /* Segment prefixes for CS, DS, ES and SS are ignored in long mode. */ 
     294                if (   pCpu->mode != CPUMODE_64BIT 
     295                    || pCpu->prefix_seg >= OP_PARM_REG_FS) 
     296                { 
     297                    pCpu->prefix    |= PREFIX_SEG; 
     298                } 
     299                iByte += sizeof(uint8_t); 
    288300                continue;   //fetch the next byte 
    289301 
     
    295307 
    296308            // address size override prefix byte 
    297             case OP_ADRSIZE: 
     309            case OP_ADDRSIZE: 
    298310                pCpu->prefix |= PREFIX_ADDRSIZE; 
    299311                if (pCpu->mode == CPUMODE_16BIT) 
    300                      pCpu->addrmode = CPUMODE_32BIT; 
    301                 else pCpu->addrmode = CPUMODE_16BIT; 
     312                    pCpu->addrmode = CPUMODE_32BIT; 
     313                else  
     314                if (pCpu->mode == CPUMODE_32BIT) 
     315                    pCpu->addrmode = CPUMODE_16BIT; 
     316                else 
     317                    pCpu->addrmode = CPUMODE_32BIT;     /* 64 bits */ 
     318 
    302319                iByte        += sizeof(uint8_t); 
    303320                continue;   //fetch the next byte 
     
    307324                pCpu->prefix |= PREFIX_OPSIZE; 
    308325                if (pCpu->mode == CPUMODE_16BIT) 
    309                      pCpu->opmode = CPUMODE_32BIT; 
    310                 else pCpu->opmode = CPUMODE_16BIT; 
     326                    pCpu->opmode = CPUMODE_32BIT; 
     327                else  
     328                    pCpu->opmode = CPUMODE_16BIT;  /* for 32 and 64 bits mode (there is no 32 bits operand size override prefix) */ 
    311329 
    312330                iByte        += sizeof(uint8_t); 
     
    390408    pCpu->param3.param = pOp->param3; 
    391409 
     410    /* Correct the operand size if the instruction is marked as forced or default 64 bits */ 
     411    if (pCpu->mode == CPUMODE_64BIT) 
     412    { 
     413        if (pOp->optype & OPTYPE_FORCED_64_OP_SIZE) 
     414            pCpu->opsize = CPUMODE_64BIT; 
     415        else 
     416        if (    (pOp->optype & OPTYPE_DEFAULT_64_OP_SIZE) 
     417            &&  !(pCpu->prefix & PREFIX_OPSIZE)) 
     418            pCpu->opsize = CPUMODE_64BIT; 
     419    } 
     420 
    392421    if (pOp->idxParse1 != IDX_ParseNop)  
    393422    { 
     
    450479        /* Not filtered out -> full disassembly */ 
    451480        pCpu->pfnDisasmFnTable = pfnFullDisasm; 
     481    } 
     482 
     483    /* Correct the operand size if the instruction is marked as forced or default 64 bits */ 
     484    if (pCpu->mode == CPUMODE_64BIT) 
     485    { 
     486        /* Note: redundant, but just in case this ever changes */ 
     487        if (fpop->optype & OPTYPE_FORCED_64_OP_SIZE) 
     488            pCpu->opsize = CPUMODE_64BIT; 
     489        else 
     490        if (    (fpop->optype & OPTYPE_DEFAULT_64_OP_SIZE) 
     491            &&  !(pCpu->prefix & PREFIX_OPSIZE)) 
     492            pCpu->opsize = CPUMODE_64BIT; 
    452493    } 
    453494 
  • trunk/src/VBox/Disassembler/DisasmTables.cpp

    r8357 r8361  
    199199    OP("SEG GS",             0,                  0,                 0,                  OP_SEG,     OP_PARM_REG_GS,     OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
    200200    OP("OP SIZE",            0,                  0,                 0,                  OP_OPSIZE,  OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
    201     OP("ADR SIZE",           0,                  0,                 0,                  OP_ADRSIZE, OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
     201    OP("ADR SIZE",           0,                  0,                 0,                  OP_ADDRSIZE,OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
    202202    OP("push %Iv",           IDX_ParseImmV,      0,                 0,                  OP_PUSH,    OP_PARM_Iv,         OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
    203203    OP("imul %Gv,%Ev,%Iv",   IDX_ParseModRM,     IDX_UseModRM,      IDX_ParseImmV,      OP_IMUL,    OP_PARM_Gv,         OP_PARM_Ev,     OP_PARM_Iv,     OPTYPE_HARMLESS), 
     
    517517 
    518518    /* 7 */ 
    519     OP("pshufw %Pq,%Qq,%Ib", IDX_ParseModRM,     IDX_UseModRM,   IDX_ParseImmByte,OP_PSHUFW, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_Ib,     OPTYPE_HARMLESS), 
    520     OP("Grp12",              IDX_ParseGrp12,     0,          0,          OP_GRP12,   OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
    521     OP("Grp13",              IDX_ParseGrp13,     0,          0,          OP_GRP13,   OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
    522     OP("Grp14",              IDX_ParseGrp14,     0,          0,          OP_GRP14,   OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
    523     OP("pcmpeqb %Pq,%Qq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PCMPEQB, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   OPTYPE_HARMLESS), 
    524     OP("pcmpeqw %Pq,%Qq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PCMPEQW, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   OPTYPE_HARMLESS), 
    525     OP("pcmpeqd %Pq,%Qq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PCMPEQD, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   OPTYPE_HARMLESS), 
    526     OP("emms",               0,              0,          0,          OP_EMMS,    OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
    527     OP("MMX UD 0x78",        0,              0,          0,          OP_MMX_UD78,OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
    528     OP("MMX UD 0x79",        0,              0,          0,          OP_MMX_UD79,OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
    529     OP("MMX UD 0x7A",        0,              0,          0,          OP_MMX_UD7A,OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
    530     OP("MMX UD 0x7B",        0,              0,          0,          OP_MMX_UD7B,OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
    531     OP("MMX UD 0x7C",        0,              0,          0,          OP_MMX_UD7C,OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
    532     OP("MMX UD 0x7D",        0,              0,          0,          OP_MMX_UD7D,OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
    533     OP("movd %Ed,%Pd",       IDX_ParseModRM,     IDX_UseModRM,   0,          OP_MOVD,    OP_PARM_Ed,         OP_PARM_Pd,     OP_PARM_NONE,   OPTYPE_HARMLESS), 
    534     OP("movq %Qq,%Pq",       IDX_ParseModRM,     IDX_UseModRM,   0,          OP_MOVQ,    OP_PARM_Qq,         OP_PARM_Pq,     OP_PARM_NONE,   OPTYPE_HARMLESS), 
     519    OP("pshufw %Pq,%Qq,%Ib", IDX_ParseModRM,     IDX_UseModRM,   IDX_ParseImmByte,  OP_PSHUFW, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_Ib,     OPTYPE_HARMLESS), 
     520    OP("Grp12",              IDX_ParseGrp12,     0,              0,                 OP_GRP12,   OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
     521    OP("Grp13",              IDX_ParseGrp13,     0,              0,                 OP_GRP13,   OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
     522    OP("Grp14",              IDX_ParseGrp14,     0,              0,                 OP_GRP14,   OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
     523    OP("pcmpeqb %Pq,%Qq",    IDX_ParseModRM,     IDX_UseModRM,   0,                 OP_PCMPEQB, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   OPTYPE_HARMLESS), 
     524    OP("pcmpeqw %Pq,%Qq",    IDX_ParseModRM,     IDX_UseModRM,   0,                 OP_PCMPEQW, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   OPTYPE_HARMLESS), 
     525    OP("pcmpeqd %Pq,%Qq",    IDX_ParseModRM,     IDX_UseModRM,   0,                 OP_PCMPEQD, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   OPTYPE_HARMLESS), 
     526    OP("emms",               0,                  0,              0,                 OP_EMMS,    OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
     527    OP("MMX UD 0x78",        0,                  0,              0,                 OP_MMX_UD78,OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
     528    OP("MMX UD 0x79",        0,                  0,              0,                 OP_MMX_UD79,OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
     529    OP("MMX UD 0x7A",        0,                  0,              0,                 OP_MMX_UD7A,OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
     530    OP("MMX UD 0x7B",        0,                  0,              0,                 OP_MMX_UD7B,OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
     531    OP("MMX UD 0x7C",        0,                  0,              0,                 OP_MMX_UD7C,OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
     532    OP("MMX UD 0x7D",        0,                  0,              0,                 OP_MMX_UD7D,OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
     533    OP("movd %Ed,%Pd",       IDX_ParseModRM,     IDX_UseModRM,   0,                 OP_MOVD,    OP_PARM_Ed,         OP_PARM_Pd,     OP_PARM_NONE,   OPTYPE_HARMLESS), 
     534    OP("movq %Qq,%Pq",       IDX_ParseModRM,     IDX_UseModRM,   0,                 OP_MOVQ,    OP_PARM_Qq,         OP_PARM_Pq,     OP_PARM_NONE,   OPTYPE_HARMLESS), 
    535535 
    536536    /* 8 */ 
  • trunk/src/VBox/Disassembler/DisasmTablesX64.cpp

    r8357 r8361  
    199199    OP("SEG GS",             0,                  0,                 0,                  OP_SEG,         OP_PARM_REG_GS,     OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
    200200    OP("OP SIZE",            0,                  0,                 0,                  OP_OPSIZE,      OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
    201     OP("ADR SIZE",           0,                  0,                 0,                  OP_ADRSIZE,     OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
     201    OP("ADDR SIZE",          0,                  0,                 0,                  OP_ADDRSIZE,    OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS), 
    202202    OP("push %Iv",           IDX_ParseImmV,      0,                 0,                  OP_PUSH,        OP_PARM_Iv,         OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS | OPTYPE_DEFAULT_64_OP_SIZE), 
    203203    OP("imul %Gv,%Ev,%Iv",   IDX_ParseModRM,     IDX_UseModRM,      IDX_ParseImmV,      OP_IMUL,        OP_PARM_Gv,         OP_PARM_Ev,     OP_PARM_Iv,     OPTYPE_HARMLESS), 

© 2008 Sun Microsystems, Inc.
ContactPrivacy policy