VirtualBox

Changeset 8361 in vbox


Ignore:
Timestamp:
Apr 24, 2008 1:59:24 PM (17 years ago)
Author:
vboxsync
Message:

Even more disassembler updates

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • 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),
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