VirtualBox

Changeset 41789 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Jun 16, 2012 8:24:50 PM (13 years ago)
Author:
vboxsync
Message:

DIS: pCpu -> pDis.

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

Legend:

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

    r41731 r41789  
    3333 *
    3434 * @returns VBox error code
    35  * @param   pCpu            Pointer to cpu structure which have DISCPUSTATE::mode
    36  *                          set correctly.
    3735 * @param   pvInstr         Pointer to the instruction to disassemble.
     36 * @param   enmCpuMode      The CPU state.
     37 * @param   pDis            The disassembler state (output).
    3838 * @param   pcbInstr        Where to store the size of the instruction. NULL is
    3939 *                          allowed.
     
    4343 * @todo    Define output callback.
    4444 */
    45 DISDECL(int) DISInstrToStr(void const *pvInstr, DISCPUMODE enmCpuMode, PDISCPUSTATE pCpu, uint32_t *pcbInstr,
     45DISDECL(int) DISInstrToStr(void const *pvInstr, DISCPUMODE enmCpuMode, PDISCPUSTATE pDis, uint32_t *pcbInstr,
    4646                           char *pszOutput, size_t cbOutput)
    4747{
    4848    return DISInstrToStrEx((uintptr_t)pvInstr, enmCpuMode, NULL, NULL, DISOPTYPE_ALL,
    49                            pCpu, pcbInstr, pszOutput, cbOutput);
     49                           pDis, pcbInstr, pszOutput, cbOutput);
    5050}
    5151
     
    5959 * @param   pvUser          The user argument (found in
    6060 *                          DISCPUSTATE::pvUser).
    61  * @param   pCpu            Where to return the disassembled instruction.
     61 * @param   pDis            The disassembler state (output).
    6262 * @param   pcbInstr        Where to store the size of the instruction. NULL is
    6363 *                          allowed.
     
    6868 */
    6969DISDECL(int) DISInstrToStrWithReader(RTUINTPTR uInstrAddr, DISCPUMODE enmCpuMode, PFNDISREADBYTES pfnReadBytes, void *pvUser,
    70                                      PDISCPUSTATE pCpu, uint32_t *pcbInstr, char *pszOutput, size_t cbOutput)
     70                                     PDISCPUSTATE pDis, uint32_t *pcbInstr, char *pszOutput, size_t cbOutput)
    7171
    7272{
    7373    return DISInstrToStrEx(uInstrAddr, enmCpuMode, pfnReadBytes, pvUser, DISOPTYPE_ALL,
    74                            pCpu, pcbInstr, pszOutput, cbOutput);
     74                           pDis, pcbInstr, pszOutput, cbOutput);
    7575}
    7676
     
    8383 * @param   pfnCallback     The byte fetcher callback.
    8484 * @param   uFilter         Instruction filter.
    85  * @param   pCpu            Where to return the disassembled instruction.
     85 * @param   pDis            Where to return the disassembled instruction info.
    8686 * @param   pcbInstr        Where to store the size of the instruction. NULL is
    8787 *                          allowed.
     
    9393DISDECL(int) DISInstrToStrEx(RTUINTPTR uInstrAddr, DISCPUMODE enmCpuMode,
    9494                             PFNDISREADBYTES pfnReadBytes, void *pvUser, uint32_t uFilter,
    95                              PDISCPUSTATE pCpu, uint32_t *pcbInstr, char *pszOutput, size_t cbOutput)
     95                             PDISCPUSTATE pDis, uint32_t *pcbInstr, char *pszOutput, size_t cbOutput)
    9696{
    97     int rc = DISInstEx(uInstrAddr, enmCpuMode, uFilter, pfnReadBytes, pvUser, pCpu, pcbInstr);
     97    int rc = DISInstEx(uInstrAddr, enmCpuMode, uFilter, pfnReadBytes, pvUser, pDis, pcbInstr);
    9898    if (RT_SUCCESS(rc) && pszOutput && cbOutput)
    9999    {
    100         size_t cch = DISFormatYasmEx(pCpu, pszOutput, cbOutput,
     100        size_t cch = DISFormatYasmEx(pDis, pszOutput, cbOutput,
    101101                                     DIS_FMT_FLAGS_BYTES_LEFT | DIS_FMT_FLAGS_BYTES_BRACKETS | DIS_FMT_FLAGS_BYTES_SPACED
    102102                                     | DIS_FMT_FLAGS_RELATIVE_BRANCH | DIS_FMT_FLAGS_ADDR_LEFT,
  • trunk/src/VBox/Disassembler/DisasmCore.cpp

    r41788 r41789  
    4747*   Internal Functions                                                         *
    4848*******************************************************************************/
    49 static void     disasmModRMReg(PDISCPUSTATE pCpu, PCDISOPCODE pOp, unsigned idx, PDISOPPARAM pParam, int fRegAddr);
    50 static void     disasmModRMReg16(PDISCPUSTATE pCpu, PCDISOPCODE pOp, unsigned idx, PDISOPPARAM pParam);
    51 static void     disasmModRMSReg(PDISCPUSTATE pCpu, PCDISOPCODE pOp, unsigned idx, PDISOPPARAM pParam);
     49static void     disasmModRMReg(PDISCPUSTATE pDis, PCDISOPCODE pOp, unsigned idx, PDISOPPARAM pParam, int fRegAddr);
     50static void     disasmModRMReg16(PDISCPUSTATE pDis, PCDISOPCODE pOp, unsigned idx, PDISOPPARAM pParam);
     51static void     disasmModRMSReg(PDISCPUSTATE pDis, PCDISOPCODE pOp, unsigned idx, PDISOPPARAM pParam);
    5252
    5353
     
    252252 * The caller shall fend off reads beyond the DISCPUSTATE::abInstr buffer.
    253253 *
    254  * @param   pCpu                The disassembler state.
     254 * @param   pDis                The disassembler state.
    255255 * @param   offInstr            The offset of the read request.
    256256 * @param   cbMin               The size of the read request that needs to be
    257257 *                              satisfied.
    258258 */
    259 DECL_NO_INLINE(static, void) disReadMore(PDISCPUSTATE pCpu, uint8_t offInstr, uint8_t cbMin)
    260 {
    261     Assert(cbMin + offInstr <= sizeof(pCpu->abInstr));
     259DECL_NO_INLINE(static, void) disReadMore(PDISCPUSTATE pDis, uint8_t offInstr, uint8_t cbMin)
     260{
     261    Assert(cbMin + offInstr <= sizeof(pDis->abInstr));
    262262
    263263    /*
     
    265265     * been read and to make sure we don't leave unread gaps.
    266266     */
    267     if (offInstr < pCpu->cbCachedInstr)
    268     {
    269         Assert(offInstr + cbMin > pCpu->cbCachedInstr);
    270         cbMin -= pCpu->cbCachedInstr - offInstr;
    271         offInstr = pCpu->cbCachedInstr;
    272     }
    273     else if (offInstr > pCpu->cbCachedInstr)
    274     {
    275         cbMin += offInstr - pCpu->cbCachedInstr;
    276         offInstr = pCpu->cbCachedInstr;
     267    if (offInstr < pDis->cbCachedInstr)
     268    {
     269        Assert(offInstr + cbMin > pDis->cbCachedInstr);
     270        cbMin -= pDis->cbCachedInstr - offInstr;
     271        offInstr = pDis->cbCachedInstr;
     272    }
     273    else if (offInstr > pDis->cbCachedInstr)
     274    {
     275        cbMin += offInstr - pDis->cbCachedInstr;
     276        offInstr = pDis->cbCachedInstr;
    277277    }
    278278
     
    282282     * DISInstrEx API.)
    283283     */
    284     int rc = pCpu->pfnReadBytes(pCpu, offInstr, cbMin, sizeof(pCpu->abInstr) - offInstr);
     284    int rc = pDis->pfnReadBytes(pDis, offInstr, cbMin, sizeof(pDis->abInstr) - offInstr);
    285285    if (RT_SUCCESS(rc))
    286286    {
    287         Assert(pCpu->cbCachedInstr >= offInstr + cbMin);
    288         Assert(pCpu->cbCachedInstr <= sizeof(pCpu->abInstr));
     287        Assert(pDis->cbCachedInstr >= offInstr + cbMin);
     288        Assert(pDis->cbCachedInstr <= sizeof(pDis->abInstr));
    289289    }
    290290    else
    291291    {
    292292        Log(("disReadMore failed with rc=%Rrc!!\n", rc));
    293         pCpu->rc = VERR_DIS_MEM_READ;
     293        pDis->rc = VERR_DIS_MEM_READ;
    294294    }
    295295}
     
    300300 *
    301301 * @returns The requested byte.
    302  * @param   pCpu                The disassembler state.
     302 * @param   pDis                The disassembler state.
    303303 * @param   offInstr            The offset of the byte relative to the
    304304 *                              instruction.
    305305 */
    306 DECL_NO_INLINE(static, uint8_t) disReadByteSlow(PDISCPUSTATE pCpu, size_t offInstr)
     306DECL_NO_INLINE(static, uint8_t) disReadByteSlow(PDISCPUSTATE pDis, size_t offInstr)
    307307{
    308308    if (RT_UNLIKELY(offInstr >= DIS_MAX_INSTR_LENGTH))
    309309    {
    310310        Log(("disReadByte: too long instruction...\n"));
    311         pCpu->rc = VERR_DIS_TOO_LONG_INSTR;
     311        pDis->rc = VERR_DIS_TOO_LONG_INSTR;
    312312        return 0;
    313313    }
    314314
    315     disReadMore(pCpu, (uint8_t)offInstr, 1);
    316     return pCpu->abInstr[offInstr];
     315    disReadMore(pDis, (uint8_t)offInstr, 1);
     316    return pDis->abInstr[offInstr];
    317317}
    318318
     
    322322 *
    323323 * @returns The requested byte.
    324  * @param   pCpu                The disassembler state.
     324 * @param   pDis                The disassembler state.
    325325 * @param   uAddress            The address.
    326326 */
    327 DECLINLINE(uint8_t) disReadByte(PDISCPUSTATE pCpu, size_t offInstr)
    328 {
    329     if (RT_UNLIKELY(offInstr >= pCpu->cbCachedInstr))
    330         return disReadByteSlow(pCpu, offInstr);
    331 
    332     return pCpu->abInstr[offInstr];
     327DECLINLINE(uint8_t) disReadByte(PDISCPUSTATE pDis, size_t offInstr)
     328{
     329    if (RT_UNLIKELY(offInstr >= pDis->cbCachedInstr))
     330        return disReadByteSlow(pDis, offInstr);
     331
     332    return pDis->abInstr[offInstr];
    333333}
    334334
     
    338338 *
    339339 * @returns The requested word.
    340  * @param   pCpu                The disassembler state.
     340 * @param   pDis                The disassembler state.
    341341 * @param   offInstr            The offset of the word relative to the
    342342 *                              instruction.
    343343 */
    344 DECL_NO_INLINE(static, uint16_t) disReadWordSlow(PDISCPUSTATE pCpu, size_t offInstr)
     344DECL_NO_INLINE(static, uint16_t) disReadWordSlow(PDISCPUSTATE pDis, size_t offInstr)
    345345{
    346346    if (RT_UNLIKELY(offInstr + 2 > DIS_MAX_INSTR_LENGTH))
    347347    {
    348348        Log(("disReadWord: too long instruction...\n"));
    349         pCpu->rc = VERR_DIS_TOO_LONG_INSTR;
     349        pDis->rc = VERR_DIS_TOO_LONG_INSTR;
    350350        if (offInstr < DIS_MAX_INSTR_LENGTH)
    351             return pCpu->abInstr[offInstr];
     351            return pDis->abInstr[offInstr];
    352352        return 0;
    353353    }
    354354
    355     disReadMore(pCpu, (uint8_t)offInstr, 2);
     355    disReadMore(pDis, (uint8_t)offInstr, 2);
    356356#ifdef DIS_HOST_UNALIGNED_ACCESS_OK
    357     return *(uint16_t const *)&pCpu->abInstr[offInstr];
     357    return *(uint16_t const *)&pDis->abInstr[offInstr];
    358358#else
    359     return RT_MAKE_U16(pCpu->abInstr[offInstr], pCpu->abInstr[offInstr + 1]);
     359    return RT_MAKE_U16(pDis->abInstr[offInstr], pDis->abInstr[offInstr + 1]);
    360360#endif
    361361}
     
    366366 *
    367367 * @returns The requested word.
    368  * @param   pCpu                The disassembler state.
     368 * @param   pDis                The disassembler state.
    369369 * @param   offInstr            The offset of the qword relative to the
    370370 *                              instruction.
    371371 */
    372 DECLINLINE(uint16_t) disReadWord(PDISCPUSTATE pCpu, size_t offInstr)
    373 {
    374     if (RT_UNLIKELY(offInstr + 2 > pCpu->cbCachedInstr))
    375         return disReadWordSlow(pCpu, offInstr);
     372DECLINLINE(uint16_t) disReadWord(PDISCPUSTATE pDis, size_t offInstr)
     373{
     374    if (RT_UNLIKELY(offInstr + 2 > pDis->cbCachedInstr))
     375        return disReadWordSlow(pDis, offInstr);
    376376
    377377#ifdef DIS_HOST_UNALIGNED_ACCESS_OK
    378     return *(uint16_t const *)&pCpu->abInstr[offInstr];
     378    return *(uint16_t const *)&pDis->abInstr[offInstr];
    379379#else
    380     return RT_MAKE_U16(pCpu->abInstr[offInstr], pCpu->abInstr[offInstr + 1]);
     380    return RT_MAKE_U16(pDis->abInstr[offInstr], pDis->abInstr[offInstr + 1]);
    381381#endif
    382382}
     
    387387 *
    388388 * @returns The requested dword.
    389  * @param   pCpu                The disassembler state.
     389 * @param   pDis                The disassembler state.
    390390 * @param   offInstr            The offset of the dword relative to the
    391391 *                              instruction.
    392392 */
    393 DECL_NO_INLINE(static, uint32_t) disReadDWordSlow(PDISCPUSTATE pCpu, size_t offInstr)
     393DECL_NO_INLINE(static, uint32_t) disReadDWordSlow(PDISCPUSTATE pDis, size_t offInstr)
    394394{
    395395    if (RT_UNLIKELY(offInstr + 4 > DIS_MAX_INSTR_LENGTH))
    396396    {
    397397        Log(("disReadDWord: too long instruction...\n"));
    398         pCpu->rc = VERR_DIS_TOO_LONG_INSTR;
     398        pDis->rc = VERR_DIS_TOO_LONG_INSTR;
    399399        switch ((RTUINTPTR)DIS_MAX_INSTR_LENGTH - offInstr)
    400400        {
    401401            case 1:
    402                 return RT_MAKE_U32_FROM_U8(pCpu->abInstr[offInstr], 0, 0, 0);
     402                return RT_MAKE_U32_FROM_U8(pDis->abInstr[offInstr], 0, 0, 0);
    403403            case 2:
    404                 return RT_MAKE_U32_FROM_U8(pCpu->abInstr[offInstr], pCpu->abInstr[offInstr + 1], 0, 0);
     404                return RT_MAKE_U32_FROM_U8(pDis->abInstr[offInstr], pDis->abInstr[offInstr + 1], 0, 0);
    405405            case 3:
    406                 return RT_MAKE_U32_FROM_U8(pCpu->abInstr[offInstr], pCpu->abInstr[offInstr + 1], pCpu->abInstr[offInstr + 2], 0);
     406                return RT_MAKE_U32_FROM_U8(pDis->abInstr[offInstr], pDis->abInstr[offInstr + 1], pDis->abInstr[offInstr + 2], 0);
    407407        }
    408408        return 0;
    409409    }
    410410
    411     disReadMore(pCpu, (uint8_t)offInstr, 4);
     411    disReadMore(pDis, (uint8_t)offInstr, 4);
    412412#ifdef DIS_HOST_UNALIGNED_ACCESS_OK
    413     return *(uint32_t const *)&pCpu->abInstr[offInstr];
     413    return *(uint32_t const *)&pDis->abInstr[offInstr];
    414414#else
    415     return RT_MAKE_U32_FROM_U8(pCpu->abInstr[offInstr    ], pCpu->abInstr[offInstr + 1],
    416                                pCpu->abInstr[offInstr + 2], pCpu->abInstr[offInstr + 3]);
     415    return RT_MAKE_U32_FROM_U8(pDis->abInstr[offInstr    ], pDis->abInstr[offInstr + 1],
     416                               pDis->abInstr[offInstr + 2], pDis->abInstr[offInstr + 3]);
    417417#endif
    418418}
     
    423423 *
    424424 * @returns The requested dword.
    425  * @param   pCpu                The disassembler state.
     425 * @param   pDis                The disassembler state.
    426426 * @param   offInstr            The offset of the qword relative to the
    427427 *                              instruction.
    428428 */
    429 DECLINLINE(uint32_t) disReadDWord(PDISCPUSTATE pCpu, size_t offInstr)
    430 {
    431     if (RT_UNLIKELY(offInstr + 4 > pCpu->cbCachedInstr))
    432         return disReadDWordSlow(pCpu, offInstr);
     429DECLINLINE(uint32_t) disReadDWord(PDISCPUSTATE pDis, size_t offInstr)
     430{
     431    if (RT_UNLIKELY(offInstr + 4 > pDis->cbCachedInstr))
     432        return disReadDWordSlow(pDis, offInstr);
    433433
    434434#ifdef DIS_HOST_UNALIGNED_ACCESS_OK
    435     return *(uint32_t const *)&pCpu->abInstr[offInstr];
     435    return *(uint32_t const *)&pDis->abInstr[offInstr];
    436436#else
    437     return RT_MAKE_U32_FROM_U8(pCpu->abInstr[offInstr    ], pCpu->abInstr[offInstr + 1],
    438                                pCpu->abInstr[offInstr + 2], pCpu->abInstr[offInstr + 3]);
     437    return RT_MAKE_U32_FROM_U8(pDis->abInstr[offInstr    ], pDis->abInstr[offInstr + 1],
     438                               pDis->abInstr[offInstr + 2], pDis->abInstr[offInstr + 3]);
    439439#endif
    440440}
     
    445445 *
    446446 * @returns The requested qword.
    447  * @param   pCpu                The disassembler state.
     447 * @param   pDis                The disassembler state.
    448448 * @param   offInstr            The offset of the qword relative to the
    449449 *                              instruction.
    450450 */
    451 DECL_NO_INLINE(static, uint64_t) disReadQWordSlow(PDISCPUSTATE pCpu, size_t offInstr)
     451DECL_NO_INLINE(static, uint64_t) disReadQWordSlow(PDISCPUSTATE pDis, size_t offInstr)
    452452{
    453453    if (RT_UNLIKELY(offInstr + 8 > DIS_MAX_INSTR_LENGTH))
    454454    {
    455455        Log(("disReadQWord: too long instruction...\n"));
    456         pCpu->rc = VERR_DIS_TOO_LONG_INSTR;
     456        pDis->rc = VERR_DIS_TOO_LONG_INSTR;
    457457        switch ((RTUINTPTR)DIS_MAX_INSTR_LENGTH - offInstr)
    458458        {
    459459            case 1:
    460                 return RT_MAKE_U64_FROM_U8(pCpu->abInstr[offInstr], 0, 0, 0,   0, 0, 0, 0);
     460                return RT_MAKE_U64_FROM_U8(pDis->abInstr[offInstr], 0, 0, 0,   0, 0, 0, 0);
    461461            case 2:
    462                 return RT_MAKE_U64_FROM_U8(pCpu->abInstr[offInstr], pCpu->abInstr[offInstr + 1], 0, 0,   0, 0, 0, 0);
     462                return RT_MAKE_U64_FROM_U8(pDis->abInstr[offInstr], pDis->abInstr[offInstr + 1], 0, 0,   0, 0, 0, 0);
    463463            case 3:
    464                 return RT_MAKE_U64_FROM_U8(pCpu->abInstr[offInstr    ], pCpu->abInstr[offInstr + 1],
    465                                            pCpu->abInstr[offInstr + 2], 0,   0, 0, 0, 0);
     464                return RT_MAKE_U64_FROM_U8(pDis->abInstr[offInstr    ], pDis->abInstr[offInstr + 1],
     465                                           pDis->abInstr[offInstr + 2], 0,   0, 0, 0, 0);
    466466            case 4:
    467                 return RT_MAKE_U64_FROM_U8(pCpu->abInstr[offInstr    ], pCpu->abInstr[offInstr + 1],
    468                                            pCpu->abInstr[offInstr + 2], pCpu->abInstr[offInstr + 3],
    469                                            pCpu->abInstr[offInstr + 4], 0, 0, 0);
     467                return RT_MAKE_U64_FROM_U8(pDis->abInstr[offInstr    ], pDis->abInstr[offInstr + 1],
     468                                           pDis->abInstr[offInstr + 2], pDis->abInstr[offInstr + 3],
     469                                           pDis->abInstr[offInstr + 4], 0, 0, 0);
    470470            case 5:
    471                 return RT_MAKE_U64_FROM_U8(pCpu->abInstr[offInstr    ], pCpu->abInstr[offInstr + 1],
    472                                            pCpu->abInstr[offInstr + 2], pCpu->abInstr[offInstr + 3],
    473                                            pCpu->abInstr[offInstr + 4], pCpu->abInstr[offInstr + 5], 0, 0);
     471                return RT_MAKE_U64_FROM_U8(pDis->abInstr[offInstr    ], pDis->abInstr[offInstr + 1],
     472                                           pDis->abInstr[offInstr + 2], pDis->abInstr[offInstr + 3],
     473                                           pDis->abInstr[offInstr + 4], pDis->abInstr[offInstr + 5], 0, 0);
    474474            case 6:
    475                 return RT_MAKE_U64_FROM_U8(pCpu->abInstr[offInstr    ], pCpu->abInstr[offInstr + 1],
    476                                            pCpu->abInstr[offInstr + 2], pCpu->abInstr[offInstr + 3],
    477                                            pCpu->abInstr[offInstr + 4], pCpu->abInstr[offInstr + 5],
    478                                            pCpu->abInstr[offInstr + 6], 0);
     475                return RT_MAKE_U64_FROM_U8(pDis->abInstr[offInstr    ], pDis->abInstr[offInstr + 1],
     476                                           pDis->abInstr[offInstr + 2], pDis->abInstr[offInstr + 3],
     477                                           pDis->abInstr[offInstr + 4], pDis->abInstr[offInstr + 5],
     478                                           pDis->abInstr[offInstr + 6], 0);
    479479        }
    480480        return 0;
    481481    }
    482482
    483     disReadMore(pCpu, (uint8_t)offInstr, 8);
     483    disReadMore(pDis, (uint8_t)offInstr, 8);
    484484#ifdef DIS_HOST_UNALIGNED_ACCESS_OK
    485     return *(uint64_t const *)&pCpu->abInstr[offInstr];
     485    return *(uint64_t const *)&pDis->abInstr[offInstr];
    486486#else
    487     return RT_MAKE_U64_FROM_U8(pCpu->abInstr[offInstr    ], pCpu->abInstr[offInstr + 1],
    488                                pCpu->abInstr[offInstr + 2], pCpu->abInstr[offInstr + 3],
    489                                pCpu->abInstr[offInstr + 4], pCpu->abInstr[offInstr + 5],
    490                                pCpu->abInstr[offInstr + 6], pCpu->abInstr[offInstr + 7]);
     487    return RT_MAKE_U64_FROM_U8(pDis->abInstr[offInstr    ], pDis->abInstr[offInstr + 1],
     488                               pDis->abInstr[offInstr + 2], pDis->abInstr[offInstr + 3],
     489                               pDis->abInstr[offInstr + 4], pDis->abInstr[offInstr + 5],
     490                               pDis->abInstr[offInstr + 6], pDis->abInstr[offInstr + 7]);
    491491#endif
    492492}
     
    497497 *
    498498 * @returns The requested qword.
    499  * @param   pCpu                The disassembler state.
     499 * @param   pDis                The disassembler state.
    500500 * @param   uAddress            The address.
    501501 */
    502 DECLINLINE(uint64_t) disReadQWord(PDISCPUSTATE pCpu, size_t offInstr)
    503 {
    504     if (RT_UNLIKELY(offInstr + 8 > pCpu->cbCachedInstr))
    505         return disReadQWordSlow(pCpu, offInstr);
     502DECLINLINE(uint64_t) disReadQWord(PDISCPUSTATE pDis, size_t offInstr)
     503{
     504    if (RT_UNLIKELY(offInstr + 8 > pDis->cbCachedInstr))
     505        return disReadQWordSlow(pDis, offInstr);
    506506
    507507#ifdef DIS_HOST_UNALIGNED_ACCESS_OK
    508     return *(uint64_t const *)&pCpu->abInstr[offInstr];
     508    return *(uint64_t const *)&pDis->abInstr[offInstr];
    509509#else
    510     return RT_MAKE_U64_FROM_U8(pCpu->abInstr[offInstr    ], pCpu->abInstr[offInstr + 1],
    511                                pCpu->abInstr[offInstr + 2], pCpu->abInstr[offInstr + 3],
    512                                pCpu->abInstr[offInstr + 4], pCpu->abInstr[offInstr + 5],
    513                                pCpu->abInstr[offInstr + 6], pCpu->abInstr[offInstr + 7]);
     510    return RT_MAKE_U64_FROM_U8(pDis->abInstr[offInstr    ], pDis->abInstr[offInstr + 1],
     511                               pDis->abInstr[offInstr + 2], pDis->abInstr[offInstr + 3],
     512                               pDis->abInstr[offInstr + 4], pDis->abInstr[offInstr + 5],
     513                               pDis->abInstr[offInstr + 6], pDis->abInstr[offInstr + 7]);
    514514#endif
    515515}
     
    519519//*****************************************************************************
    520520//*****************************************************************************
    521 static size_t disParseInstruction(size_t offInstr, PCDISOPCODE pOp, PDISCPUSTATE pCpu)
     521static size_t disParseInstruction(size_t offInstr, PCDISOPCODE pOp, PDISCPUSTATE pDis)
    522522{
    523523    size_t size = 0;
    524524    bool fFiltered = false;
    525525
    526     Assert(pOp); Assert(pCpu);
     526    Assert(pOp); Assert(pDis);
    527527
    528528    // Store the opcode format string for disasmPrintf
    529     pCpu->pCurInstr = pOp;
     529    pDis->pCurInstr = pOp;
    530530
    531531    /*
     
    533533     * Note! Multibyte opcodes are always marked harmless until the final byte.
    534534     */
    535     if ((pOp->fOpType & pCpu->fFilter) == 0)
     535    if ((pOp->fOpType & pDis->fFilter) == 0)
    536536    {
    537537        fFiltered = true;
    538         pCpu->pfnDisasmFnTable = g_apfnCalcSize;
     538        pDis->pfnDisasmFnTable = g_apfnCalcSize;
    539539    }
    540540    else
    541541    {
    542542        /* Not filtered out -> full disassembly */
    543         pCpu->pfnDisasmFnTable = g_apfnFullDisasm;
     543        pDis->pfnDisasmFnTable = g_apfnFullDisasm;
    544544    }
    545545
    546546    // Should contain the parameter type on input
    547     pCpu->Param1.fParam = pOp->fParam1;
    548     pCpu->Param2.fParam = pOp->fParam2;
    549     pCpu->Param3.fParam = pOp->fParam3;
     547    pDis->Param1.fParam = pOp->fParam1;
     548    pDis->Param2.fParam = pOp->fParam2;
     549    pDis->Param3.fParam = pOp->fParam3;
    550550
    551551    /* Correct the operand size if the instruction is marked as forced or default 64 bits */
    552     if (pCpu->uCpuMode == DISCPUMODE_64BIT)
     552    if (pDis->uCpuMode == DISCPUMODE_64BIT)
    553553    {
    554554        if (pOp->fOpType & DISOPTYPE_FORCED_64_OP_SIZE)
    555             pCpu->uOpMode = DISCPUMODE_64BIT;
     555            pDis->uOpMode = DISCPUMODE_64BIT;
    556556        else
    557557        if (    (pOp->fOpType & DISOPTYPE_DEFAULT_64_OP_SIZE)
    558             &&  !(pCpu->fPrefix & DISPREFIX_OPSIZE))
    559             pCpu->uOpMode = DISCPUMODE_64BIT;
     558            &&  !(pDis->fPrefix & DISPREFIX_OPSIZE))
     559            pDis->uOpMode = DISCPUMODE_64BIT;
    560560    }
    561561    else
     
    563563    {
    564564        /* Forced 32 bits operand size for certain instructions (mov crx, mov drx). */
    565         Assert(pCpu->uCpuMode != DISCPUMODE_64BIT);
    566         pCpu->uOpMode = DISCPUMODE_32BIT;
     565        Assert(pDis->uCpuMode != DISCPUMODE_64BIT);
     566        pDis->uOpMode = DISCPUMODE_32BIT;
    567567    }
    568568
    569569    if (pOp->idxParse1 != IDX_ParseNop)
    570570    {
    571         size += pCpu->pfnDisasmFnTable[pOp->idxParse1](offInstr, pOp, &pCpu->Param1, pCpu);
    572         if (fFiltered == false) pCpu->Param1.cb = DISGetParamSize(pCpu, &pCpu->Param1);
     571        size += pDis->pfnDisasmFnTable[pOp->idxParse1](offInstr, pOp, &pDis->Param1, pDis);
     572        if (fFiltered == false) pDis->Param1.cb = DISGetParamSize(pDis, &pDis->Param1);
    573573    }
    574574
    575575    if (pOp->idxParse2 != IDX_ParseNop)
    576576    {
    577         size += pCpu->pfnDisasmFnTable[pOp->idxParse2](offInstr+size, pOp, &pCpu->Param2, pCpu);
    578         if (fFiltered == false) pCpu->Param2.cb = DISGetParamSize(pCpu, &pCpu->Param2);
     577        size += pDis->pfnDisasmFnTable[pOp->idxParse2](offInstr+size, pOp, &pDis->Param2, pDis);
     578        if (fFiltered == false) pDis->Param2.cb = DISGetParamSize(pDis, &pDis->Param2);
    579579    }
    580580
    581581    if (pOp->idxParse3 != IDX_ParseNop)
    582582    {
    583         size += pCpu->pfnDisasmFnTable[pOp->idxParse3](offInstr+size, pOp, &pCpu->Param3, pCpu);
    584         if (fFiltered == false) pCpu->Param3.cb = DISGetParamSize(pCpu, &pCpu->Param3);
     583        size += pDis->pfnDisasmFnTable[pOp->idxParse3](offInstr+size, pOp, &pDis->Param3, pDis);
     584        if (fFiltered == false) pDis->Param3.cb = DISGetParamSize(pDis, &pDis->Param3);
    585585    }
    586586    // else simple one byte instruction
     
    591591/* Floating point opcode parsing */
    592592//*****************************************************************************
    593 static size_t ParseEscFP(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     593static size_t ParseEscFP(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    594594{
    595595    int index;
     
    599599    NOREF(pOp);
    600600
    601     ModRM = disReadByte(pCpu, offInstr);
    602 
    603     index = pCpu->bOpCode - 0xD8;
     601    ModRM = disReadByte(pDis, offInstr);
     602
     603    index = pDis->bOpCode - 0xD8;
    604604    if (ModRM <= 0xBF)
    605605    {
    606606        fpop            = &(g_apMapX86_FP_Low[index])[MODRM_REG(ModRM)];
    607         pCpu->pCurInstr = (PCDISOPCODE)fpop;
     607        pDis->pCurInstr = (PCDISOPCODE)fpop;
    608608
    609609        // Should contain the parameter type on input
    610         pCpu->Param1.fParam = fpop->fParam1;
    611         pCpu->Param2.fParam = fpop->fParam2;
     610        pDis->Param1.fParam = fpop->fParam1;
     611        pDis->Param2.fParam = fpop->fParam2;
    612612    }
    613613    else
    614614    {
    615615        fpop            = &(g_apMapX86_FP_High[index])[ModRM - 0xC0];
    616         pCpu->pCurInstr = (PCDISOPCODE)fpop;
     616        pDis->pCurInstr = (PCDISOPCODE)fpop;
    617617    }
    618618
     
    621621     * @note Multibyte opcodes are always marked harmless until the final byte.
    622622     */
    623     if ((fpop->fOpType & pCpu->fFilter) == 0)
    624         pCpu->pfnDisasmFnTable = g_apfnCalcSize;
     623    if ((fpop->fOpType & pDis->fFilter) == 0)
     624        pDis->pfnDisasmFnTable = g_apfnCalcSize;
    625625    else
    626626        /* Not filtered out -> full disassembly */
    627         pCpu->pfnDisasmFnTable = g_apfnFullDisasm;
     627        pDis->pfnDisasmFnTable = g_apfnFullDisasm;
    628628
    629629    /* Correct the operand size if the instruction is marked as forced or default 64 bits */
    630     if (pCpu->uCpuMode == DISCPUMODE_64BIT)
     630    if (pDis->uCpuMode == DISCPUMODE_64BIT)
    631631    {
    632632        /* Note: redundant, but just in case this ever changes */
    633633        if (fpop->fOpType & DISOPTYPE_FORCED_64_OP_SIZE)
    634             pCpu->uOpMode = DISCPUMODE_64BIT;
     634            pDis->uOpMode = DISCPUMODE_64BIT;
    635635        else
    636636        if (    (fpop->fOpType & DISOPTYPE_DEFAULT_64_OP_SIZE)
    637             &&  !(pCpu->fPrefix & DISPREFIX_OPSIZE))
    638             pCpu->uOpMode = DISCPUMODE_64BIT;
     637            &&  !(pDis->fPrefix & DISPREFIX_OPSIZE))
     638            pDis->uOpMode = DISCPUMODE_64BIT;
    639639    }
    640640
     
    644644
    645645    if (fpop->idxParse1 != IDX_ParseNop)
    646         size += pCpu->pfnDisasmFnTable[fpop->idxParse1](offInstr+size, (PCDISOPCODE)fpop, pParam, pCpu);
     646        size += pDis->pfnDisasmFnTable[fpop->idxParse1](offInstr+size, (PCDISOPCODE)fpop, pParam, pDis);
    647647
    648648    if (fpop->idxParse2 != IDX_ParseNop)
    649         size += pCpu->pfnDisasmFnTable[fpop->idxParse2](offInstr+size, (PCDISOPCODE)fpop, pParam, pCpu);
     649        size += pDis->pfnDisasmFnTable[fpop->idxParse2](offInstr+size, (PCDISOPCODE)fpop, pParam, pDis);
    650650
    651651    return size;
     
    656656// Scale  Index  Base
    657657//*****************************************************************************
    658 static void UseSIB(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     658static void UseSIB(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    659659{
    660660    NOREF(offInstr); NOREF(pOp);
    661661
    662     unsigned scale = pCpu->SIB.Bits.Scale;
    663     unsigned base  = pCpu->SIB.Bits.Base;
    664     unsigned index = pCpu->SIB.Bits.Index;
     662    unsigned scale = pDis->SIB.Bits.Scale;
     663    unsigned base  = pDis->SIB.Bits.Base;
     664    unsigned index = pDis->SIB.Bits.Index;
    665665
    666666    unsigned regtype;
    667     if (pCpu->uAddrMode == DISCPUMODE_32BIT)
     667    if (pDis->uAddrMode == DISCPUMODE_32BIT)
    668668        regtype    = DISUSE_REG_GEN32;
    669669    else
     
    682682    }
    683683
    684     if (base == 5 && pCpu->ModRM.Bits.Mod == 0)
     684    if (base == 5 && pDis->ModRM.Bits.Mod == 0)
    685685    {
    686686        // [scaled index] + disp32
    687         if (pCpu->uAddrMode == DISCPUMODE_32BIT)
     687        if (pDis->uAddrMode == DISCPUMODE_32BIT)
    688688        {
    689689            pParam->fUse |= DISUSE_DISPLACEMENT32;
    690             pParam->uDisp.i32 = pCpu->i32SibDisp;
     690            pParam->uDisp.i32 = pDis->i32SibDisp;
    691691        }
    692692        else
    693693        {   /* sign-extend to 64 bits */
    694694            pParam->fUse |= DISUSE_DISPLACEMENT64;
    695             pParam->uDisp.i64 = pCpu->i32SibDisp;
     695            pParam->uDisp.i64 = pDis->i32SibDisp;
    696696        }
    697697    }
     
    705705//*****************************************************************************
    706706//*****************************************************************************
    707 static size_t ParseSIB(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     707static size_t ParseSIB(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    708708{
    709709    unsigned size = sizeof(uint8_t);
     
    711711    NOREF(pOp); NOREF(pParam);
    712712
    713     SIB = disReadByte(pCpu, offInstr);
     713    SIB = disReadByte(pDis, offInstr);
    714714    offInstr += size;
    715715
    716     pCpu->SIB.Bits.Base  = SIB_BASE(SIB);
    717     pCpu->SIB.Bits.Index = SIB_INDEX(SIB);
    718     pCpu->SIB.Bits.Scale = SIB_SCALE(SIB);
    719 
    720     if (pCpu->fPrefix & DISPREFIX_REX)
     716    pDis->SIB.Bits.Base  = SIB_BASE(SIB);
     717    pDis->SIB.Bits.Index = SIB_INDEX(SIB);
     718    pDis->SIB.Bits.Scale = SIB_SCALE(SIB);
     719
     720    if (pDis->fPrefix & DISPREFIX_REX)
    721721    {
    722722        /* REX.B extends the Base field if not scaled index + disp32 */
    723         if (!(pCpu->SIB.Bits.Base == 5 && pCpu->ModRM.Bits.Mod == 0))
    724             pCpu->SIB.Bits.Base  |= ((!!(pCpu->fRexPrefix & DISPREFIX_REX_FLAGS_B)) << 3);
    725 
    726         pCpu->SIB.Bits.Index |= ((!!(pCpu->fRexPrefix & DISPREFIX_REX_FLAGS_X)) << 3);
    727     }
    728 
    729     if (    pCpu->SIB.Bits.Base == 5
    730         &&  pCpu->ModRM.Bits.Mod == 0)
     723        if (!(pDis->SIB.Bits.Base == 5 && pDis->ModRM.Bits.Mod == 0))
     724            pDis->SIB.Bits.Base  |= ((!!(pDis->fRexPrefix & DISPREFIX_REX_FLAGS_B)) << 3);
     725
     726        pDis->SIB.Bits.Index |= ((!!(pDis->fRexPrefix & DISPREFIX_REX_FLAGS_X)) << 3);
     727    }
     728
     729    if (    pDis->SIB.Bits.Base == 5
     730        &&  pDis->ModRM.Bits.Mod == 0)
    731731    {
    732732        /* Additional 32 bits displacement. No change in long mode. */
    733         pCpu->i32SibDisp = disReadDWord(pCpu, offInstr);
     733        pDis->i32SibDisp = disReadDWord(pDis, offInstr);
    734734        size += sizeof(int32_t);
    735735    }
     
    738738//*****************************************************************************
    739739//*****************************************************************************
    740 static size_t ParseSIB_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     740static size_t ParseSIB_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    741741{
    742742    unsigned size = sizeof(uint8_t);
     
    744744    NOREF(pOp); NOREF(pParam);
    745745
    746     SIB = disReadByte(pCpu, offInstr);
    747 
    748     pCpu->SIB.Bits.Base  = SIB_BASE(SIB);
    749     pCpu->SIB.Bits.Index = SIB_INDEX(SIB);
    750     pCpu->SIB.Bits.Scale = SIB_SCALE(SIB);
    751 
    752     if (pCpu->fPrefix & DISPREFIX_REX)
     746    SIB = disReadByte(pDis, offInstr);
     747
     748    pDis->SIB.Bits.Base  = SIB_BASE(SIB);
     749    pDis->SIB.Bits.Index = SIB_INDEX(SIB);
     750    pDis->SIB.Bits.Scale = SIB_SCALE(SIB);
     751
     752    if (pDis->fPrefix & DISPREFIX_REX)
    753753    {
    754754        /* REX.B extends the Base field. */
    755         pCpu->SIB.Bits.Base  |= ((!!(pCpu->fRexPrefix & DISPREFIX_REX_FLAGS_B)) << 3);
     755        pDis->SIB.Bits.Base  |= ((!!(pDis->fRexPrefix & DISPREFIX_REX_FLAGS_B)) << 3);
    756756        /* REX.X extends the Index field. */
    757         pCpu->SIB.Bits.Index |= ((!!(pCpu->fRexPrefix & DISPREFIX_REX_FLAGS_X)) << 3);
    758     }
    759 
    760     if (    pCpu->SIB.Bits.Base == 5
    761         &&  pCpu->ModRM.Bits.Mod == 0)
     757        pDis->SIB.Bits.Index |= ((!!(pDis->fRexPrefix & DISPREFIX_REX_FLAGS_X)) << 3);
     758    }
     759
     760    if (    pDis->SIB.Bits.Base == 5
     761        &&  pDis->ModRM.Bits.Mod == 0)
    762762    {
    763763        /* Additional 32 bits displacement. No change in long mode. */
     
    771771// Mod    Reg/Opcode  R/M
    772772//*****************************************************************************
    773 static size_t UseModRM(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     773static size_t UseModRM(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    774774{
    775775    unsigned vtype = OP_PARM_VTYPE(pParam->fParam);
    776     unsigned reg = pCpu->ModRM.Bits.Reg;
    777     unsigned mod = pCpu->ModRM.Bits.Mod;
    778     unsigned rm  = pCpu->ModRM.Bits.Rm;
     776    unsigned reg = pDis->ModRM.Bits.Reg;
     777    unsigned mod = pDis->ModRM.Bits.Mod;
     778    unsigned rm  = pDis->ModRM.Bits.Rm;
    779779
    780780    switch (vtype)
    781781    {
    782782    case OP_PARM_G: //general purpose register
    783         disasmModRMReg(pCpu, pOp, reg, pParam, 0);
     783        disasmModRMReg(pDis, pOp, reg, pParam, 0);
    784784        return 0;
    785785
     
    792792                pParam->fUse |= DISUSE_REG_CR;
    793793
    794                 if (    pCpu->pCurInstr->uOpcode == OP_MOV_CR
    795                     &&  pCpu->uOpMode == DISCPUMODE_32BIT
    796                     &&  (pCpu->fPrefix & DISPREFIX_LOCK))
     794                if (    pDis->pCurInstr->uOpcode == OP_MOV_CR
     795                    &&  pDis->uOpMode == DISCPUMODE_32BIT
     796                    &&  (pDis->fPrefix & DISPREFIX_LOCK))
    797797                {
    798                     pCpu->fPrefix &= ~DISPREFIX_LOCK;
     798                    pDis->fPrefix &= ~DISPREFIX_LOCK;
    799799                    pParam->Base.idxCtrlReg = DISCREG_CR8;
    800800                }
     
    816816            case OP_PARM_S: //segment register
    817817                reg &= 7;   /* REX.R has no effect here */
    818                 disasmModRMSReg(pCpu, pOp, reg, pParam);
     818                disasmModRMSReg(pDis, pOp, reg, pParam);
    819819                pParam->fUse |= DISUSE_REG_SEG;
    820820                return 0;
     
    842842    /* @todo bound */
    843843
    844     if (pCpu->uAddrMode != DISCPUMODE_16BIT)
    845     {
    846         Assert(pCpu->uAddrMode == DISCPUMODE_32BIT || pCpu->uAddrMode == DISCPUMODE_64BIT);
     844    if (pDis->uAddrMode != DISCPUMODE_16BIT)
     845    {
     846        Assert(pDis->uAddrMode == DISCPUMODE_32BIT || pDis->uAddrMode == DISCPUMODE_64BIT);
    847847
    848848        /*
     
    854854            if (rm == 4)
    855855            {   /* SIB byte follows ModRM */
    856                 UseSIB(offInstr, pOp, pParam, pCpu);
     856                UseSIB(offInstr, pOp, pParam, pDis);
    857857            }
    858858            else
     
    860860            {
    861861                /* 32 bits displacement */
    862                 if (pCpu->uCpuMode != DISCPUMODE_64BIT)
     862                if (pDis->uCpuMode != DISCPUMODE_64BIT)
    863863                {
    864864                    pParam->fUse |= DISUSE_DISPLACEMENT32;
    865                     pParam->uDisp.i32 = pCpu->i32SibDisp;
     865                    pParam->uDisp.i32 = pDis->i32SibDisp;
    866866                }
    867867                else
    868868                {
    869869                    pParam->fUse |= DISUSE_RIPDISPLACEMENT32;
    870                     pParam->uDisp.i32 = pCpu->i32SibDisp;
     870                    pParam->uDisp.i32 = pDis->i32SibDisp;
    871871                }
    872872            }
     
    874874            {   //register address
    875875                pParam->fUse |= DISUSE_BASE;
    876                 disasmModRMReg(pCpu, pOp, rm, pParam, 1);
     876                disasmModRMReg(pDis, pOp, rm, pParam, 1);
    877877            }
    878878            break;
     
    880880        case 1: //effective address + 8 bits displacement
    881881            if (rm == 4) {//SIB byte follows ModRM
    882                 UseSIB(offInstr, pOp, pParam, pCpu);
     882                UseSIB(offInstr, pOp, pParam, pDis);
    883883            }
    884884            else
    885885            {
    886886                pParam->fUse |= DISUSE_BASE;
    887                 disasmModRMReg(pCpu, pOp, rm, pParam, 1);
     887                disasmModRMReg(pDis, pOp, rm, pParam, 1);
    888888            }
    889             pParam->uDisp.i8 = pCpu->i32SibDisp;
     889            pParam->uDisp.i8 = pDis->i32SibDisp;
    890890            pParam->fUse |= DISUSE_DISPLACEMENT8;
    891891            break;
     
    893893        case 2: //effective address + 32 bits displacement
    894894            if (rm == 4) {//SIB byte follows ModRM
    895                 UseSIB(offInstr, pOp, pParam, pCpu);
     895                UseSIB(offInstr, pOp, pParam, pDis);
    896896            }
    897897            else
    898898            {
    899899                pParam->fUse |= DISUSE_BASE;
    900                 disasmModRMReg(pCpu, pOp, rm, pParam, 1);
     900                disasmModRMReg(pDis, pOp, rm, pParam, 1);
    901901            }
    902             pParam->uDisp.i32 = pCpu->i32SibDisp;
     902            pParam->uDisp.i32 = pDis->i32SibDisp;
    903903            pParam->fUse |= DISUSE_DISPLACEMENT32;
    904904            break;
    905905
    906906        case 3: //registers
    907             disasmModRMReg(pCpu, pOp, rm, pParam, 0);
     907            disasmModRMReg(pDis, pOp, rm, pParam, 0);
    908908            break;
    909909        }
     
    916916            if (rm == 6)
    917917            {//16 bits displacement
    918                 pParam->uDisp.i16 = pCpu->i32SibDisp;
     918                pParam->uDisp.i16 = pDis->i32SibDisp;
    919919                pParam->fUse |= DISUSE_DISPLACEMENT16;
    920920            }
     
    922922            {
    923923                pParam->fUse |= DISUSE_BASE;
    924                 disasmModRMReg16(pCpu, pOp, rm, pParam);
     924                disasmModRMReg16(pDis, pOp, rm, pParam);
    925925            }
    926926            break;
    927927
    928928        case 1: //effective address + 8 bits displacement
    929             disasmModRMReg16(pCpu, pOp, rm, pParam);
    930             pParam->uDisp.i8 = pCpu->i32SibDisp;
     929            disasmModRMReg16(pDis, pOp, rm, pParam);
     930            pParam->uDisp.i8 = pDis->i32SibDisp;
    931931            pParam->fUse |= DISUSE_BASE | DISUSE_DISPLACEMENT8;
    932932            break;
    933933
    934934        case 2: //effective address + 16 bits displacement
    935             disasmModRMReg16(pCpu, pOp, rm, pParam);
    936             pParam->uDisp.i16 = pCpu->i32SibDisp;
     935            disasmModRMReg16(pDis, pOp, rm, pParam);
     936            pParam->uDisp.i16 = pDis->i32SibDisp;
    937937            pParam->fUse |= DISUSE_BASE | DISUSE_DISPLACEMENT16;
    938938            break;
    939939
    940940        case 3: //registers
    941             disasmModRMReg(pCpu, pOp, rm, pParam, 0);
     941            disasmModRMReg(pDis, pOp, rm, pParam, 0);
    942942            break;
    943943        }
     
    948948// Query the size of the ModRM parameters and fetch the immediate data (if any)
    949949//*****************************************************************************
    950 static size_t QueryModRM(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu, size_t *pSibInc)
     950static size_t QueryModRM(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis, size_t *pSibInc)
    951951{
    952952    size_t sibinc;
    953953    size_t size = 0;
    954     // unsigned reg = pCpu->ModRM.Bits.Reg;
    955     unsigned mod = pCpu->ModRM.Bits.Mod;
    956     unsigned rm  = pCpu->ModRM.Bits.Rm;
     954    // unsigned reg = pDis->ModRM.Bits.Reg;
     955    unsigned mod = pDis->ModRM.Bits.Mod;
     956    unsigned rm  = pDis->ModRM.Bits.Rm;
    957957
    958958    if (!pSibInc)
     
    961961    *pSibInc = 0;
    962962
    963     if (pCpu->uAddrMode != DISCPUMODE_16BIT)
    964     {
    965         Assert(pCpu->uAddrMode == DISCPUMODE_32BIT || pCpu->uAddrMode == DISCPUMODE_64BIT);
     963    if (pDis->uAddrMode != DISCPUMODE_16BIT)
     964    {
     965        Assert(pDis->uAddrMode == DISCPUMODE_32BIT || pDis->uAddrMode == DISCPUMODE_64BIT);
    966966
    967967        /*
     
    970970        if (mod != 3 && rm == 4)
    971971        {   /* SIB byte follows ModRM */
    972             *pSibInc = ParseSIB(offInstr, pOp, pParam, pCpu);
     972            *pSibInc = ParseSIB(offInstr, pOp, pParam, pDis);
    973973            offInstr += *pSibInc;
    974974            size += *pSibInc;
     
    979979        case 0: /* Effective address */
    980980            if (rm == 5) {  /* 32 bits displacement */
    981                 pCpu->i32SibDisp = disReadDWord(pCpu, offInstr);
     981                pDis->i32SibDisp = disReadDWord(pDis, offInstr);
    982982                size += sizeof(int32_t);
    983983            }
     
    986986
    987987        case 1: /* Effective address + 8 bits displacement */
    988             pCpu->i32SibDisp = (int8_t)disReadByte(pCpu, offInstr);
     988            pDis->i32SibDisp = (int8_t)disReadByte(pDis, offInstr);
    989989            size += sizeof(char);
    990990            break;
    991991
    992992        case 2: /* Effective address + 32 bits displacement */
    993             pCpu->i32SibDisp = disReadDWord(pCpu, offInstr);
     993            pDis->i32SibDisp = disReadDWord(pDis, offInstr);
    994994            size += sizeof(int32_t);
    995995            break;
     
    10061006        case 0: /* Effective address */
    10071007            if (rm == 6) {
    1008                 pCpu->i32SibDisp = disReadWord(pCpu, offInstr);
     1008                pDis->i32SibDisp = disReadWord(pDis, offInstr);
    10091009                size += sizeof(uint16_t);
    10101010            }
     
    10131013
    10141014        case 1: /* Effective address + 8 bits displacement */
    1015             pCpu->i32SibDisp = (int8_t)disReadByte(pCpu, offInstr);
     1015            pDis->i32SibDisp = (int8_t)disReadByte(pDis, offInstr);
    10161016            size += sizeof(char);
    10171017            break;
    10181018
    10191019        case 2: /* Effective address + 32 bits displacement */
    1020             pCpu->i32SibDisp = (int16_t)disReadWord(pCpu, offInstr);
     1020            pDis->i32SibDisp = (int16_t)disReadWord(pDis, offInstr);
    10211021            size += sizeof(uint16_t);
    10221022            break;
     
    10311031// Query the size of the ModRM parameters and fetch the immediate data (if any)
    10321032//*****************************************************************************
    1033 static size_t QueryModRM_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu, size_t *pSibInc)
     1033static size_t QueryModRM_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis, size_t *pSibInc)
    10341034{
    10351035    size_t sibinc;
    10361036    size_t size = 0;
    1037     // unsigned reg = pCpu->ModRM.Bits.Reg;
    1038     unsigned mod = pCpu->ModRM.Bits.Mod;
    1039     unsigned rm  = pCpu->ModRM.Bits.Rm;
     1037    // unsigned reg = pDis->ModRM.Bits.Reg;
     1038    unsigned mod = pDis->ModRM.Bits.Mod;
     1039    unsigned rm  = pDis->ModRM.Bits.Rm;
    10401040
    10411041    if (!pSibInc)
     
    10441044    *pSibInc = 0;
    10451045
    1046     if (pCpu->uAddrMode != DISCPUMODE_16BIT)
    1047     {
    1048         Assert(pCpu->uAddrMode == DISCPUMODE_32BIT || pCpu->uAddrMode == DISCPUMODE_64BIT);
     1046    if (pDis->uAddrMode != DISCPUMODE_16BIT)
     1047    {
     1048        Assert(pDis->uAddrMode == DISCPUMODE_32BIT || pDis->uAddrMode == DISCPUMODE_64BIT);
    10491049        /*
    10501050         * Note: displacements in long mode are 8 or 32 bits and sign-extended to 64 bits
     
    10521052        if (mod != 3 && rm == 4)
    10531053        {   /* SIB byte follows ModRM */
    1054             *pSibInc = ParseSIB_SizeOnly(offInstr, pOp, pParam, pCpu);
     1054            *pSibInc = ParseSIB_SizeOnly(offInstr, pOp, pParam, pDis);
    10551055            offInstr += *pSibInc;
    10561056            size += *pSibInc;
     
    11061106//*****************************************************************************
    11071107//*****************************************************************************
    1108 static size_t ParseIllegal(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
    1109 {
    1110     NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pCpu);
     1108static size_t ParseIllegal(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
     1109{
     1110    NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pDis);
    11111111    AssertFailed();
    11121112    return 0;
     
    11141114//*****************************************************************************
    11151115//*****************************************************************************
    1116 static size_t ParseModRM(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1116static size_t ParseModRM(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    11171117{
    11181118    size_t size = sizeof(uint8_t);   //ModRM byte
    11191119    size_t sibinc;
    11201120
    1121     unsigned ModRM = disReadByte(pCpu, offInstr);
     1121    unsigned ModRM = disReadByte(pDis, offInstr);
    11221122    offInstr += sizeof(uint8_t);
    11231123
    1124     pCpu->ModRM.Bits.Rm  = MODRM_RM(ModRM);
    1125     pCpu->ModRM.Bits.Mod = MODRM_MOD(ModRM);
    1126     pCpu->ModRM.Bits.Reg = MODRM_REG(ModRM);
     1124    pDis->ModRM.Bits.Rm  = MODRM_RM(ModRM);
     1125    pDis->ModRM.Bits.Mod = MODRM_MOD(ModRM);
     1126    pDis->ModRM.Bits.Reg = MODRM_REG(ModRM);
    11271127
    11281128    /* Disregard the mod bits for certain instructions (mov crx, mov drx).
     
    11331133     */
    11341134    if (pOp->fOpType & DISOPTYPE_MOD_FIXED_11)
    1135         pCpu->ModRM.Bits.Mod = 3;
    1136 
    1137     if (pCpu->fPrefix & DISPREFIX_REX)
    1138     {
    1139         Assert(pCpu->uCpuMode == DISCPUMODE_64BIT);
     1135        pDis->ModRM.Bits.Mod = 3;
     1136
     1137    if (pDis->fPrefix & DISPREFIX_REX)
     1138    {
     1139        Assert(pDis->uCpuMode == DISCPUMODE_64BIT);
    11401140
    11411141        /* REX.R extends the Reg field. */
    1142         pCpu->ModRM.Bits.Reg |= ((!!(pCpu->fRexPrefix & DISPREFIX_REX_FLAGS_R)) << 3);
     1142        pDis->ModRM.Bits.Reg |= ((!!(pDis->fRexPrefix & DISPREFIX_REX_FLAGS_R)) << 3);
    11431143
    11441144        /* REX.B extends the Rm field if there is no SIB byte nor a 32 bits displacement */
    1145         if (!(    pCpu->ModRM.Bits.Mod != 3
    1146               &&  pCpu->ModRM.Bits.Rm  == 4)
     1145        if (!(    pDis->ModRM.Bits.Mod != 3
     1146              &&  pDis->ModRM.Bits.Rm  == 4)
    11471147            &&
    1148             !(    pCpu->ModRM.Bits.Mod == 0
    1149               &&  pCpu->ModRM.Bits.Rm  == 5))
     1148            !(    pDis->ModRM.Bits.Mod == 0
     1149              &&  pDis->ModRM.Bits.Rm  == 5))
    11501150        {
    1151             pCpu->ModRM.Bits.Rm |= ((!!(pCpu->fRexPrefix & DISPREFIX_REX_FLAGS_B)) << 3);
    1152         }
    1153     }
    1154     size += QueryModRM(offInstr, pOp, pParam, pCpu, &sibinc);
     1151            pDis->ModRM.Bits.Rm |= ((!!(pDis->fRexPrefix & DISPREFIX_REX_FLAGS_B)) << 3);
     1152        }
     1153    }
     1154    size += QueryModRM(offInstr, pOp, pParam, pDis, &sibinc);
    11551155    offInstr += sibinc;
    11561156
    1157     UseModRM(offInstr, pOp, pParam, pCpu);
     1157    UseModRM(offInstr, pOp, pParam, pDis);
    11581158    return size;
    11591159}
    11601160//*****************************************************************************
    11611161//*****************************************************************************
    1162 static size_t ParseModRM_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1162static size_t ParseModRM_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    11631163{
    11641164    size_t size = sizeof(uint8_t);   //ModRM byte
    11651165    size_t sibinc;
    11661166
    1167     unsigned ModRM = disReadByte(pCpu, offInstr);
     1167    unsigned ModRM = disReadByte(pDis, offInstr);
    11681168    offInstr += sizeof(uint8_t);
    11691169
    1170     pCpu->ModRM.Bits.Rm  = MODRM_RM(ModRM);
    1171     pCpu->ModRM.Bits.Mod = MODRM_MOD(ModRM);
    1172     pCpu->ModRM.Bits.Reg = MODRM_REG(ModRM);
     1170    pDis->ModRM.Bits.Rm  = MODRM_RM(ModRM);
     1171    pDis->ModRM.Bits.Mod = MODRM_MOD(ModRM);
     1172    pDis->ModRM.Bits.Reg = MODRM_REG(ModRM);
    11731173
    11741174    /* Disregard the mod bits for certain instructions (mov crx, mov drx).
     
    11791179     */
    11801180    if (pOp->fOpType & DISOPTYPE_MOD_FIXED_11)
    1181         pCpu->ModRM.Bits.Mod = 3;
    1182 
    1183     if (pCpu->fPrefix & DISPREFIX_REX)
    1184     {
    1185         Assert(pCpu->uCpuMode == DISCPUMODE_64BIT);
     1181        pDis->ModRM.Bits.Mod = 3;
     1182
     1183    if (pDis->fPrefix & DISPREFIX_REX)
     1184    {
     1185        Assert(pDis->uCpuMode == DISCPUMODE_64BIT);
    11861186
    11871187        /* REX.R extends the Reg field. */
    1188         pCpu->ModRM.Bits.Reg |= ((!!(pCpu->fRexPrefix & DISPREFIX_REX_FLAGS_R)) << 3);
     1188        pDis->ModRM.Bits.Reg |= ((!!(pDis->fRexPrefix & DISPREFIX_REX_FLAGS_R)) << 3);
    11891189
    11901190        /* REX.B extends the Rm field if there is no SIB byte nor a 32 bits displacement */
    1191         if (!(    pCpu->ModRM.Bits.Mod != 3
    1192               &&  pCpu->ModRM.Bits.Rm  == 4)
     1191        if (!(    pDis->ModRM.Bits.Mod != 3
     1192              &&  pDis->ModRM.Bits.Rm  == 4)
    11931193            &&
    1194             !(    pCpu->ModRM.Bits.Mod == 0
    1195               &&  pCpu->ModRM.Bits.Rm  == 5))
     1194            !(    pDis->ModRM.Bits.Mod == 0
     1195              &&  pDis->ModRM.Bits.Rm  == 5))
    11961196        {
    1197             pCpu->ModRM.Bits.Rm |= ((!!(pCpu->fRexPrefix & DISPREFIX_REX_FLAGS_B)) << 3);
    1198         }
    1199     }
    1200 
    1201     size += QueryModRM_SizeOnly(offInstr, pOp, pParam, pCpu, &sibinc);
     1197            pDis->ModRM.Bits.Rm |= ((!!(pDis->fRexPrefix & DISPREFIX_REX_FLAGS_B)) << 3);
     1198        }
     1199    }
     1200
     1201    size += QueryModRM_SizeOnly(offInstr, pOp, pParam, pDis, &sibinc);
    12021202    offInstr += sibinc;
    12031203
     
    12071207//*****************************************************************************
    12081208//*****************************************************************************
    1209 static size_t ParseModFence(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1209static size_t ParseModFence(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    12101210{
    12111211    ////AssertMsgFailed(("??\n"));
    12121212    //nothing to do apparently
    1213     NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pCpu);
     1213    NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pDis);
    12141214    return 0;
    12151215}
    12161216//*****************************************************************************
    12171217//*****************************************************************************
    1218 static size_t ParseImmByte(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1218static size_t ParseImmByte(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    12191219{
    12201220    NOREF(pOp);
    1221     pParam->uValue = disReadByte(pCpu, offInstr);
     1221    pParam->uValue = disReadByte(pDis, offInstr);
    12221222    pParam->fUse  |= DISUSE_IMMEDIATE8;
    12231223    pParam->cb     = sizeof(uint8_t);
     
    12261226//*****************************************************************************
    12271227//*****************************************************************************
    1228 static size_t ParseImmByte_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
    1229 {
    1230     NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pCpu);
     1228static size_t ParseImmByte_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
     1229{
     1230    NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pDis);
    12311231    return sizeof(uint8_t);
    12321232}
    12331233//*****************************************************************************
    12341234//*****************************************************************************
    1235 static size_t ParseImmByteSX(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1235static size_t ParseImmByteSX(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    12361236{
    12371237    NOREF(pOp);
    1238     if (pCpu->uOpMode == DISCPUMODE_32BIT)
    1239     {
    1240         pParam->uValue = (uint32_t)(int8_t)disReadByte(pCpu, offInstr);
     1238    if (pDis->uOpMode == DISCPUMODE_32BIT)
     1239    {
     1240        pParam->uValue = (uint32_t)(int8_t)disReadByte(pDis, offInstr);
    12411241        pParam->fUse  |= DISUSE_IMMEDIATE32_SX8;
    12421242        pParam->cb     = sizeof(uint32_t);
    12431243    }
    12441244    else
    1245     if (pCpu->uOpMode == DISCPUMODE_64BIT)
    1246     {
    1247         pParam->uValue = (uint64_t)(int8_t)disReadByte(pCpu, offInstr);
     1245    if (pDis->uOpMode == DISCPUMODE_64BIT)
     1246    {
     1247        pParam->uValue = (uint64_t)(int8_t)disReadByte(pDis, offInstr);
    12481248        pParam->fUse  |= DISUSE_IMMEDIATE64_SX8;
    12491249        pParam->cb     = sizeof(uint64_t);
     
    12511251    else
    12521252    {
    1253         pParam->uValue = (uint16_t)(int8_t)disReadByte(pCpu, offInstr);
     1253        pParam->uValue = (uint16_t)(int8_t)disReadByte(pDis, offInstr);
    12541254        pParam->fUse  |= DISUSE_IMMEDIATE16_SX8;
    12551255        pParam->cb     = sizeof(uint16_t);
     
    12591259//*****************************************************************************
    12601260//*****************************************************************************
    1261 static size_t ParseImmByteSX_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
    1262 {
    1263     NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pCpu);
     1261static size_t ParseImmByteSX_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
     1262{
     1263    NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pDis);
    12641264    return sizeof(uint8_t);
    12651265}
    12661266//*****************************************************************************
    12671267//*****************************************************************************
    1268 static size_t ParseImmUshort(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1268static size_t ParseImmUshort(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    12691269{
    12701270    NOREF(pOp);
    1271     pParam->uValue = disReadWord(pCpu, offInstr);
     1271    pParam->uValue = disReadWord(pDis, offInstr);
    12721272    pParam->fUse  |= DISUSE_IMMEDIATE16;
    12731273    pParam->cb     = sizeof(uint16_t);
     
    12761276//*****************************************************************************
    12771277//*****************************************************************************
    1278 static size_t ParseImmUshort_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
    1279 {
    1280     NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pCpu);
     1278static size_t ParseImmUshort_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
     1279{
     1280    NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pDis);
    12811281    return sizeof(uint16_t);
    12821282}
    12831283//*****************************************************************************
    12841284//*****************************************************************************
    1285 static size_t ParseImmUlong(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1285static size_t ParseImmUlong(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    12861286{
    12871287    NOREF(pOp);
    1288     pParam->uValue = disReadDWord(pCpu, offInstr);
     1288    pParam->uValue = disReadDWord(pDis, offInstr);
    12891289    pParam->fUse  |= DISUSE_IMMEDIATE32;
    12901290    pParam->cb     = sizeof(uint32_t);
     
    12931293//*****************************************************************************
    12941294//*****************************************************************************
    1295 static size_t ParseImmUlong_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
    1296 {
    1297     NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pCpu);
     1295static size_t ParseImmUlong_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
     1296{
     1297    NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pDis);
    12981298    return sizeof(uint32_t);
    12991299}
    13001300//*****************************************************************************
    13011301//*****************************************************************************
    1302 static size_t ParseImmQword(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1302static size_t ParseImmQword(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    13031303{
    13041304    NOREF(pOp);
    1305     pParam->uValue = disReadQWord(pCpu, offInstr);
     1305    pParam->uValue = disReadQWord(pDis, offInstr);
    13061306    pParam->fUse  |= DISUSE_IMMEDIATE64;
    13071307    pParam->cb     = sizeof(uint64_t);
     
    13101310//*****************************************************************************
    13111311//*****************************************************************************
    1312 static size_t ParseImmQword_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
    1313 {
    1314     NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pCpu);
     1312static size_t ParseImmQword_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
     1313{
     1314    NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pDis);
    13151315    return sizeof(uint64_t);
    13161316}
    13171317//*****************************************************************************
    13181318//*****************************************************************************
    1319 static size_t ParseImmV(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1319static size_t ParseImmV(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    13201320{
    13211321    NOREF(pOp);
    1322     if (pCpu->uOpMode == DISCPUMODE_32BIT)
    1323     {
    1324         pParam->uValue = disReadDWord(pCpu, offInstr);
     1322    if (pDis->uOpMode == DISCPUMODE_32BIT)
     1323    {
     1324        pParam->uValue = disReadDWord(pDis, offInstr);
    13251325        pParam->fUse  |= DISUSE_IMMEDIATE32;
    13261326        pParam->cb     = sizeof(uint32_t);
     
    13281328    }
    13291329
    1330     if (pCpu->uOpMode == DISCPUMODE_64BIT)
    1331     {
    1332         pParam->uValue = disReadQWord(pCpu, offInstr);
     1330    if (pDis->uOpMode == DISCPUMODE_64BIT)
     1331    {
     1332        pParam->uValue = disReadQWord(pDis, offInstr);
    13331333        pParam->fUse  |= DISUSE_IMMEDIATE64;
    13341334        pParam->cb     = sizeof(uint64_t);
     
    13361336    }
    13371337
    1338     pParam->uValue = disReadWord(pCpu, offInstr);
     1338    pParam->uValue = disReadWord(pDis, offInstr);
    13391339    pParam->fUse  |= DISUSE_IMMEDIATE16;
    13401340    pParam->cb     = sizeof(uint16_t);
     
    13431343//*****************************************************************************
    13441344//*****************************************************************************
    1345 static size_t ParseImmV_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1345static size_t ParseImmV_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    13461346{
    13471347    NOREF(offInstr); NOREF(pOp); NOREF(pParam);
    1348     if (pCpu->uOpMode == DISCPUMODE_32BIT)
     1348    if (pDis->uOpMode == DISCPUMODE_32BIT)
    13491349        return sizeof(uint32_t);
    1350     if (pCpu->uOpMode == DISCPUMODE_64BIT)
     1350    if (pDis->uOpMode == DISCPUMODE_64BIT)
    13511351        return sizeof(uint64_t);
    13521352    return sizeof(uint16_t);
     
    13541354//*****************************************************************************
    13551355//*****************************************************************************
    1356 static size_t ParseImmZ(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1356static size_t ParseImmZ(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    13571357{
    13581358    NOREF(pOp);
    13591359    /* Word for 16-bit operand-size or doubleword for 32 or 64-bit operand-size. */
    1360     if (pCpu->uOpMode == DISCPUMODE_16BIT)
    1361     {
    1362         pParam->uValue = disReadWord(pCpu, offInstr);
     1360    if (pDis->uOpMode == DISCPUMODE_16BIT)
     1361    {
     1362        pParam->uValue = disReadWord(pDis, offInstr);
    13631363        pParam->fUse  |= DISUSE_IMMEDIATE16;
    13641364        pParam->cb     = sizeof(uint16_t);
     
    13671367
    13681368    /* 64 bits op mode means *sign* extend to 64 bits. */
    1369     if (pCpu->uOpMode == DISCPUMODE_64BIT)
    1370     {
    1371         pParam->uValue = (uint64_t)(int32_t)disReadDWord(pCpu, offInstr);
     1369    if (pDis->uOpMode == DISCPUMODE_64BIT)
     1370    {
     1371        pParam->uValue = (uint64_t)(int32_t)disReadDWord(pDis, offInstr);
    13721372        pParam->fUse  |= DISUSE_IMMEDIATE64;
    13731373        pParam->cb     = sizeof(uint64_t);
     
    13751375    else
    13761376    {
    1377         pParam->uValue = disReadDWord(pCpu, offInstr);
     1377        pParam->uValue = disReadDWord(pDis, offInstr);
    13781378        pParam->fUse  |= DISUSE_IMMEDIATE32;
    13791379        pParam->cb     = sizeof(uint32_t);
     
    13831383//*****************************************************************************
    13841384//*****************************************************************************
    1385 static size_t ParseImmZ_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1385static size_t ParseImmZ_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    13861386{
    13871387    NOREF(offInstr); NOREF(pOp); NOREF(pParam);
    13881388    /* Word for 16-bit operand-size or doubleword for 32 or 64-bit operand-size. */
    1389     if (pCpu->uOpMode == DISCPUMODE_16BIT)
     1389    if (pDis->uOpMode == DISCPUMODE_16BIT)
    13901390        return sizeof(uint16_t);
    13911391    return sizeof(uint32_t);
     
    13951395// Relative displacement for branches (rel. to next instruction)
    13961396//*****************************************************************************
    1397 static size_t ParseImmBRel(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1397static size_t ParseImmBRel(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    13981398{
    13991399    NOREF(pOp);
    1400     pParam->uValue = disReadByte(pCpu, offInstr);
     1400    pParam->uValue = disReadByte(pDis, offInstr);
    14011401    pParam->fUse  |= DISUSE_IMMEDIATE8_REL;
    14021402    pParam->cb     = sizeof(uint8_t);
     
    14061406// Relative displacement for branches (rel. to next instruction)
    14071407//*****************************************************************************
    1408 static size_t ParseImmBRel_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
    1409 {
    1410     NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pCpu);
     1408static size_t ParseImmBRel_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
     1409{
     1410    NOREF(offInstr); NOREF(pOp); NOREF(pParam); NOREF(pDis);
    14111411    return sizeof(char);
    14121412}
     
    14141414// Relative displacement for branches (rel. to next instruction)
    14151415//*****************************************************************************
    1416 static size_t ParseImmVRel(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1416static size_t ParseImmVRel(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    14171417{
    14181418    NOREF(pOp);
    1419     if (pCpu->uOpMode == DISCPUMODE_32BIT)
    1420     {
    1421         pParam->uValue = disReadDWord(pCpu, offInstr);
     1419    if (pDis->uOpMode == DISCPUMODE_32BIT)
     1420    {
     1421        pParam->uValue = disReadDWord(pDis, offInstr);
    14221422        pParam->fUse  |= DISUSE_IMMEDIATE32_REL;
    14231423        pParam->cb     = sizeof(int32_t);
     
    14251425    }
    14261426
    1427     if (pCpu->uOpMode == DISCPUMODE_64BIT)
     1427    if (pDis->uOpMode == DISCPUMODE_64BIT)
    14281428    {
    14291429        /* 32 bits relative immediate sign extended to 64 bits. */
    1430         pParam->uValue = (uint64_t)(int32_t)disReadDWord(pCpu, offInstr);
     1430        pParam->uValue = (uint64_t)(int32_t)disReadDWord(pDis, offInstr);
    14311431        pParam->fUse  |= DISUSE_IMMEDIATE64_REL;
    14321432        pParam->cb     = sizeof(int64_t);
     
    14341434    }
    14351435
    1436     pParam->uValue = disReadWord(pCpu, offInstr);
     1436    pParam->uValue = disReadWord(pDis, offInstr);
    14371437    pParam->fUse  |= DISUSE_IMMEDIATE16_REL;
    14381438    pParam->cb     = sizeof(int16_t);
     
    14421442// Relative displacement for branches (rel. to next instruction)
    14431443//*****************************************************************************
    1444 static size_t ParseImmVRel_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1444static size_t ParseImmVRel_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    14451445{
    14461446    NOREF(offInstr); NOREF(pOp); NOREF(pParam);
    1447     if (pCpu->uOpMode == DISCPUMODE_16BIT)
     1447    if (pDis->uOpMode == DISCPUMODE_16BIT)
    14481448        return sizeof(int16_t);
    14491449    /* Both 32 & 64 bits mode use 32 bits relative immediates. */
     
    14521452//*****************************************************************************
    14531453//*****************************************************************************
    1454 static size_t ParseImmAddr(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
    1455 {
    1456     if (pCpu->uAddrMode == DISCPUMODE_32BIT)
     1454static size_t ParseImmAddr(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
     1455{
     1456    if (pDis->uAddrMode == DISCPUMODE_32BIT)
    14571457    {
    14581458        if (OP_PARM_VSUBTYPE(pParam->fParam) == OP_PARM_p)
    14591459        {
    14601460            /* far 16:32 pointer */
    1461             pParam->uValue = disReadDWord(pCpu, offInstr);
    1462             *((uint32_t*)&pParam->uValue+1) = disReadWord(pCpu, offInstr+sizeof(uint32_t));
     1461            pParam->uValue = disReadDWord(pDis, offInstr);
     1462            *((uint32_t*)&pParam->uValue+1) = disReadWord(pDis, offInstr+sizeof(uint32_t));
    14631463            pParam->fUse   |= DISUSE_IMMEDIATE_ADDR_16_32;
    14641464            pParam->cb     = sizeof(uint16_t) + sizeof(uint32_t);
     
    14721472         * so we treat it like displacement.
    14731473         */
    1474         pParam->uDisp.i32 = disReadDWord(pCpu, offInstr);
     1474        pParam->uDisp.i32 = disReadDWord(pDis, offInstr);
    14751475        pParam->fUse  |= DISUSE_DISPLACEMENT32;
    14761476        pParam->cb     = sizeof(uint32_t);
     
    14781478    }
    14791479
    1480     if (pCpu->uAddrMode == DISCPUMODE_64BIT)
     1480    if (pDis->uAddrMode == DISCPUMODE_64BIT)
    14811481    {
    14821482        Assert(OP_PARM_VSUBTYPE(pParam->fParam) != OP_PARM_p);
     
    14871487         * so we treat it like displacement.
    14881488         */
    1489         pParam->uDisp.i64 = disReadQWord(pCpu, offInstr);
     1489        pParam->uDisp.i64 = disReadQWord(pDis, offInstr);
    14901490        pParam->fUse  |= DISUSE_DISPLACEMENT64;
    14911491        pParam->cb     = sizeof(uint64_t);
     
    14951495    {
    14961496        /* far 16:16 pointer */
    1497         pParam->uValue = disReadDWord(pCpu, offInstr);
     1497        pParam->uValue = disReadDWord(pDis, offInstr);
    14981498        pParam->fUse  |= DISUSE_IMMEDIATE_ADDR_16_16;
    14991499        pParam->cb     = 2*sizeof(uint16_t);
     
    15071507     * so we treat it like displacement.
    15081508     */
    1509     pParam->uDisp.i16 = disReadWord(pCpu, offInstr);
     1509    pParam->uDisp.i16 = disReadWord(pDis, offInstr);
    15101510    pParam->fUse  |= DISUSE_DISPLACEMENT16;
    15111511    pParam->cb     = sizeof(uint16_t);
     
    15141514//*****************************************************************************
    15151515//*****************************************************************************
    1516 static size_t ParseImmAddr_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1516static size_t ParseImmAddr_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    15171517{
    15181518    NOREF(offInstr); NOREF(pOp);
    1519     if (pCpu->uAddrMode == DISCPUMODE_32BIT)
     1519    if (pDis->uAddrMode == DISCPUMODE_32BIT)
    15201520    {
    15211521        if (OP_PARM_VSUBTYPE(pParam->fParam) == OP_PARM_p)
     
    15281528        }
    15291529    }
    1530     if (pCpu->uAddrMode == DISCPUMODE_64BIT)
     1530    if (pDis->uAddrMode == DISCPUMODE_64BIT)
    15311531    {
    15321532        Assert(OP_PARM_VSUBTYPE(pParam->fParam) != OP_PARM_p);
     
    15471547//*****************************************************************************
    15481548//*****************************************************************************
    1549 static size_t ParseImmAddrF(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1549static size_t ParseImmAddrF(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    15501550{
    15511551    // immediate far pointers - only 16:16 or 16:32; determined by operand, *not* address size!
    1552     Assert(pCpu->uOpMode == DISCPUMODE_16BIT || pCpu->uOpMode == DISCPUMODE_32BIT);
     1552    Assert(pDis->uOpMode == DISCPUMODE_16BIT || pDis->uOpMode == DISCPUMODE_32BIT);
    15531553    Assert(OP_PARM_VSUBTYPE(pParam->fParam) == OP_PARM_p);
    1554     if (pCpu->uOpMode == DISCPUMODE_32BIT)
     1554    if (pDis->uOpMode == DISCPUMODE_32BIT)
    15551555    {
    15561556        // far 16:32 pointer
    1557         pParam->uValue = disReadDWord(pCpu, offInstr);
    1558         *((uint32_t*)&pParam->uValue+1) = disReadWord(pCpu, offInstr+sizeof(uint32_t));
     1557        pParam->uValue = disReadDWord(pDis, offInstr);
     1558        *((uint32_t*)&pParam->uValue+1) = disReadWord(pDis, offInstr+sizeof(uint32_t));
    15591559        pParam->fUse   |= DISUSE_IMMEDIATE_ADDR_16_32;
    15601560        pParam->cb     = sizeof(uint16_t) + sizeof(uint32_t);
     
    15631563
    15641564    // far 16:16 pointer
    1565     pParam->uValue = disReadDWord(pCpu, offInstr);
     1565    pParam->uValue = disReadDWord(pDis, offInstr);
    15661566    pParam->fUse  |= DISUSE_IMMEDIATE_ADDR_16_16;
    15671567    pParam->cb     = 2*sizeof(uint16_t);
     
    15701570//*****************************************************************************
    15711571//*****************************************************************************
    1572 static size_t ParseImmAddrF_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1572static size_t ParseImmAddrF_SizeOnly(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    15731573{
    15741574    NOREF(offInstr); NOREF(pOp);
    15751575    // immediate far pointers - only 16:16 or 16:32
    1576     Assert(pCpu->uOpMode == DISCPUMODE_16BIT || pCpu->uOpMode == DISCPUMODE_32BIT);
     1576    Assert(pDis->uOpMode == DISCPUMODE_16BIT || pDis->uOpMode == DISCPUMODE_32BIT);
    15771577    Assert(OP_PARM_VSUBTYPE(pParam->fParam) == OP_PARM_p);
    1578     if (pCpu->uOpMode == DISCPUMODE_32BIT)
     1578    if (pDis->uOpMode == DISCPUMODE_32BIT)
    15791579    {
    15801580        // far 16:32 pointer
     
    15891589//*****************************************************************************
    15901590//*****************************************************************************
    1591 static size_t ParseFixedReg(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1591static size_t ParseFixedReg(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    15921592{
    15931593    NOREF(offInstr);
     
    16111611    {
    16121612        /* 32-bit EAX..EDI registers. */
    1613         if (pCpu->uOpMode == DISCPUMODE_32BIT)
     1613        if (pDis->uOpMode == DISCPUMODE_32BIT)
    16141614        {
    16151615            /* Use 32-bit registers. */
     
    16191619        }
    16201620        else
    1621         if (pCpu->uOpMode == DISCPUMODE_64BIT)
     1621        if (pDis->uOpMode == DISCPUMODE_64BIT)
    16221622        {
    16231623            /* Use 64-bit registers. */
    16241624            pParam->Base.idxGenReg = pParam->fParam - OP_PARM_REG_GEN32_START;
    16251625            if (    (pOp->fOpType & DISOPTYPE_REXB_EXTENDS_OPREG)
    1626                 &&  pParam == &pCpu->Param1             /* ugly assumption that it only applies to the first parameter */
    1627                 &&  (pCpu->fPrefix & DISPREFIX_REX)
    1628                 &&  (pCpu->fRexPrefix & DISPREFIX_REX_FLAGS))
     1626                &&  pParam == &pDis->Param1             /* ugly assumption that it only applies to the first parameter */
     1627                &&  (pDis->fPrefix & DISPREFIX_REX)
     1628                &&  (pDis->fRexPrefix & DISPREFIX_REX_FLAGS))
    16291629                pParam->Base.idxGenReg += 8;
    16301630
     
    16651665        pParam->cb     = 1;
    16661666
    1667         if (pCpu->uOpMode == DISCPUMODE_64BIT)
     1667        if (pDis->uOpMode == DISCPUMODE_64BIT)
    16681668        {
    16691669            if (    (pOp->fOpType & DISOPTYPE_REXB_EXTENDS_OPREG)
    1670                 &&  pParam == &pCpu->Param1             /* ugly assumption that it only applies to the first parameter */
    1671                 &&  (pCpu->fPrefix & DISPREFIX_REX)
    1672                 &&  (pCpu->fRexPrefix & DISPREFIX_REX_FLAGS))
     1670                &&  pParam == &pDis->Param1             /* ugly assumption that it only applies to the first parameter */
     1671                &&  (pDis->fPrefix & DISPREFIX_REX)
     1672                &&  (pDis->fRexPrefix & DISPREFIX_REX_FLAGS))
    16731673                pParam->Base.idxGenReg += 8;              /* least significant byte of R8-R15 */
    16741674        }
     
    16901690//*****************************************************************************
    16911691//*****************************************************************************
    1692 static size_t ParseXv(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1692static size_t ParseXv(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    16931693{
    16941694    NOREF(offInstr);
    16951695
    16961696    pParam->fUse |= DISUSE_POINTER_DS_BASED;
    1697     if (pCpu->uAddrMode == DISCPUMODE_32BIT)
     1697    if (pDis->uAddrMode == DISCPUMODE_32BIT)
    16981698    {
    16991699        pParam->Base.idxGenReg = DISGREG_ESI;
     
    17011701    }
    17021702    else
    1703     if (pCpu->uAddrMode == DISCPUMODE_64BIT)
     1703    if (pDis->uAddrMode == DISCPUMODE_64BIT)
    17041704    {
    17051705        pParam->Base.idxGenReg = DISGREG_RSI;
     
    17151715//*****************************************************************************
    17161716//*****************************************************************************
    1717 static size_t ParseXb(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1717static size_t ParseXb(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    17181718{
    17191719    NOREF(offInstr); NOREF(pOp);
    17201720
    17211721    pParam->fUse |= DISUSE_POINTER_DS_BASED;
    1722     if (pCpu->uAddrMode == DISCPUMODE_32BIT)
     1722    if (pDis->uAddrMode == DISCPUMODE_32BIT)
    17231723    {
    17241724        pParam->Base.idxGenReg = DISGREG_ESI;
     
    17261726    }
    17271727    else
    1728     if (pCpu->uAddrMode == DISCPUMODE_64BIT)
     1728    if (pDis->uAddrMode == DISCPUMODE_64BIT)
    17291729    {
    17301730        pParam->Base.idxGenReg = DISGREG_RSI;
     
    17401740//*****************************************************************************
    17411741//*****************************************************************************
    1742 static size_t ParseYv(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1742static size_t ParseYv(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    17431743{
    17441744    NOREF(offInstr);
    17451745
    17461746    pParam->fUse |= DISUSE_POINTER_ES_BASED;
    1747     if (pCpu->uAddrMode == DISCPUMODE_32BIT)
     1747    if (pDis->uAddrMode == DISCPUMODE_32BIT)
    17481748    {
    17491749        pParam->Base.idxGenReg = DISGREG_EDI;
     
    17511751    }
    17521752    else
    1753     if (pCpu->uAddrMode == DISCPUMODE_64BIT)
     1753    if (pDis->uAddrMode == DISCPUMODE_64BIT)
    17541754    {
    17551755        pParam->Base.idxGenReg = DISGREG_RDI;
     
    17651765//*****************************************************************************
    17661766//*****************************************************************************
    1767 static size_t ParseYb(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1767static size_t ParseYb(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    17681768{
    17691769    NOREF(offInstr); NOREF(pOp);
    17701770
    17711771    pParam->fUse |= DISUSE_POINTER_ES_BASED;
    1772     if (pCpu->uAddrMode == DISCPUMODE_32BIT)
     1772    if (pDis->uAddrMode == DISCPUMODE_32BIT)
    17731773    {
    17741774        pParam->Base.idxGenReg = DISGREG_EDI;
     
    17761776    }
    17771777    else
    1778     if (pCpu->uAddrMode == DISCPUMODE_64BIT)
     1778    if (pDis->uAddrMode == DISCPUMODE_64BIT)
    17791779    {
    17801780        pParam->Base.idxGenReg = DISGREG_RDI;
     
    17901790//*****************************************************************************
    17911791//*****************************************************************************
    1792 static size_t ParseTwoByteEsc(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1792static size_t ParseTwoByteEsc(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    17931793{
    17941794    PCDISOPCODE   pOpcode;
     
    17971797
    17981798    /* 2nd byte */
    1799     pCpu->bOpCode = disReadByte(pCpu, offInstr);
     1799    pDis->bOpCode = disReadByte(pDis, offInstr);
    18001800
    18011801    /* default to the non-prefixed table. */
    1802     pOpcode      = &g_aTwoByteMapX86[pCpu->bOpCode];
     1802    pOpcode      = &g_aTwoByteMapX86[pDis->bOpCode];
    18031803
    18041804    /* Handle opcode table extensions that rely on the address, repe or repne prefix byte.  */
    18051805    /** @todo Should we take the first or last prefix byte in case of multiple prefix bytes??? */
    1806     if (pCpu->bLastPrefix)
    1807     {
    1808         switch (pCpu->bLastPrefix)
     1806    if (pDis->bLastPrefix)
     1807    {
     1808        switch (pDis->bLastPrefix)
    18091809        {
    18101810        case OP_OPSIZE: /* 0x66 */
    1811             if (g_aTwoByteMapX86_PF66[pCpu->bOpCode].uOpcode != OP_INVALID)
     1811            if (g_aTwoByteMapX86_PF66[pDis->bOpCode].uOpcode != OP_INVALID)
    18121812            {
    18131813                /* Table entry is valid, so use the extension table. */
    1814                 pOpcode = &g_aTwoByteMapX86_PF66[pCpu->bOpCode];
     1814                pOpcode = &g_aTwoByteMapX86_PF66[pDis->bOpCode];
    18151815
    18161816                /* Cancel prefix changes. */
    1817                 pCpu->fPrefix &= ~DISPREFIX_OPSIZE;
    1818                 pCpu->uOpMode  = pCpu->uCpuMode;
     1817                pDis->fPrefix &= ~DISPREFIX_OPSIZE;
     1818                pDis->uOpMode  = pDis->uCpuMode;
    18191819            }
    18201820            break;
    18211821
    18221822        case OP_REPNE:   /* 0xF2 */
    1823             if (g_aTwoByteMapX86_PFF2[pCpu->bOpCode].uOpcode != OP_INVALID)
     1823            if (g_aTwoByteMapX86_PFF2[pDis->bOpCode].uOpcode != OP_INVALID)
    18241824            {
    18251825                /* Table entry is valid, so use the extension table. */
    1826                 pOpcode = &g_aTwoByteMapX86_PFF2[pCpu->bOpCode];
     1826                pOpcode = &g_aTwoByteMapX86_PFF2[pDis->bOpCode];
    18271827
    18281828                /* Cancel prefix changes. */
    1829                 pCpu->fPrefix &= ~DISPREFIX_REPNE;
     1829                pDis->fPrefix &= ~DISPREFIX_REPNE;
    18301830            }
    18311831            break;
    18321832
    18331833        case OP_REPE:  /* 0xF3 */
    1834             if (g_aTwoByteMapX86_PFF3[pCpu->bOpCode].uOpcode != OP_INVALID)
     1834            if (g_aTwoByteMapX86_PFF3[pDis->bOpCode].uOpcode != OP_INVALID)
    18351835            {
    18361836                /* Table entry is valid, so use the extension table. */
    1837                 pOpcode = &g_aTwoByteMapX86_PFF3[pCpu->bOpCode];
     1837                pOpcode = &g_aTwoByteMapX86_PFF3[pDis->bOpCode];
    18381838
    18391839                /* Cancel prefix changes. */
    1840                 pCpu->fPrefix &= ~DISPREFIX_REP;
     1840                pDis->fPrefix &= ~DISPREFIX_REP;
    18411841            }
    18421842            break;
     
    18441844    }
    18451845
    1846     size += disParseInstruction(offInstr+size, pOpcode, pCpu);
     1846    size += disParseInstruction(offInstr+size, pOpcode, pDis);
    18471847    return size;
    18481848}
    18491849//*****************************************************************************
    18501850//*****************************************************************************
    1851 static size_t ParseThreeByteEsc4(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1851static size_t ParseThreeByteEsc4(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    18521852{
    18531853    PCDISOPCODE   pOpcode;
     
    18561856
    18571857    /* 3rd byte */
    1858     pCpu->bOpCode = disReadByte(pCpu, offInstr);
     1858    pDis->bOpCode = disReadByte(pDis, offInstr);
    18591859
    18601860    /* default to the non-prefixed table. */
    1861     if (g_apThreeByteMapX86_0F38[pCpu->bOpCode >> 4])
    1862     {
    1863         pOpcode = g_apThreeByteMapX86_0F38[pCpu->bOpCode >> 4];
    1864         pOpcode = &pOpcode[pCpu->bOpCode & 0xf];
     1861    if (g_apThreeByteMapX86_0F38[pDis->bOpCode >> 4])
     1862    {
     1863        pOpcode = g_apThreeByteMapX86_0F38[pDis->bOpCode >> 4];
     1864        pOpcode = &pOpcode[pDis->bOpCode & 0xf];
    18651865    }
    18661866    else
     
    18691869    /* Handle opcode table extensions that rely on the address, repne prefix byte.  */
    18701870    /** @todo Should we take the first or last prefix byte in case of multiple prefix bytes??? */
    1871     switch (pCpu->bLastPrefix)
     1871    switch (pDis->bLastPrefix)
    18721872    {
    18731873    case OP_OPSIZE: /* 0x66 */
    1874         if (g_apThreeByteMapX86_660F38[pCpu->bOpCode >> 4])
     1874        if (g_apThreeByteMapX86_660F38[pDis->bOpCode >> 4])
    18751875        {
    1876             pOpcode = g_apThreeByteMapX86_660F38[pCpu->bOpCode >> 4];
    1877             pOpcode = &pOpcode[pCpu->bOpCode & 0xf];
     1876            pOpcode = g_apThreeByteMapX86_660F38[pDis->bOpCode >> 4];
     1877            pOpcode = &pOpcode[pDis->bOpCode & 0xf];
    18781878
    18791879            if (pOpcode->uOpcode != OP_INVALID)
     
    18821882
    18831883                /* Cancel prefix changes. */
    1884                 pCpu->fPrefix &= ~DISPREFIX_OPSIZE;
    1885                 pCpu->uOpMode  = pCpu->uCpuMode;
     1884                pDis->fPrefix &= ~DISPREFIX_OPSIZE;
     1885                pDis->uOpMode  = pDis->uCpuMode;
    18861886            }
    18871887        }
     
    18891889
    18901890    case OP_REPNE:   /* 0xF2 */
    1891         if (g_apThreeByteMapX86_F20F38[pCpu->bOpCode >> 4])
     1891        if (g_apThreeByteMapX86_F20F38[pDis->bOpCode >> 4])
    18921892        {
    1893             pOpcode = g_apThreeByteMapX86_F20F38[pCpu->bOpCode >> 4];
    1894             pOpcode = &pOpcode[pCpu->bOpCode & 0xf];
     1893            pOpcode = g_apThreeByteMapX86_F20F38[pDis->bOpCode >> 4];
     1894            pOpcode = &pOpcode[pDis->bOpCode & 0xf];
    18951895
    18961896            if (pOpcode->uOpcode != OP_INVALID)
     
    18991899
    19001900                /* Cancel prefix changes. */
    1901                 pCpu->fPrefix &= ~DISPREFIX_REPNE;
     1901                pDis->fPrefix &= ~DISPREFIX_REPNE;
    19021902            }
    19031903        }
     
    19051905    }
    19061906
    1907     size += disParseInstruction(offInstr+size, pOpcode, pCpu);
     1907    size += disParseInstruction(offInstr+size, pOpcode, pDis);
    19081908    return size;
    19091909}
    19101910//*****************************************************************************
    19111911//*****************************************************************************
    1912 static size_t ParseThreeByteEsc5(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1912static size_t ParseThreeByteEsc5(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    19131913{
    19141914    PCDISOPCODE   pOpcode;
     
    19171917
    19181918    /* 3rd byte */
    1919     pCpu->bOpCode = disReadByte(pCpu, offInstr);
     1919    pDis->bOpCode = disReadByte(pDis, offInstr);
    19201920
    19211921    /** @todo Should we take the first or last prefix byte in case of multiple prefix bytes??? */
    1922     Assert(pCpu->bLastPrefix == OP_OPSIZE);
     1922    Assert(pDis->bLastPrefix == OP_OPSIZE);
    19231923
    19241924    /* default to the non-prefixed table. */
    1925     if (g_apThreeByteMapX86_660F3A[pCpu->bOpCode >> 4])
    1926     {
    1927         pOpcode = g_apThreeByteMapX86_660F3A[pCpu->bOpCode >> 4];
    1928         pOpcode = &pOpcode[pCpu->bOpCode & 0xf];
     1925    if (g_apThreeByteMapX86_660F3A[pDis->bOpCode >> 4])
     1926    {
     1927        pOpcode = g_apThreeByteMapX86_660F3A[pDis->bOpCode >> 4];
     1928        pOpcode = &pOpcode[pDis->bOpCode & 0xf];
    19291929
    19301930        if (pOpcode->uOpcode != OP_INVALID)
     
    19331933
    19341934            /* Cancel prefix changes. */
    1935             pCpu->fPrefix &= ~DISPREFIX_OPSIZE;
    1936             pCpu->uOpMode  = pCpu->uCpuMode;
     1935            pDis->fPrefix &= ~DISPREFIX_OPSIZE;
     1936            pDis->uOpMode  = pDis->uCpuMode;
    19371937        }
    19381938    }
     
    19401940        pOpcode = &g_InvalidOpcode[0];
    19411941
    1942     size += disParseInstruction(offInstr+size, pOpcode, pCpu);
     1942    size += disParseInstruction(offInstr+size, pOpcode, pDis);
    19431943    return size;
    19441944}
    19451945//*****************************************************************************
    19461946//*****************************************************************************
    1947 static size_t ParseNopPause(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1947static size_t ParseNopPause(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    19481948{
    19491949    size_t size = 0;
    19501950    NOREF(pParam);
    19511951
    1952     if (pCpu->fPrefix & DISPREFIX_REP)
     1952    if (pDis->fPrefix & DISPREFIX_REP)
    19531953    {
    19541954        pOp = &g_aMapX86_NopPause[1]; /* PAUSE */
    1955         pCpu->fPrefix &= ~DISPREFIX_REP;
     1955        pDis->fPrefix &= ~DISPREFIX_REP;
    19561956    }
    19571957    else
    19581958        pOp = &g_aMapX86_NopPause[0]; /* NOP */
    19591959
    1960     size += disParseInstruction(offInstr, pOp, pCpu);
     1960    size += disParseInstruction(offInstr, pOp, pDis);
    19611961    return size;
    19621962}
    19631963//*****************************************************************************
    19641964//*****************************************************************************
    1965 static size_t ParseImmGrpl(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
    1966 {
    1967     int idx = (pCpu->bOpCode - 0x80) * 8;
     1965static size_t ParseImmGrpl(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
     1966{
     1967    int idx = (pDis->bOpCode - 0x80) * 8;
    19681968    size_t size = 0;
    19691969    NOREF(pParam);
    19701970
    1971     unsigned modrm = disReadByte(pCpu, offInstr);
     1971    unsigned modrm = disReadByte(pDis, offInstr);
    19721972    unsigned reg   = MODRM_REG(modrm);
    19731973
     
    19771977        size = sizeof(uint8_t); //ModRM byte
    19781978
    1979     size += disParseInstruction(offInstr, pOp, pCpu);
     1979    size += disParseInstruction(offInstr, pOp, pDis);
    19801980
    19811981    return size;
     
    19831983//*****************************************************************************
    19841984//*****************************************************************************
    1985 static size_t ParseShiftGrp2(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     1985static size_t ParseShiftGrp2(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    19861986{
    19871987    int idx;
     
    19891989    NOREF(pParam);
    19901990
    1991     switch (pCpu->bOpCode)
     1991    switch (pDis->bOpCode)
    19921992    {
    19931993    case 0xC0:
    19941994    case 0xC1:
    1995         idx = (pCpu->bOpCode - 0xC0)*8;
     1995        idx = (pDis->bOpCode - 0xC0)*8;
    19961996        break;
    19971997
     
    20002000    case 0xD2:
    20012001    case 0xD3:
    2002         idx = (pCpu->bOpCode - 0xD0 + 2)*8;
     2002        idx = (pDis->bOpCode - 0xD0 + 2)*8;
    20032003        break;
    20042004
     
    20082008    }
    20092009
    2010     unsigned modrm = disReadByte(pCpu, offInstr);
     2010    unsigned modrm = disReadByte(pDis, offInstr);
    20112011    unsigned reg   = MODRM_REG(modrm);
    20122012
     
    20172017        size = sizeof(uint8_t); //ModRM byte
    20182018
    2019     size += disParseInstruction(offInstr, pOp, pCpu);
     2019    size += disParseInstruction(offInstr, pOp, pDis);
    20202020
    20212021    return size;
     
    20232023//*****************************************************************************
    20242024//*****************************************************************************
    2025 static size_t ParseGrp3(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
    2026 {
    2027     int idx = (pCpu->bOpCode - 0xF6) * 8;
     2025static size_t ParseGrp3(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
     2026{
     2027    int idx = (pDis->bOpCode - 0xF6) * 8;
    20282028    size_t size = 0;
    20292029    NOREF(pParam);
    20302030
    2031     unsigned modrm = disReadByte(pCpu, offInstr);
     2031    unsigned modrm = disReadByte(pDis, offInstr);
    20322032    unsigned reg   = MODRM_REG(modrm);
    20332033
     
    20382038        size = sizeof(uint8_t); //ModRM byte
    20392039
    2040     size += disParseInstruction(offInstr, pOp, pCpu);
     2040    size += disParseInstruction(offInstr, pOp, pDis);
    20412041
    20422042    return size;
     
    20442044//*****************************************************************************
    20452045//*****************************************************************************
    2046 static size_t ParseGrp4(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     2046static size_t ParseGrp4(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    20472047{
    20482048    size_t size = 0;
    20492049    NOREF(pParam);
    20502050
    2051     unsigned modrm = disReadByte(pCpu, offInstr);
     2051    unsigned modrm = disReadByte(pDis, offInstr);
    20522052    unsigned reg   = MODRM_REG(modrm);
    20532053
     
    20582058        size = sizeof(uint8_t); //ModRM byte
    20592059
    2060     size += disParseInstruction(offInstr, pOp, pCpu);
     2060    size += disParseInstruction(offInstr, pOp, pDis);
    20612061
    20622062    return size;
     
    20642064//*****************************************************************************
    20652065//*****************************************************************************
    2066 static size_t ParseGrp5(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     2066static size_t ParseGrp5(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    20672067{
    20682068    size_t size = 0;
    20692069    NOREF(pParam);
    20702070
    2071     unsigned modrm = disReadByte(pCpu, offInstr);
     2071    unsigned modrm = disReadByte(pDis, offInstr);
    20722072    unsigned reg   = MODRM_REG(modrm);
    20732073
     
    20782078        size = sizeof(uint8_t); //ModRM byte
    20792079
    2080     size += disParseInstruction(offInstr, pOp, pCpu);
     2080    size += disParseInstruction(offInstr, pOp, pDis);
    20812081
    20822082    return size;
     
    20882088//
    20892089//*****************************************************************************
    2090 static size_t Parse3DNow(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     2090static size_t Parse3DNow(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    20912091{
    20922092    size_t size = 0;
     
    20972097#endif
    20982098
    2099     unsigned ModRM = disReadByte(pCpu, offInstr);
    2100     pCpu->ModRM.Bits.Rm  = MODRM_RM(ModRM);
    2101     pCpu->ModRM.Bits.Mod = MODRM_MOD(ModRM);
    2102     pCpu->ModRM.Bits.Reg = MODRM_REG(ModRM);
    2103 
    2104     size_t modrmsize = QueryModRM(offInstr+sizeof(uint8_t), pOp, pParam, pCpu, NULL);
    2105 
    2106     uint8_t opcode = disReadByte(pCpu, offInstr+sizeof(uint8_t)+modrmsize);
     2099    unsigned ModRM = disReadByte(pDis, offInstr);
     2100    pDis->ModRM.Bits.Rm  = MODRM_RM(ModRM);
     2101    pDis->ModRM.Bits.Mod = MODRM_MOD(ModRM);
     2102    pDis->ModRM.Bits.Reg = MODRM_REG(ModRM);
     2103
     2104    size_t modrmsize = QueryModRM(offInstr+sizeof(uint8_t), pOp, pParam, pDis, NULL);
     2105
     2106    uint8_t opcode = disReadByte(pDis, offInstr+sizeof(uint8_t)+modrmsize);
    21072107
    21082108    pOp = (PCDISOPCODE)&g_aTwoByteMapX86_3DNow[opcode];
     
    21172117    }
    21182118
    2119     size += disParseInstruction(offInstr, pOp, pCpu);
     2119    size += disParseInstruction(offInstr, pOp, pDis);
    21202120    size += sizeof(uint8_t);   //imm8_opcode uint8_t
    21212121
     
    21242124//*****************************************************************************
    21252125//*****************************************************************************
    2126 static size_t ParseGrp6(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     2126static size_t ParseGrp6(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    21272127{
    21282128    size_t size = 0;
    21292129    NOREF(pParam);
    21302130
    2131     unsigned modrm = disReadByte(pCpu, offInstr);
     2131    unsigned modrm = disReadByte(pDis, offInstr);
    21322132    unsigned reg   = MODRM_REG(modrm);
    21332133
     
    21382138        size = sizeof(uint8_t); //ModRM byte
    21392139
    2140     size += disParseInstruction(offInstr, pOp, pCpu);
     2140    size += disParseInstruction(offInstr, pOp, pDis);
    21412141
    21422142    return size;
     
    21442144//*****************************************************************************
    21452145//*****************************************************************************
    2146 static size_t ParseGrp7(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     2146static size_t ParseGrp7(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    21472147{
    21482148    size_t size = 0;
    21492149    NOREF(pParam);
    21502150
    2151     unsigned modrm = disReadByte(pCpu, offInstr);
     2151    unsigned modrm = disReadByte(pDis, offInstr);
    21522152    unsigned mod   = MODRM_MOD(modrm);
    21532153    unsigned reg   = MODRM_REG(modrm);
     
    21662166        size = sizeof(uint8_t); //ModRM byte
    21672167
    2168     size += disParseInstruction(offInstr, pOp, pCpu);
     2168    size += disParseInstruction(offInstr, pOp, pDis);
    21692169
    21702170    return size;
     
    21722172//*****************************************************************************
    21732173//*****************************************************************************
    2174 static size_t ParseGrp8(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     2174static size_t ParseGrp8(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    21752175{
    21762176    size_t size = 0;
    21772177    NOREF(pParam);
    21782178
    2179     unsigned modrm = disReadByte(pCpu, offInstr);
     2179    unsigned modrm = disReadByte(pDis, offInstr);
    21802180    unsigned reg   = MODRM_REG(modrm);
    21812181
     
    21862186        size = sizeof(uint8_t); //ModRM byte
    21872187
    2188     size += disParseInstruction(offInstr, pOp, pCpu);
     2188    size += disParseInstruction(offInstr, pOp, pDis);
    21892189
    21902190    return size;
     
    21922192//*****************************************************************************
    21932193//*****************************************************************************
    2194 static size_t ParseGrp9(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     2194static size_t ParseGrp9(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    21952195{
    21962196    size_t size = 0;
    21972197    NOREF(pParam);
    21982198
    2199     unsigned modrm = disReadByte(pCpu, offInstr);
     2199    unsigned modrm = disReadByte(pDis, offInstr);
    22002200    unsigned reg   = MODRM_REG(modrm);
    22012201
     
    22062206        size = sizeof(uint8_t); //ModRM byte
    22072207
    2208     size += disParseInstruction(offInstr, pOp, pCpu);
     2208    size += disParseInstruction(offInstr, pOp, pDis);
    22092209
    22102210    return size;
     
    22122212//*****************************************************************************
    22132213//*****************************************************************************
    2214 static size_t ParseGrp10(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     2214static size_t ParseGrp10(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    22152215{
    22162216    size_t size = 0;
    22172217    NOREF(pParam);
    22182218
    2219     unsigned modrm = disReadByte(pCpu, offInstr);
     2219    unsigned modrm = disReadByte(pDis, offInstr);
    22202220    unsigned reg   = MODRM_REG(modrm);
    22212221
     
    22262226        size = sizeof(uint8_t); //ModRM byte
    22272227
    2228     size += disParseInstruction(offInstr, pOp, pCpu);
     2228    size += disParseInstruction(offInstr, pOp, pDis);
    22292229
    22302230    return size;
     
    22322232//*****************************************************************************
    22332233//*****************************************************************************
    2234 static size_t ParseGrp12(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     2234static size_t ParseGrp12(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    22352235{
    22362236    size_t size = 0;
    22372237    NOREF(pParam);
    22382238
    2239     unsigned modrm = disReadByte(pCpu, offInstr);
     2239    unsigned modrm = disReadByte(pDis, offInstr);
    22402240    unsigned reg   = MODRM_REG(modrm);
    22412241
    2242     if (pCpu->fPrefix & DISPREFIX_OPSIZE)
     2242    if (pDis->fPrefix & DISPREFIX_OPSIZE)
    22432243        reg += 8;   //2nd table
    22442244
     
    22492249        size = sizeof(uint8_t); //ModRM byte
    22502250
    2251     size += disParseInstruction(offInstr, pOp, pCpu);
     2251    size += disParseInstruction(offInstr, pOp, pDis);
    22522252    return size;
    22532253}
    22542254//*****************************************************************************
    22552255//*****************************************************************************
    2256 static size_t ParseGrp13(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     2256static size_t ParseGrp13(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    22572257{
    22582258    size_t size = 0;
    22592259    NOREF(pParam);
    22602260
    2261     unsigned modrm = disReadByte(pCpu, offInstr);
     2261    unsigned modrm = disReadByte(pDis, offInstr);
    22622262    unsigned reg   = MODRM_REG(modrm);
    2263     if (pCpu->fPrefix & DISPREFIX_OPSIZE)
     2263    if (pDis->fPrefix & DISPREFIX_OPSIZE)
    22642264        reg += 8;   //2nd table
    22652265
     
    22702270        size = sizeof(uint8_t); //ModRM byte
    22712271
    2272     size += disParseInstruction(offInstr, pOp, pCpu);
     2272    size += disParseInstruction(offInstr, pOp, pDis);
    22732273
    22742274    return size;
     
    22762276//*****************************************************************************
    22772277//*****************************************************************************
    2278 static size_t ParseGrp14(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     2278static size_t ParseGrp14(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    22792279{
    22802280    size_t size = 0;
    22812281    NOREF(pParam);
    22822282
    2283     unsigned modrm = disReadByte(pCpu, offInstr);
     2283    unsigned modrm = disReadByte(pDis, offInstr);
    22842284    unsigned reg   = MODRM_REG(modrm);
    2285     if (pCpu->fPrefix & DISPREFIX_OPSIZE)
     2285    if (pDis->fPrefix & DISPREFIX_OPSIZE)
    22862286        reg += 8;   //2nd table
    22872287
     
    22922292        size = sizeof(uint8_t); //ModRM byte
    22932293
    2294     size += disParseInstruction(offInstr, pOp, pCpu);
     2294    size += disParseInstruction(offInstr, pOp, pDis);
    22952295
    22962296    return size;
     
    22982298//*****************************************************************************
    22992299//*****************************************************************************
    2300 static size_t ParseGrp15(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     2300static size_t ParseGrp15(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    23012301{
    23022302    size_t size = 0;
    23032303    NOREF(pParam);
    23042304
    2305     unsigned modrm = disReadByte(pCpu, offInstr);
     2305    unsigned modrm = disReadByte(pDis, offInstr);
    23062306    unsigned mod   = MODRM_MOD(modrm);
    23072307    unsigned reg   = MODRM_REG(modrm);
     
    23172317        size = sizeof(uint8_t); //ModRM byte
    23182318
    2319     size += disParseInstruction(offInstr, pOp, pCpu);
     2319    size += disParseInstruction(offInstr, pOp, pDis);
    23202320    return size;
    23212321}
    23222322//*****************************************************************************
    23232323//*****************************************************************************
    2324 static size_t ParseGrp16(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
     2324static size_t ParseGrp16(size_t offInstr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pDis)
    23252325{
    23262326    size_t size = 0;
    23272327    NOREF(pParam);
    23282328
    2329     unsigned modrm = disReadByte(pCpu, offInstr);
     2329    unsigned modrm = disReadByte(pDis, offInstr);
    23302330    unsigned reg   = MODRM_REG(modrm);
    23312331
     
    23362336        size = sizeof(uint8_t); //ModRM byte
    23372337
    2338     size += disParseInstruction(offInstr, pOp, pCpu);
     2338    size += disParseInstruction(offInstr, pOp, pDis);
    23392339    return size;
    23402340}
    23412341//*****************************************************************************
    23422342//*****************************************************************************
    2343 static void disasmModRMReg(PDISCPUSTATE pCpu, PCDISOPCODE pOp, unsigned idx, PDISOPPARAM pParam, int fRegAddr)
    2344 {
    2345     NOREF(pOp); NOREF(pCpu);
    2346 
    2347     unsigned mod     = pCpu->ModRM.Bits.Mod;
     2343static void disasmModRMReg(PDISCPUSTATE pDis, PCDISOPCODE pOp, unsigned idx, PDISOPPARAM pParam, int fRegAddr)
     2344{
     2345    NOREF(pOp); NOREF(pDis);
     2346
     2347    unsigned mod     = pDis->ModRM.Bits.Mod;
    23482348
    23492349    unsigned type    = OP_PARM_VTYPE(pParam->fParam);
    23502350    unsigned subtype = OP_PARM_VSUBTYPE(pParam->fParam);
    23512351    if (fRegAddr)
    2352         subtype = (pCpu->uAddrMode == DISCPUMODE_64BIT) ? OP_PARM_q : OP_PARM_d;
     2352        subtype = (pDis->uAddrMode == DISCPUMODE_64BIT) ? OP_PARM_q : OP_PARM_d;
    23532353    else
    23542354    if (subtype == OP_PARM_v || subtype == OP_PARM_NONE)
    23552355    {
    2356         switch (pCpu->uOpMode)
     2356        switch (pDis->uOpMode)
    23572357        {
    23582358        case DISCPUMODE_32BIT:
     
    23742374    {
    23752375    case OP_PARM_b:
    2376         Assert(idx < (pCpu->fPrefix & DISPREFIX_REX ? 16U : 8U));
     2376        Assert(idx < (pDis->fPrefix & DISPREFIX_REX ? 16U : 8U));
    23772377
    23782378        /* AH, BH, CH & DH map to DIL, SIL, EBL & SPL when a rex prefix is present. */
    23792379        /* Intel® 64 and IA-32 Architectures Software Developer’s Manual: 3.4.1.1 */
    2380         if (    (pCpu->fPrefix & DISPREFIX_REX)
     2380        if (    (pDis->fPrefix & DISPREFIX_REX)
    23812381            &&  idx >= DISGREG_AH
    23822382            &&  idx <= DISGREG_BH)
     
    23902390
    23912391    case OP_PARM_w:
    2392         Assert(idx < (pCpu->fPrefix & DISPREFIX_REX ? 16U : 8U));
     2392        Assert(idx < (pDis->fPrefix & DISPREFIX_REX ? 16U : 8U));
    23932393
    23942394        pParam->fUse |= DISUSE_REG_GEN16;
     
    23972397
    23982398    case OP_PARM_d:
    2399         Assert(idx < (pCpu->fPrefix & DISPREFIX_REX ? 16U : 8U));
     2399        Assert(idx < (pDis->fPrefix & DISPREFIX_REX ? 16U : 8U));
    24002400
    24012401        pParam->fUse |= DISUSE_REG_GEN32;
     
    24102410    default:
    24112411        Log(("disasmModRMReg %x:%x failed!!\n", type, subtype));
    2412         pCpu->rc = VERR_DIS_INVALID_MODRM;
     2412        pDis->rc = VERR_DIS_INVALID_MODRM;
    24132413        break;
    24142414    }
     
    24192419static const uint8_t g_auIndexModRMReg16[4] = { DISGREG_SI, DISGREG_DI, DISGREG_SI, DISGREG_DI };
    24202420//*****************************************************************************
    2421 static void disasmModRMReg16(PDISCPUSTATE pCpu, PCDISOPCODE pOp, unsigned idx, PDISOPPARAM pParam)
    2422 {
    2423     NOREF(pCpu); NOREF(pOp);
     2421static void disasmModRMReg16(PDISCPUSTATE pDis, PCDISOPCODE pOp, unsigned idx, PDISOPPARAM pParam)
     2422{
     2423    NOREF(pDis); NOREF(pOp);
    24242424    pParam->fUse |= DISUSE_REG_GEN16;
    24252425    pParam->Base.idxGenReg = g_auBaseModRMReg16[idx];
     
    24322432//*****************************************************************************
    24332433//*****************************************************************************
    2434 static void disasmModRMSReg(PDISCPUSTATE pCpu, PCDISOPCODE pOp, unsigned idx, PDISOPPARAM pParam)
     2434static void disasmModRMSReg(PDISCPUSTATE pDis, PCDISOPCODE pOp, unsigned idx, PDISOPPARAM pParam)
    24352435{
    24362436    NOREF(pOp);
     
    24382438    {
    24392439        Log(("disasmModRMSReg %d failed!!\n", idx));
    2440         pCpu->rc = VERR_DIS_INVALID_PARAMETER;
     2440        pDis->rc = VERR_DIS_INVALID_PARAMETER;
    24412441        return;
    24422442    }
     
    24722472 *      XOR
    24732473 *
    2474  * @param   pCpu    Fully disassembled instruction.
     2474 * @param   pDis    Fully disassembled instruction.
    24752475 */
    2476 static void disValidateLockSequence(PDISCPUSTATE pCpu)
    2477 {
    2478     Assert(pCpu->fPrefix & DISPREFIX_LOCK);
     2476static void disValidateLockSequence(PDISCPUSTATE pDis)
     2477{
     2478    Assert(pDis->fPrefix & DISPREFIX_LOCK);
    24792479
    24802480    /*
    24812481     * Filter out the valid lock sequences.
    24822482     */
    2483     switch (pCpu->pCurInstr->uOpcode)
     2483    switch (pDis->pCurInstr->uOpcode)
    24842484    {
    24852485        /* simple: no variations */
     
    24932493        case OP_CMPXCHG:
    24942494        case OP_XADD:
    2495             if (pCpu->ModRM.Bits.Mod == 3)
     2495            if (pDis->ModRM.Bits.Mod == 3)
    24962496                break;
    24972497            return;
     
    25132513        case OP_XCHG:
    25142514        case OP_XOR:
    2515             if (pCpu->Param1.fUse & (DISUSE_BASE | DISUSE_INDEX | DISUSE_DISPLACEMENT64 | DISUSE_DISPLACEMENT32
     2515            if (pDis->Param1.fUse & (DISUSE_BASE | DISUSE_INDEX | DISUSE_DISPLACEMENT64 | DISUSE_DISPLACEMENT32
    25162516                                     | DISUSE_DISPLACEMENT16 | DISUSE_DISPLACEMENT8 | DISUSE_RIPDISPLACEMENT32))
    25172517                return;
     
    25252525     * Invalid lock sequence, make it a OP_ILLUD2.
    25262526     */
    2527     pCpu->pCurInstr = &g_aTwoByteMapX86[11];
    2528     Assert(pCpu->pCurInstr->uOpcode == OP_ILLUD2);
     2527    pDis->pCurInstr = &g_aTwoByteMapX86[11];
     2528    Assert(pDis->pCurInstr->uOpcode == OP_ILLUD2);
    25292529}
    25302530
     
    25342534 *
    25352535 * @returns VBox status code.
    2536  * @param   pCpu            Initialized cpu state.
     2536 * @param   pDis            Initialized disassembler state.
    25372537 * @param   paOneByteMap    The one byte opcode map to use.
    25382538 * @param   pcbInstr        Where to store the instruction size. Can be NULL.
    25392539 */
    2540 static int disInstrWorker(PDISCPUSTATE pCpu, PCDISOPCODE paOneByteMap, uint32_t *pcbInstr)
     2540static int disInstrWorker(PDISCPUSTATE pDis, PCDISOPCODE paOneByteMap, uint32_t *pcbInstr)
    25412541{
    25422542    /*
     
    25462546    for (;;)
    25472547    {
    2548         uint8_t codebyte = disReadByte(pCpu, offInstr++);
     2548        uint8_t codebyte = disReadByte(pDis, offInstr++);
    25492549        uint8_t opcode   = paOneByteMap[codebyte].uOpcode;
    25502550
     
    25562556            {
    25572557                /** Last prefix byte (for SSE2 extension tables); don't include the REX prefix */
    2558                 pCpu->bLastPrefix = opcode;
    2559                 pCpu->fPrefix &= ~DISPREFIX_REX;
     2558                pDis->bLastPrefix = opcode;
     2559                pDis->fPrefix &= ~DISPREFIX_REX;
    25602560            }
    25612561
     
    25652565                if (pcbInstr)
    25662566                    *pcbInstr = (uint32_t)offInstr;
    2567                 return pCpu->rc = VERR_DIS_INVALID_OPCODE;
     2567                return pDis->rc = VERR_DIS_INVALID_OPCODE;
    25682568
    25692569            // segment override prefix byte
    25702570            case OP_SEG:
    2571                 pCpu->idxSegPrefix = (DISSELREG)(paOneByteMap[codebyte].fParam1 - OP_PARM_REG_SEG_START);
     2571                pDis->idxSegPrefix = (DISSELREG)(paOneByteMap[codebyte].fParam1 - OP_PARM_REG_SEG_START);
    25722572                /* Segment prefixes for CS, DS, ES and SS are ignored in long mode. */
    2573                 if (   pCpu->uCpuMode != DISCPUMODE_64BIT
    2574                     || pCpu->idxSegPrefix >= DISSELREG_FS)
     2573                if (   pDis->uCpuMode != DISCPUMODE_64BIT
     2574                    || pDis->idxSegPrefix >= DISSELREG_FS)
    25752575                {
    2576                     pCpu->fPrefix   |= DISPREFIX_SEG;
     2576                    pDis->fPrefix   |= DISPREFIX_SEG;
    25772577                }
    25782578                continue;   //fetch the next byte
     
    25802580            // lock prefix byte
    25812581            case OP_LOCK:
    2582                 pCpu->fPrefix |= DISPREFIX_LOCK;
     2582                pDis->fPrefix |= DISPREFIX_LOCK;
    25832583                continue;   //fetch the next byte
    25842584
    25852585            // address size override prefix byte
    25862586            case OP_ADDRSIZE:
    2587                 pCpu->fPrefix |= DISPREFIX_ADDRSIZE;
    2588                 if (pCpu->uCpuMode == DISCPUMODE_16BIT)
    2589                     pCpu->uAddrMode = DISCPUMODE_32BIT;
     2587                pDis->fPrefix |= DISPREFIX_ADDRSIZE;
     2588                if (pDis->uCpuMode == DISCPUMODE_16BIT)
     2589                    pDis->uAddrMode = DISCPUMODE_32BIT;
    25902590                else
    2591                 if (pCpu->uCpuMode == DISCPUMODE_32BIT)
    2592                     pCpu->uAddrMode = DISCPUMODE_16BIT;
     2591                if (pDis->uCpuMode == DISCPUMODE_32BIT)
     2592                    pDis->uAddrMode = DISCPUMODE_16BIT;
    25932593                else
    2594                     pCpu->uAddrMode = DISCPUMODE_32BIT;     /* 64 bits */
     2594                    pDis->uAddrMode = DISCPUMODE_32BIT;     /* 64 bits */
    25952595                continue;   //fetch the next byte
    25962596
    25972597            // operand size override prefix byte
    25982598            case OP_OPSIZE:
    2599                 pCpu->fPrefix |= DISPREFIX_OPSIZE;
    2600                 if (pCpu->uCpuMode == DISCPUMODE_16BIT)
    2601                     pCpu->uOpMode = DISCPUMODE_32BIT;
     2599                pDis->fPrefix |= DISPREFIX_OPSIZE;
     2600                if (pDis->uCpuMode == DISCPUMODE_16BIT)
     2601                    pDis->uOpMode = DISCPUMODE_32BIT;
    26022602                else
    2603                     pCpu->uOpMode = DISCPUMODE_16BIT;  /* for 32 and 64 bits mode (there is no 32 bits operand size override prefix) */
     2603                    pDis->uOpMode = DISCPUMODE_16BIT;  /* for 32 and 64 bits mode (there is no 32 bits operand size override prefix) */
    26042604                continue;   //fetch the next byte
    26052605
    26062606            // rep and repne are not really prefixes, but we'll treat them as such
    26072607            case OP_REPE:
    2608                 pCpu->fPrefix |= DISPREFIX_REP;
     2608                pDis->fPrefix |= DISPREFIX_REP;
    26092609                continue;   //fetch the next byte
    26102610
    26112611            case OP_REPNE:
    2612                 pCpu->fPrefix |= DISPREFIX_REPNE;
     2612                pDis->fPrefix |= DISPREFIX_REPNE;
    26132613                continue;   //fetch the next byte
    26142614
    26152615            case OP_REX:
    2616                 Assert(pCpu->uCpuMode == DISCPUMODE_64BIT);
     2616                Assert(pDis->uCpuMode == DISCPUMODE_64BIT);
    26172617                /* REX prefix byte */
    2618                 pCpu->fPrefix   |= DISPREFIX_REX;
    2619                 pCpu->fRexPrefix = DISPREFIX_REX_OP_2_FLAGS(paOneByteMap[codebyte].fParam1);
    2620                 if (pCpu->fRexPrefix & DISPREFIX_REX_FLAGS_W)
    2621                     pCpu->uOpMode = DISCPUMODE_64BIT;  /* overrides size prefix byte */
     2618                pDis->fPrefix   |= DISPREFIX_REX;
     2619                pDis->fRexPrefix = DISPREFIX_REX_OP_2_FLAGS(paOneByteMap[codebyte].fParam1);
     2620                if (pDis->fRexPrefix & DISPREFIX_REX_FLAGS_W)
     2621                    pDis->uOpMode = DISCPUMODE_64BIT;  /* overrides size prefix byte */
    26222622                continue;   //fetch the next byte
    26232623            }
     
    26252625
    26262626        /* first opcode byte. */
    2627         pCpu->bOpCode  = codebyte;
    2628         pCpu->cbPrefix = (uint8_t)offInstr - 1;
    2629         offInstr += disParseInstruction(offInstr, &paOneByteMap[pCpu->bOpCode], pCpu);
     2627        pDis->bOpCode  = codebyte;
     2628        pDis->cbPrefix = (uint8_t)offInstr - 1;
     2629        offInstr += disParseInstruction(offInstr, &paOneByteMap[pDis->bOpCode], pDis);
    26302630        break;
    26312631    }
    26322632
    2633     pCpu->cbInstr = (uint8_t)offInstr;
     2633    pDis->cbInstr = (uint8_t)offInstr;
    26342634    if (pcbInstr)
    26352635        *pcbInstr = (uint32_t)offInstr;
    26362636
    2637     if (pCpu->fPrefix & DISPREFIX_LOCK)
    2638         disValidateLockSequence(pCpu);
    2639 
    2640     return pCpu->rc;
     2637    if (pDis->fPrefix & DISPREFIX_LOCK)
     2638        disValidateLockSequence(pDis);
     2639
     2640    return pDis->rc;
    26412641}
    26422642
     
    26462646 *
    26472647 * @returns The primary opcode map to use.
    2648  * @param   pCpu            The disassembler state.
     2648 * @param   pDis            The disassembler state.
    26492649 * @param   uInstrAddr      The instruction address.
    26502650 * @param   enmCpuMode      The CPU mode.
     
    26542654 */
    26552655DECL_FORCE_INLINE(PCDISOPCODE)
    2656 disInitializeState(PDISCPUSTATE pCpu, RTUINTPTR uInstrAddr, DISCPUMODE enmCpuMode, uint32_t fFilter,
     2656disInitializeState(PDISCPUSTATE pDis, RTUINTPTR uInstrAddr, DISCPUMODE enmCpuMode, uint32_t fFilter,
    26572657                   PFNDISREADBYTES pfnReadBytes, void *pvUser)
    26582658{
    2659 
    26602659    /*
    2661      * Initialize the CPU state.
    26622660     * Note! The RT_BZERO make ASSUMPTIONS about the placement of pvUser2.
    26632661     */
    2664     RT_BZERO(pCpu, RT_OFFSETOF(DISCPUSTATE, pvUser2));
     2662    RT_BZERO(pDis, RT_OFFSETOF(DISCPUSTATE, pvUser2));
    26652663
    26662664#ifdef VBOX_STRICT /* poison */
    2667     pCpu->Param1.Base.idxGenReg  = 0xc1;
    2668     pCpu->Param2.Base.idxGenReg  = 0xc2;
    2669     pCpu->Param3.Base.idxGenReg  = 0xc3;
    2670     pCpu->Param1.Index.idxGenReg = 0xc4;
    2671     pCpu->Param2.Index.idxGenReg = 0xc5;
    2672     pCpu->Param3.Index.idxGenReg = 0xc6;
    2673     pCpu->Param1.uDisp.u64 = UINT64_C(0xd1d1d1d1d1d1d1d1);
    2674     pCpu->Param2.uDisp.u64 = UINT64_C(0xd2d2d2d2d2d2d2d2);
    2675     pCpu->Param3.uDisp.u64 = UINT64_C(0xd3d3d3d3d3d3d3d3);
    2676     pCpu->Param1.uValue    = UINT64_C(0xb1b1b1b1b1b1b1b1);
    2677     pCpu->Param2.uValue    = UINT64_C(0xb2b2b2b2b2b2b2b2);
    2678     pCpu->Param3.uValue    = UINT64_C(0xb3b3b3b3b3b3b3b3);
    2679     pCpu->Param1.uScale    = 28;
    2680     pCpu->Param2.uScale    = 29;
    2681     pCpu->Param3.uScale    = 30;
     2665    pDis->Param1.Base.idxGenReg  = 0xc1;
     2666    pDis->Param2.Base.idxGenReg  = 0xc2;
     2667    pDis->Param3.Base.idxGenReg  = 0xc3;
     2668    pDis->Param1.Index.idxGenReg = 0xc4;
     2669    pDis->Param2.Index.idxGenReg = 0xc5;
     2670    pDis->Param3.Index.idxGenReg = 0xc6;
     2671    pDis->Param1.uDisp.u64 = UINT64_C(0xd1d1d1d1d1d1d1d1);
     2672    pDis->Param2.uDisp.u64 = UINT64_C(0xd2d2d2d2d2d2d2d2);
     2673    pDis->Param3.uDisp.u64 = UINT64_C(0xd3d3d3d3d3d3d3d3);
     2674    pDis->Param1.uValue    = UINT64_C(0xb1b1b1b1b1b1b1b1);
     2675    pDis->Param2.uValue    = UINT64_C(0xb2b2b2b2b2b2b2b2);
     2676    pDis->Param3.uValue    = UINT64_C(0xb3b3b3b3b3b3b3b3);
     2677    pDis->Param1.uScale    = 28;
     2678    pDis->Param2.uScale    = 29;
     2679    pDis->Param3.uScale    = 30;
    26822680#endif
    26832681
    2684     pCpu->fPrefix           = DISPREFIX_NONE;
    2685     pCpu->idxSegPrefix      = DISSELREG_DS;
    2686     pCpu->rc                = VINF_SUCCESS;
    2687     pCpu->pfnDisasmFnTable  = g_apfnFullDisasm;
    2688 
    2689     pCpu->uInstrAddr        = uInstrAddr;
    2690     pCpu->fFilter           = fFilter;
    2691     pCpu->pfnReadBytes      = pfnReadBytes ? pfnReadBytes : disReadBytesDefault;
    2692     pCpu->pvUser            = pvUser;
    2693     pCpu->uCpuMode          = enmCpuMode;
     2682    pDis->fPrefix           = DISPREFIX_NONE;
     2683    pDis->idxSegPrefix      = DISSELREG_DS;
     2684    pDis->rc                = VINF_SUCCESS;
     2685    pDis->pfnDisasmFnTable  = g_apfnFullDisasm;
     2686
     2687    pDis->uInstrAddr        = uInstrAddr;
     2688    pDis->fFilter           = fFilter;
     2689    pDis->pfnReadBytes      = pfnReadBytes ? pfnReadBytes : disReadBytesDefault;
     2690    pDis->pvUser            = pvUser;
     2691    pDis->uCpuMode          = enmCpuMode;
    26942692    PCDISOPCODE paOneByteMap;
    26952693    if (enmCpuMode == DISCPUMODE_64BIT)
    26962694    {
    2697         pCpu->uAddrMode     = DISCPUMODE_64BIT;
    2698         pCpu->uOpMode       = DISCPUMODE_32BIT;
     2695        pDis->uAddrMode     = DISCPUMODE_64BIT;
     2696        pDis->uOpMode       = DISCPUMODE_32BIT;
    26992697        paOneByteMap        = g_aOneByteMapX64;
    27002698    }
    27012699    else
    27022700    {
    2703         pCpu->uAddrMode     = enmCpuMode;
    2704         pCpu->uOpMode       = enmCpuMode;
     2701        pDis->uAddrMode     = enmCpuMode;
     2702        pDis->uOpMode       = enmCpuMode;
    27052703        paOneByteMap        = g_aOneByteMapX86;
    27062704    }
     
    27162714 * instruction parsing.
    27172715 *
    2718  * @param   pCpu                The disassembler state.
     2716 * @param   pDis                The disassembler state.
    27192717 */
    2720 DECL_FORCE_INLINE(void) disPrefetchBytes(PDISCPUSTATE pCpu)
     2718DECL_FORCE_INLINE(void) disPrefetchBytes(PDISCPUSTATE pDis)
    27212719{
    27222720    /*
     
    27252723     * the cache here.)
    27262724     */
    2727     int rc = pCpu->pfnReadBytes(pCpu, 0, 1, sizeof(pCpu->abInstr));
     2725    int rc = pDis->pfnReadBytes(pDis, 0, 1, sizeof(pDis->abInstr));
    27282726    if (RT_SUCCESS(rc))
    27292727    {
    2730         Assert(pCpu->cbCachedInstr >= 1);
    2731         Assert(pCpu->cbCachedInstr <= sizeof(pCpu->abInstr));
     2728        Assert(pDis->cbCachedInstr >= 1);
     2729        Assert(pDis->cbCachedInstr <= sizeof(pDis->abInstr));
    27322730    }
    27332731    else
    27342732    {
    27352733        Log(("Initial read failed with rc=%Rrc!!\n", rc));
    2736         pCpu->rc = VERR_DIS_MEM_READ;
     2734        pDis->rc = VERR_DIS_MEM_READ;
    27372735    }
    27382736}
     
    27402738
    27412739/**
    2742  * Disassembles on instruction, details in @a pCpu and length in @a pcbInstr.
     2740 * Disassembles on instruction, details in @a pDis and length in @a pcbInstr.
    27432741 *
    27442742 * @returns VBox status code.
     
    27492747 * @param   fFilter         Instruction type filter.
    27502748 * @param   pvUser          User argument for the instruction reader. (Ends up in pvUser.)
    2751  * @param   pCpu            Pointer to CPU structure. With the exception of
     2749 * @param   pDis            Pointer to CPU structure. With the exception of
    27522750 *                          DISCPUSTATE::pvUser2, the structure will be
    27532751 *                          completely initialized by this API, i.e. no input is
     
    27582756DISDECL(int) DISInstEx(RTUINTPTR uInstrAddr, DISCPUMODE enmCpuMode, uint32_t fFilter,
    27592757                       PFNDISREADBYTES pfnReadBytes, void *pvUser,
    2760                        PDISCPUSTATE pCpu, uint32_t *pcbInstr)
    2761 {
    2762 
    2763     PCDISOPCODE paOneByteMap = disInitializeState(pCpu, uInstrAddr, enmCpuMode, fFilter, pfnReadBytes, pvUser);
    2764     disPrefetchBytes(pCpu);
    2765     return disInstrWorker(pCpu, paOneByteMap, pcbInstr);
     2758                       PDISCPUSTATE pDis, uint32_t *pcbInstr)
     2759{
     2760
     2761    PCDISOPCODE paOneByteMap = disInitializeState(pDis, uInstrAddr, enmCpuMode, fFilter, pfnReadBytes, pvUser);
     2762    disPrefetchBytes(pDis);
     2763    return disInstrWorker(pDis, paOneByteMap, pcbInstr);
    27662764}
    27672765
     
    27692767/**
    27702768 * Disassembles on instruction partially or fully from prefetched bytes, details
    2771  * in @a pCpu and length in @a pcbInstr.
     2769 * in @a pDis and length in @a pcbInstr.
    27722770 *
    27732771 * @returns VBox status code.
     
    27812779 * @param   fFilter         Instruction type filter.
    27822780 * @param   pvUser          User argument for the instruction reader. (Ends up in pvUser.)
    2783  * @param   pCpu            Pointer to CPU structure. With the exception of
     2781 * @param   pDis            Pointer to CPU structure. With the exception of
    27842782 *                          DISCPUSTATE::pvUser2, the structure will be
    27852783 *                          completely initialized by this API, i.e. no input is
     
    27912789                                        void const *pvPrefetched, size_t cbPretched,
    27922790                                        PFNDISREADBYTES pfnReadBytes, void *pvUser,
    2793                                         PDISCPUSTATE pCpu, uint32_t *pcbInstr)
    2794 {
    2795     PCDISOPCODE paOneByteMap = disInitializeState(pCpu, uInstrAddr, enmCpuMode, fFilter, pfnReadBytes, pvUser);
     2791                                        PDISCPUSTATE pDis, uint32_t *pcbInstr)
     2792{
     2793    PCDISOPCODE paOneByteMap = disInitializeState(pDis, uInstrAddr, enmCpuMode, fFilter, pfnReadBytes, pvUser);
    27962794
    27972795    if (!cbPretched)
    2798         disPrefetchBytes(pCpu);
    2799     else
    2800     {
    2801         if (cbPretched >= sizeof(pCpu->abInstr))
     2796        disPrefetchBytes(pDis);
     2797    else
     2798    {
     2799        if (cbPretched >= sizeof(pDis->abInstr))
    28022800        {
    2803             memcpy(pCpu->abInstr, pvPrefetched, sizeof(pCpu->abInstr));
    2804             pCpu->cbCachedInstr = (uint8_t)sizeof(pCpu->abInstr);
     2801            memcpy(pDis->abInstr, pvPrefetched, sizeof(pDis->abInstr));
     2802            pDis->cbCachedInstr = (uint8_t)sizeof(pDis->abInstr);
    28052803        }
    28062804        else
    28072805        {
    2808             memcpy(pCpu->abInstr, pvPrefetched, cbPretched);
    2809             pCpu->cbCachedInstr = (uint8_t)cbPretched;
    2810         }
    2811     }
    2812 
    2813     return disInstrWorker(pCpu, paOneByteMap, pcbInstr);
     2806            memcpy(pDis->abInstr, pvPrefetched, cbPretched);
     2807            pDis->cbCachedInstr = (uint8_t)cbPretched;
     2808        }
     2809    }
     2810
     2811    return disInstrWorker(pDis, paOneByteMap, pcbInstr);
    28142812}
    28152813
     
    28192817 * Parses one guest instruction.
    28202818 *
    2821  * The result is found in pCpu and pcbInstr.
     2819 * The result is found in pDis and pcbInstr.
    28222820 *
    28232821 * @returns VBox status code.
     
    28272825 * @param   pfnReadBytes    Callback for reading instruction bytes.
    28282826 * @param   pvUser          User argument for the instruction reader. (Ends up in pvUser.)
    2829  * @param   pCpu            Pointer to cpu structure. Will be initialized.
     2827 * @param   pDis            Pointer to cpu structure. Will be initialized.
    28302828 * @param   pcbInstr        Where to store the size of the instruction.
    28312829 *                          NULL is allowed.  This is also stored in
     
    28332831 */
    28342832DISDECL(int) DISInstrWithReader(RTUINTPTR uInstrAddr, DISCPUMODE enmCpuMode, PFNDISREADBYTES pfnReadBytes, void *pvUser,
    2835                                 PDISCPUSTATE pCpu, uint32_t *pcbInstr)
    2836 {
    2837     return DISInstEx(uInstrAddr, enmCpuMode, DISOPTYPE_ALL, pfnReadBytes, pvUser, pCpu, pcbInstr);
     2833                                PDISCPUSTATE pDis, uint32_t *pcbInstr)
     2834{
     2835    return DISInstEx(uInstrAddr, enmCpuMode, DISOPTYPE_ALL, pfnReadBytes, pvUser, pDis, pcbInstr);
    28382836}
    28392837
     
    28422840 * Parses one guest instruction.
    28432841 *
    2844  * The result is found in pCpu and pcbInstr.
     2842 * The result is found in pDis and pcbInstr.
    28452843 *
    28462844 * @returns VBox status code.
     
    28522850 * @param   pfnReadBytes    Callback for reading instruction bytes.
    28532851 * @param   pvUser          User argument for the instruction reader. (Ends up in pvUser.)
    2854  * @param   pCpu            Pointer to cpu structure. Will be initialized.
     2852 * @param   pDis            Pointer to cpu structure. Will be initialized.
    28552853 * @param   pcbInstr        Where to store the size of the instruction.
    28562854 *                          NULL is allowed.  This is also stored in
    28572855 *                          PDISCPUSTATE::cbInstr.
    28582856 */
    2859 DISDECL(int) DISInstr(const void *pvInstr, DISCPUMODE enmCpuMode, PDISCPUSTATE pCpu, uint32_t *pcbInstr)
    2860 {
    2861     return DISInstEx((uintptr_t)pvInstr, enmCpuMode, DISOPTYPE_ALL, NULL /*pfnReadBytes*/, NULL /*pvUser*/, pCpu, pcbInstr);
    2862 }
    2863 
     2857DISDECL(int) DISInstr(const void *pvInstr, DISCPUMODE enmCpuMode, PDISCPUSTATE pDis, uint32_t *pcbInstr)
     2858{
     2859    return DISInstEx((uintptr_t)pvInstr, enmCpuMode, DISOPTYPE_ALL, NULL /*pfnReadBytes*/, NULL /*pvUser*/, pDis, pcbInstr);
     2860}
     2861
  • trunk/src/VBox/Disassembler/DisasmFormatBytes.cpp

    r41732 r41789  
    3131 * @returns The number of output bytes.
    3232 *
    33  * @param   pCpu    Pointer to the disassembler cpu state.
     33 * @param   pDis    Pointer to the disassembler state.
    3434 * @param   pszDst  The output buffer.
    3535 * @param   cchDst  The size of the output buffer.
    3636 * @param   fFlags  The flags passed to the formatter.
    3737 */
    38 size_t disFormatBytes(PCDISCPUSTATE pCpu, char *pszDst, size_t cchDst, uint32_t fFlags)
     38size_t disFormatBytes(PCDISCPUSTATE pDis, char *pszDst, size_t cchDst, uint32_t fFlags)
    3939{
    4040    size_t      cchOutput = 0;
    41     uint32_t    cb        = pCpu->cbInstr;
     41    uint32_t    cb        = pDis->cbInstr;
    4242    AssertStmt(cb <= 16, cb = 16);
    4343
     
    6969    {
    7070        if (i != 0 && (fFlags & DIS_FMT_FLAGS_BYTES_SPACED))
    71             PUT_NUM(3, " %02x", pCpu->abInstr[i]);
     71            PUT_NUM(3, " %02x", pDis->abInstr[i]);
    7272        else
    73             PUT_NUM(2, "%02x", pCpu->abInstr[i]);
     73            PUT_NUM(2, "%02x", pDis->abInstr[i]);
    7474    }
    7575
  • trunk/src/VBox/Disassembler/DisasmFormatYasm.cpp

    r41765 r41789  
    8787 *
    8888 * @returns Pointer to the register name.
    89  * @param   pCpu        The disassembler cpu state.
     89 * @param   pDis        The disassembler state.
    9090 * @param   pParam      The parameter.
    9191 * @param   pcchReg     Where to store the length of the name.
    9292 */
    93 static const char *disasmFormatYasmBaseReg(PCDISCPUSTATE pCpu, PCDISOPPARAM pParam, size_t *pcchReg)
     93static const char *disasmFormatYasmBaseReg(PCDISCPUSTATE pDis, PCDISOPPARAM pParam, size_t *pcchReg)
    9494{
    9595    switch (pParam->fUse & (  DISUSE_REG_GEN8 | DISUSE_REG_GEN16 | DISUSE_REG_GEN32 | DISUSE_REG_GEN64
     
    198198 *
    199199 * @returns The index register name.
    200  * @param   pCpu        The disassembler cpu state.
     200 * @param   pDis        The disassembler state.
    201201 * @param   pParam      The parameter.
    202202 * @param   pcchReg     Where to store the length of the name.
    203203 */
    204 static const char *disasmFormatYasmIndexReg(PCDISCPUSTATE pCpu, PCDISOPPARAM pParam, size_t *pcchReg)
    205 {
    206     switch (pCpu->uAddrMode)
     204static const char *disasmFormatYasmIndexReg(PCDISCPUSTATE pDis, PCDISOPPARAM pParam, size_t *pcchReg)
     205{
     206    switch (pDis->uAddrMode)
    207207    {
    208208        case DISCPUMODE_16BIT:
     
    231231
    232232        default:
    233             AssertMsgFailed(("%#x %#x\n", pParam->fUse, pCpu->uAddrMode));
     233            AssertMsgFailed(("%#x %#x\n", pParam->fUse, pDis->uAddrMode));
    234234            *pcchReg = 3;
    235235            return "r??";
     
    244244 * @returns The number of output characters. If this is >= cchBuf, then the content
    245245 *          of pszBuf will be truncated.
    246  * @param   pCpu            Pointer to the disassembler CPU state.
     246 * @param   pDis            Pointer to the disassembler state.
    247247 * @param   pszBuf          The output buffer.
    248248 * @param   cchBuf          The size of the output buffer.
     
    251251 * @param   pvUser          User argument for pfnGetSymbol.
    252252 */
    253 DISDECL(size_t) DISFormatYasmEx(PCDISCPUSTATE pCpu, char *pszBuf, size_t cchBuf, uint32_t fFlags,
     253DISDECL(size_t) DISFormatYasmEx(PCDISCPUSTATE pDis, char *pszBuf, size_t cchBuf, uint32_t fFlags,
    254254                                PFNDISGETSYMBOL pfnGetSymbol, void *pvUser)
    255255{
     
    257257     * Input validation and massaging.
    258258     */
    259     AssertPtr(pCpu);
     259    AssertPtr(pDis);
    260260    AssertPtrNull(pszBuf);
    261261    Assert(pszBuf || !cchBuf);
     
    267267        fFlags = (fFlags & ~DIS_FMT_FLAGS_BYTES_LEFT) | DIS_FMT_FLAGS_BYTES_RIGHT;
    268268
    269     PCDISOPCODE const pOp = pCpu->pCurInstr;
     269    PCDISOPCODE const pOp = pDis->pCurInstr;
    270270
    271271    /*
     
    348348    {
    349349#if HC_ARCH_BITS == 64 || GC_ARCH_BITS == 64
    350         if (pCpu->uInstrAddr >= _4G)
    351             PUT_NUM(9, "%08x`", (uint32_t)(pCpu->uInstrAddr >> 32));
     350        if (pDis->uInstrAddr >= _4G)
     351            PUT_NUM(9, "%08x`", (uint32_t)(pDis->uInstrAddr >> 32));
    352352#endif
    353         PUT_NUM(8, "%08x", (uint32_t)pCpu->uInstrAddr);
     353        PUT_NUM(8, "%08x", (uint32_t)pDis->uInstrAddr);
    354354        PUT_C(' ');
    355355    }
     
    360360    if (fFlags & DIS_FMT_FLAGS_BYTES_LEFT)
    361361    {
    362         size_t cchTmp = disFormatBytes(pCpu, pszDst, cchDst, fFlags);
     362        size_t cchTmp = disFormatBytes(pDis, pszDst, cchDst, fFlags);
    363363        cchOutput += cchTmp;
    364364        if (cchDst > 1)
     
    392392    if (    pOp->uOpcode == OP_INVALID
    393393        ||  (   pOp->uOpcode == OP_ILLUD2
    394              && (pCpu->fPrefix & DISPREFIX_LOCK)))
     394             && (pDis->fPrefix & DISPREFIX_LOCK)))
    395395        PUT_SZ("Illegal opcode");
    396396    else
     
    399399         * Prefixes
    400400         */
    401         if (pCpu->fPrefix & DISPREFIX_LOCK)
     401        if (pDis->fPrefix & DISPREFIX_LOCK)
    402402            PUT_SZ("lock ");
    403         if(pCpu->fPrefix & DISPREFIX_REP)
     403        if(pDis->fPrefix & DISPREFIX_REP)
    404404            PUT_SZ("rep ");
    405         else if(pCpu->fPrefix & DISPREFIX_REPNE)
     405        else if(pDis->fPrefix & DISPREFIX_REPNE)
    406406            PUT_SZ("repne ");
    407407
     
    415415        {
    416416            case OP_JECXZ:
    417                 pszFmt = pCpu->uOpMode == DISCPUMODE_16BIT ? "jcxz %Jb" : pCpu->uOpMode == DISCPUMODE_32BIT ? "jecxz %Jb"   : "jrcxz %Jb";
     417                pszFmt = pDis->uOpMode == DISCPUMODE_16BIT ? "jcxz %Jb" : pDis->uOpMode == DISCPUMODE_32BIT ? "jecxz %Jb"   : "jrcxz %Jb";
    418418                break;
    419419            case OP_PUSHF:
    420                 pszFmt = pCpu->uOpMode == DISCPUMODE_16BIT ? "pushfw"   : pCpu->uOpMode == DISCPUMODE_32BIT ? "pushfd"      : "pushfq";
     420                pszFmt = pDis->uOpMode == DISCPUMODE_16BIT ? "pushfw"   : pDis->uOpMode == DISCPUMODE_32BIT ? "pushfd"      : "pushfq";
    421421                break;
    422422            case OP_POPF:
    423                 pszFmt = pCpu->uOpMode == DISCPUMODE_16BIT ? "popfw"    : pCpu->uOpMode == DISCPUMODE_32BIT ? "popfd"       : "popfq";
     423                pszFmt = pDis->uOpMode == DISCPUMODE_16BIT ? "popfw"    : pDis->uOpMode == DISCPUMODE_32BIT ? "popfd"       : "popfq";
    424424                break;
    425425            case OP_PUSHA:
    426                 pszFmt = pCpu->uOpMode == DISCPUMODE_16BIT ? "pushaw"   : "pushad";
     426                pszFmt = pDis->uOpMode == DISCPUMODE_16BIT ? "pushaw"   : "pushad";
    427427                break;
    428428            case OP_POPA:
    429                 pszFmt = pCpu->uOpMode == DISCPUMODE_16BIT ? "popaw"    : "popad";
     429                pszFmt = pDis->uOpMode == DISCPUMODE_16BIT ? "popaw"    : "popad";
    430430                break;
    431431            case OP_INSB:
     
    433433                break;
    434434            case OP_INSWD:
    435                 pszFmt = pCpu->uOpMode == DISCPUMODE_16BIT ? "insw"     : pCpu->uOpMode == DISCPUMODE_32BIT ? "insd"  : "insq";
     435                pszFmt = pDis->uOpMode == DISCPUMODE_16BIT ? "insw"     : pDis->uOpMode == DISCPUMODE_32BIT ? "insd"  : "insq";
    436436                break;
    437437            case OP_OUTSB:
     
    439439                break;
    440440            case OP_OUTSWD:
    441                 pszFmt = pCpu->uOpMode == DISCPUMODE_16BIT ? "outsw"    : pCpu->uOpMode == DISCPUMODE_32BIT ? "outsd" : "outsq";
     441                pszFmt = pDis->uOpMode == DISCPUMODE_16BIT ? "outsw"    : pDis->uOpMode == DISCPUMODE_32BIT ? "outsd" : "outsq";
    442442                break;
    443443            case OP_MOVSB:
     
    445445                break;
    446446            case OP_MOVSWD:
    447                 pszFmt = pCpu->uOpMode == DISCPUMODE_16BIT ? "movsw"    : pCpu->uOpMode == DISCPUMODE_32BIT ? "movsd" : "movsq";
     447                pszFmt = pDis->uOpMode == DISCPUMODE_16BIT ? "movsw"    : pDis->uOpMode == DISCPUMODE_32BIT ? "movsd" : "movsq";
    448448                break;
    449449            case OP_CMPSB:
     
    451451                break;
    452452            case OP_CMPWD:
    453                 pszFmt = pCpu->uOpMode == DISCPUMODE_16BIT ? "cmpsw"    : pCpu->uOpMode == DISCPUMODE_32BIT ? "cmpsd" : "cmpsq";
     453                pszFmt = pDis->uOpMode == DISCPUMODE_16BIT ? "cmpsw"    : pDis->uOpMode == DISCPUMODE_32BIT ? "cmpsd" : "cmpsq";
    454454                break;
    455455            case OP_SCASB:
     
    457457                break;
    458458            case OP_SCASWD:
    459                 pszFmt = pCpu->uOpMode == DISCPUMODE_16BIT ? "scasw"    : pCpu->uOpMode == DISCPUMODE_32BIT ? "scasd" : "scasq";
     459                pszFmt = pDis->uOpMode == DISCPUMODE_16BIT ? "scasw"    : pDis->uOpMode == DISCPUMODE_32BIT ? "scasd" : "scasq";
    460460                break;
    461461            case OP_LODSB:
     
    463463                break;
    464464            case OP_LODSWD:
    465                 pszFmt = pCpu->uOpMode == DISCPUMODE_16BIT ? "lodsw"    : pCpu->uOpMode == DISCPUMODE_32BIT ? "lodsd" : "lodsq";
     465                pszFmt = pDis->uOpMode == DISCPUMODE_16BIT ? "lodsw"    : pDis->uOpMode == DISCPUMODE_32BIT ? "lodsd" : "lodsq";
    466466                break;
    467467            case OP_STOSB:
     
    469469                break;
    470470            case OP_STOSWD:
    471                 pszFmt = pCpu->uOpMode == DISCPUMODE_16BIT ? "stosw"    : pCpu->uOpMode == DISCPUMODE_32BIT ? "stosd" : "stosq";
     471                pszFmt = pDis->uOpMode == DISCPUMODE_16BIT ? "stosw"    : pDis->uOpMode == DISCPUMODE_32BIT ? "stosd" : "stosq";
    472472                break;
    473473            case OP_CBW:
    474                 pszFmt = pCpu->uOpMode == DISCPUMODE_16BIT ? "cbw"      : pCpu->uOpMode == DISCPUMODE_32BIT ? "cwde"  : "cdqe";
     474                pszFmt = pDis->uOpMode == DISCPUMODE_16BIT ? "cbw"      : pDis->uOpMode == DISCPUMODE_32BIT ? "cwde"  : "cdqe";
    475475                break;
    476476            case OP_CWD:
    477                 pszFmt = pCpu->uOpMode == DISCPUMODE_16BIT ? "cwd"      : pCpu->uOpMode == DISCPUMODE_32BIT ? "cdq"   : "cqo";
     477                pszFmt = pDis->uOpMode == DISCPUMODE_16BIT ? "cwd"      : pDis->uOpMode == DISCPUMODE_32BIT ? "cdq"   : "cqo";
    478478                break;
    479479            case OP_SHL:
     
    492492             */
    493493            case OP_NOP:
    494                 if (pCpu->bOpCode == 0x90)
     494                if (pDis->bOpCode == 0x90)
    495495                    /* fine, fine */;
    496496                else if (pszFmt[sizeof("nop %Ev") - 1] == '/' && pszFmt[sizeof("nop %Ev")] == 'p')
    497497                    pszFmt = "prefetch %Eb";
    498                 else if (pCpu->bOpCode == 0x1f)
     498                else if (pDis->bOpCode == 0x1f)
    499499                {
    500                     Assert(pCpu->cbInstr >= 3);
     500                    Assert(pDis->cbInstr >= 3);
    501501                    PUT_SZ("db 00fh, 01fh,");
    502                     PUT_NUM_8(pCpu->ModRM.u);
    503                     for (unsigned i = 3; i < pCpu->cbInstr; i++)
     502                    PUT_NUM_8(pDis->ModRM.u);
     503                    for (unsigned i = 3; i < pDis->cbInstr; i++)
    504504                    {
    505505                        PUT_C(',');
     
    540540             */
    541541            case OP_FLD:
    542                 if (pCpu->bOpCode == 0xdb) /* m80fp workaround. */
    543                     *(int *)&pCpu->Param1.fParam &= ~0x1f; /* make it pure OP_PARM_M */
     542                if (pDis->bOpCode == 0xdb) /* m80fp workaround. */
     543                    *(int *)&pDis->Param1.fParam &= ~0x1f; /* make it pure OP_PARM_M */
    544544                break;
    545545            case OP_LAR: /* hack w -> v, probably not correct. */
    546                 *(int *)&pCpu->Param2.fParam &= ~0x1f;
    547                 *(int *)&pCpu->Param2.fParam |= OP_PARM_v;
     546                *(int *)&pDis->Param2.fParam &= ~0x1f;
     547                *(int *)&pDis->Param2.fParam |= OP_PARM_v;
    548548                break;
    549549        }
     
    552552         * Formatting context and associated macros.
    553553         */
    554         PCDISOPPARAM pParam = &pCpu->Param1;
     554        PCDISOPPARAM pParam = &pDis->Param1;
    555555        int iParam = 1;
    556556
     
    572572                { \
    573573                    case OP_PARM_v: \
    574                         switch (pCpu->uOpMode) \
     574                        switch (pDis->uOpMode) \
    575575                        { \
    576576                            case DISCPUMODE_16BIT: PUT_SZ("word "); break; \
     
    602602#define PUT_SEGMENT_OVERRIDE() \
    603603        do { \
    604             if (pCpu->fPrefix & DISPREFIX_SEG) \
    605                 PUT_STR(s_szSegPrefix[pCpu->idxSegPrefix], 3); \
     604            if (pDis->fPrefix & DISPREFIX_SEG) \
     605                PUT_STR(s_szSegPrefix[pDis->idxSegPrefix], 3); \
    606606        } while (0)
    607607
     
    610610         * Segment prefixing for instructions that doesn't do memory access.
    611611         */
    612         if (    (pCpu->fPrefix & DISPREFIX_SEG)
    613             &&  !DISUSE_IS_EFFECTIVE_ADDR(pCpu->Param1.fUse)
    614             &&  !DISUSE_IS_EFFECTIVE_ADDR(pCpu->Param2.fUse)
    615             &&  !DISUSE_IS_EFFECTIVE_ADDR(pCpu->Param3.fUse))
    616         {
    617             PUT_STR(s_szSegPrefix[pCpu->idxSegPrefix], 2);
     612        if (    (pDis->fPrefix & DISPREFIX_SEG)
     613            &&  !DISUSE_IS_EFFECTIVE_ADDR(pDis->Param1.fUse)
     614            &&  !DISUSE_IS_EFFECTIVE_ADDR(pDis->Param2.fUse)
     615            &&  !DISUSE_IS_EFFECTIVE_ADDR(pDis->Param3.fUse))
     616        {
     617            PUT_STR(s_szSegPrefix[pDis->idxSegPrefix], 2);
    618618            PUT_C(' ');
    619619        }
     
    649649
    650650                        size_t cchReg;
    651                         const char *pszReg = disasmFormatYasmBaseReg(pCpu, pParam, &cchReg);
     651                        const char *pszReg = disasmFormatYasmBaseReg(pDis, pParam, &cchReg);
    652652                        PUT_STR(pszReg, cchReg);
    653653                        break;
     
    691691                                PUT_SZ("dword ");
    692692                            else if (   (fUse & DISUSE_DISPLACEMENT64)
    693                                      && (pCpu->SIB.Bits.Base != 5 || pCpu->ModRM.Bits.Mod != 0)
     693                                     && (pDis->SIB.Bits.Base != 5 || pDis->ModRM.Bits.Mod != 0)
    694694                                     && (int32_t)pParam->uDisp.i64 == (int64_t)pParam->uDisp.i64) //??
    695695                                PUT_SZ("qword ");
     
    714714                        {
    715715                            size_t cchReg;
    716                             const char *pszReg = disasmFormatYasmBaseReg(pCpu, pParam, &cchReg);
     716                            const char *pszReg = disasmFormatYasmBaseReg(pDis, pParam, &cchReg);
    717717                            PUT_STR(pszReg, cchReg);
    718718                        }
     
    724724
    725725                            size_t cchReg;
    726                             const char *pszReg = disasmFormatYasmIndexReg(pCpu, pParam, &cchReg);
     726                            const char *pszReg = disasmFormatYasmIndexReg(pDis, pParam, &cchReg);
    727727                            PUT_STR(pszReg, cchReg);
    728728
     
    798798
    799799                            case DISUSE_IMMEDIATE16:
    800                                 if (    pCpu->uCpuMode != pCpu->uOpMode
     800                                if (    pDis->uCpuMode != pDis->uOpMode
    801801                                    ||  (   (fFlags & DIS_FMT_FLAGS_STRICT)
    802802                                         && (   (int8_t)pParam->uValue == (int16_t)pParam->uValue
     
    821821
    822822                            case DISUSE_IMMEDIATE32:
    823                                 if (    pCpu->uOpMode != (pCpu->uCpuMode == DISCPUMODE_16BIT ? DISCPUMODE_16BIT : DISCPUMODE_32BIT) /* not perfect */
     823                                if (    pDis->uOpMode != (pDis->uCpuMode == DISCPUMODE_16BIT ? DISCPUMODE_16BIT : DISCPUMODE_32BIT) /* not perfect */
    824824                                    ||  (   (fFlags & DIS_FMT_FLAGS_STRICT)
    825825                                         && (   (int8_t)pParam->uValue == (int32_t)pParam->uValue
     
    905905                            PUT_SZ(" (");
    906906
    907                         RTUINTPTR uTrgAddr = pCpu->uInstrAddr + pCpu->cbInstr + offDisplacement;
    908                         if (pCpu->uCpuMode == DISCPUMODE_16BIT)
     907                        RTUINTPTR uTrgAddr = pDis->uInstrAddr + pDis->cbInstr + offDisplacement;
     908                        if (pDis->uCpuMode == DISCPUMODE_16BIT)
    909909                            PUT_NUM_16(uTrgAddr);
    910                         else if (pCpu->uCpuMode == DISCPUMODE_32BIT)
     910                        else if (pDis->uCpuMode == DISCPUMODE_32BIT)
    911911                            PUT_NUM_32(uTrgAddr);
    912912                        else
     
    915915                        if (pfnGetSymbol)
    916916                        {
    917                             int rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_REG(DISSELREG_CS), uTrgAddr, szSymbol, sizeof(szSymbol), &off, pvUser);
     917                            int rc = pfnGetSymbol(pDis, DIS_FMT_SEL_FROM_REG(DISSELREG_CS), uTrgAddr, szSymbol, sizeof(szSymbol), &off, pvUser);
    918918                            if (RT_SUCCESS(rc))
    919919                            {
     
    954954                                PUT_NUM_16(pParam->uValue);
    955955                                if (pfnGetSymbol)
    956                                     rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_VALUE(pParam->uValue >> 16), (uint16_t)pParam->uValue, szSymbol, sizeof(szSymbol), &off, pvUser);
     956                                    rc = pfnGetSymbol(pDis, DIS_FMT_SEL_FROM_VALUE(pParam->uValue >> 16), (uint16_t)pParam->uValue, szSymbol, sizeof(szSymbol), &off, pvUser);
    957957                                break;
    958958                            case DISUSE_IMMEDIATE_ADDR_16_32:
     
    961961                                PUT_NUM_32(pParam->uValue);
    962962                                if (pfnGetSymbol)
    963                                     rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_VALUE(pParam->uValue >> 16), (uint32_t)pParam->uValue, szSymbol, sizeof(szSymbol), &off, pvUser);
     963                                    rc = pfnGetSymbol(pDis, DIS_FMT_SEL_FROM_VALUE(pParam->uValue >> 16), (uint32_t)pParam->uValue, szSymbol, sizeof(szSymbol), &off, pvUser);
    964964                                break;
    965965                            case DISUSE_DISPLACEMENT16:
    966966                                PUT_NUM_16(pParam->uValue);
    967967                                if (pfnGetSymbol)
    968                                     rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_REG(DISSELREG_CS), (uint16_t)pParam->uValue, szSymbol, sizeof(szSymbol), &off, pvUser);
     968                                    rc = pfnGetSymbol(pDis, DIS_FMT_SEL_FROM_REG(DISSELREG_CS), (uint16_t)pParam->uValue, szSymbol, sizeof(szSymbol), &off, pvUser);
    969969                                break;
    970970                            case DISUSE_DISPLACEMENT32:
    971971                                PUT_NUM_32(pParam->uValue);
    972972                                if (pfnGetSymbol)
    973                                     rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_REG(DISSELREG_CS), (uint32_t)pParam->uValue, szSymbol, sizeof(szSymbol), &off, pvUser);
     973                                    rc = pfnGetSymbol(pDis, DIS_FMT_SEL_FROM_REG(DISSELREG_CS), (uint32_t)pParam->uValue, szSymbol, sizeof(szSymbol), &off, pvUser);
    974974                                break;
    975975                            case DISUSE_DISPLACEMENT64:
    976976                                PUT_NUM_64(pParam->uValue);
    977977                                if (pfnGetSymbol)
    978                                     rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_REG(DISSELREG_CS), (uint64_t)pParam->uValue, szSymbol, sizeof(szSymbol), &off, pvUser);
     978                                    rc = pfnGetSymbol(pDis, DIS_FMT_SEL_FROM_REG(DISSELREG_CS), (uint64_t)pParam->uValue, szSymbol, sizeof(szSymbol), &off, pvUser);
    979979                                break;
    980980                            default:
     
    10181018                                PUT_NUM_16(pParam->uValue);
    10191019                                if (pfnGetSymbol)
    1020                                     rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_VALUE(pParam->uValue >> 16), (uint16_t)pParam->uValue, szSymbol, sizeof(szSymbol), &off, pvUser);
     1020                                    rc = pfnGetSymbol(pDis, DIS_FMT_SEL_FROM_VALUE(pParam->uValue >> 16), (uint16_t)pParam->uValue, szSymbol, sizeof(szSymbol), &off, pvUser);
    10211021                                break;
    10221022                            case DISUSE_IMMEDIATE_ADDR_16_32:
     
    10251025                                PUT_NUM_32(pParam->uValue);
    10261026                                if (pfnGetSymbol)
    1027                                     rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_VALUE(pParam->uValue >> 16), (uint32_t)pParam->uValue, szSymbol, sizeof(szSymbol), &off, pvUser);
     1027                                    rc = pfnGetSymbol(pDis, DIS_FMT_SEL_FROM_VALUE(pParam->uValue >> 16), (uint32_t)pParam->uValue, szSymbol, sizeof(szSymbol), &off, pvUser);
    10281028                                break;
    10291029                            case DISUSE_DISPLACEMENT16:
    10301030                                PUT_NUM_16(pParam->uDisp.i16);
    10311031                                if (pfnGetSymbol)
    1032                                     rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_REG(DISSELREG_CS), pParam->uDisp.u16, szSymbol, sizeof(szSymbol), &off, pvUser);
     1032                                    rc = pfnGetSymbol(pDis, DIS_FMT_SEL_FROM_REG(DISSELREG_CS), pParam->uDisp.u16, szSymbol, sizeof(szSymbol), &off, pvUser);
    10331033                                break;
    10341034                            case DISUSE_DISPLACEMENT32:
    10351035                                PUT_NUM_32(pParam->uDisp.i32);
    10361036                                if (pfnGetSymbol)
    1037                                     rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_REG(DISSELREG_CS), pParam->uDisp.u32, szSymbol, sizeof(szSymbol), &off, pvUser);
     1037                                    rc = pfnGetSymbol(pDis, DIS_FMT_SEL_FROM_REG(DISSELREG_CS), pParam->uDisp.u32, szSymbol, sizeof(szSymbol), &off, pvUser);
    10381038                                break;
    10391039                            case DISUSE_DISPLACEMENT64:
    10401040                                PUT_NUM_64(pParam->uDisp.i64);
    10411041                                if (pfnGetSymbol)
    1042                                     rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_REG(DISSELREG_CS), pParam->uDisp.u64, szSymbol, sizeof(szSymbol), &off, pvUser);
     1042                                    rc = pfnGetSymbol(pDis, DIS_FMT_SEL_FROM_REG(DISSELREG_CS), pParam->uDisp.u64, szSymbol, sizeof(szSymbol), &off, pvUser);
    10431043                                break;
    10441044                            default:
     
    10811081
    10821082                        size_t cchReg;
    1083                         const char *pszReg = disasmFormatYasmBaseReg(pCpu, pParam, &cchReg);
     1083                        const char *pszReg = disasmFormatYasmBaseReg(pDis, pParam, &cchReg);
    10841084                        PUT_STR(pszReg, cchReg);
    10851085                        PUT_C(']');
     
    10911091                        Assert(RT_C_IS_ALPHA(pszFmt[0]) && RT_C_IS_ALPHA(pszFmt[1]) && !RT_C_IS_ALPHA(pszFmt[2])); pszFmt += 2;
    10921092                        size_t cchReg;
    1093                         const char *pszReg = disasmFormatYasmBaseReg(pCpu, pParam, &cchReg);
     1093                        const char *pszReg = disasmFormatYasmBaseReg(pDis, pParam, &cchReg);
    10941094                        PUT_STR(pszReg, cchReg);
    10951095                        break;
     
    11111111                    switch (++iParam)
    11121112                    {
    1113                         case 2: pParam = &pCpu->Param2; break;
    1114                         case 3: pParam = &pCpu->Param3; break;
     1113                        case 2: pParam = &pDis->Param2; break;
     1114                        case 3: pParam = &pDis->Param3; break;
    11151115                        default: pParam = NULL; break;
    11161116                    }
     
    11411141            PUT_C(' ');
    11421142#if HC_ARCH_BITS == 64 || GC_ARCH_BITS == 64
    1143             if (pCpu->uInstrAddr >= _4G)
    1144                 PUT_NUM(9, "%08x`", (uint32_t)(pCpu->uInstrAddr >> 32));
     1143            if (pDis->uInstrAddr >= _4G)
     1144                PUT_NUM(9, "%08x`", (uint32_t)(pDis->uInstrAddr >> 32));
    11451145#endif
    1146             PUT_NUM(8, "%08x", (uint32_t)pCpu->uInstrAddr);
     1146            PUT_NUM(8, "%08x", (uint32_t)pDis->uInstrAddr);
    11471147        }
    11481148
     
    11531153        {
    11541154            PUT_C(' ');
    1155             size_t cchTmp = disFormatBytes(pCpu, pszDst, cchDst, fFlags);
     1155            size_t cchTmp = disFormatBytes(pDis, pszDst, cchDst, fFlags);
    11561156            cchOutput += cchTmp;
    11571157            if (cchTmp >= cchDst)
     
    11871187 * @returns The number of output characters. If this is >= cchBuf, then the content
    11881188 *          of pszBuf will be truncated.
    1189  * @param   pCpu    Pointer to the disassembler CPU state.
     1189 * @param   pDis    Pointer to the disassembler state.
    11901190 * @param   pszBuf  The output buffer.
    11911191 * @param   cchBuf  The size of the output buffer.
    11921192 */
    1193 DISDECL(size_t) DISFormatYasm(PCDISCPUSTATE pCpu, char *pszBuf, size_t cchBuf)
    1194 {
    1195     return DISFormatYasmEx(pCpu, pszBuf, cchBuf, 0 /* fFlags */, NULL /* pfnGetSymbol */, NULL /* pvUser */);
     1193DISDECL(size_t) DISFormatYasm(PCDISCPUSTATE pDis, char *pszBuf, size_t cchBuf)
     1194{
     1195    return DISFormatYasmEx(pDis, pszBuf, cchBuf, 0 /* fFlags */, NULL /* pfnGetSymbol */, NULL /* pvUser */);
    11961196}
    11971197
     
    12021202 *
    12031203 * @returns true if it's odd, false if it isn't.
    1204  * @param   pCpu        The disassembler output.  The byte fetcher callback will
     1204 * @param   pDis        The disassembler output.  The byte fetcher callback will
    12051205 *                      be used if present as we might need to fetch opcode
    12061206 *                      bytes.
    12071207 */
    1208 DISDECL(bool) DISFormatYasmIsOddEncoding(PDISCPUSTATE pCpu)
     1208DISDECL(bool) DISFormatYasmIsOddEncoding(PDISCPUSTATE pDis)
    12091209{
    12101210    /*
    12111211     * Mod rm + SIB: Check for duplicate EBP encodings that yasm won't use for very good reasons.
    12121212     */
    1213     if (    pCpu->uAddrMode != DISCPUMODE_16BIT ///@todo correct?
    1214         &&  pCpu->ModRM.Bits.Rm == 4
    1215         &&  pCpu->ModRM.Bits.Mod != 3)
     1213    if (    pDis->uAddrMode != DISCPUMODE_16BIT ///@todo correct?
     1214        &&  pDis->ModRM.Bits.Rm == 4
     1215        &&  pDis->ModRM.Bits.Mod != 3)
    12161216    {
    12171217        /* No scaled index SIB (index=4), except for ESP. */
    1218         if (    pCpu->SIB.Bits.Index == 4
    1219             &&  pCpu->SIB.Bits.Base != 4)
     1218        if (    pDis->SIB.Bits.Index == 4
     1219            &&  pDis->SIB.Bits.Base != 4)
    12201220            return true;
    12211221
    12221222        /* EBP + displacement */
    1223         if (    pCpu->ModRM.Bits.Mod != 0
    1224              && pCpu->SIB.Bits.Base == 5
    1225              && pCpu->SIB.Bits.Scale == 0)
     1223        if (    pDis->ModRM.Bits.Mod != 0
     1224             && pDis->SIB.Bits.Base == 5
     1225             && pDis->SIB.Bits.Scale == 0)
    12261226            return true;
    12271227    }
     
    12301230     * Seems to be an instruction alias here, but I cannot find any docs on it... hrmpf!
    12311231     */
    1232     if (    pCpu->pCurInstr->uOpcode == OP_SHL
    1233         &&  pCpu->ModRM.Bits.Reg == 6)
     1232    if (    pDis->pCurInstr->uOpcode == OP_SHL
     1233        &&  pDis->ModRM.Bits.Reg == 6)
    12341234        return true;
    12351235
     
    12381238     */
    12391239    uint32_t fPrefixes = 0;
    1240     for (uint32_t offOpcode = 0; offOpcode < RT_ELEMENTS(pCpu->abInstr); offOpcode++)
     1240    for (uint32_t offOpcode = 0; offOpcode < RT_ELEMENTS(pDis->abInstr); offOpcode++)
    12411241    {
    12421242        uint32_t f;
    1243         switch (pCpu->abInstr[offOpcode])
     1243        switch (pDis->abInstr[offOpcode])
    12441244        {
    12451245            case 0xf0:
     
    12711271            case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47:
    12721272            case 0x48: case 0x49: case 0x4a: case 0x4b: case 0x4c: case 0x4d: case 0x4e: case 0x4f:
    1273                 f = pCpu->uCpuMode == DISCPUMODE_64BIT ? DISPREFIX_REX : 0;
     1273                f = pDis->uCpuMode == DISCPUMODE_64BIT ? DISPREFIX_REX : 0;
    12741274                break;
    12751275
     
    12891289    {
    12901290        /* no effective address which it may apply to. */
    1291         Assert((pCpu->fPrefix & DISPREFIX_SEG) || pCpu->uCpuMode == DISCPUMODE_64BIT);
    1292         if (    !DISUSE_IS_EFFECTIVE_ADDR(pCpu->Param1.fUse)
    1293             &&  !DISUSE_IS_EFFECTIVE_ADDR(pCpu->Param2.fUse)
    1294             &&  !DISUSE_IS_EFFECTIVE_ADDR(pCpu->Param3.fUse))
     1291        Assert((pDis->fPrefix & DISPREFIX_SEG) || pDis->uCpuMode == DISCPUMODE_64BIT);
     1292        if (    !DISUSE_IS_EFFECTIVE_ADDR(pDis->Param1.fUse)
     1293            &&  !DISUSE_IS_EFFECTIVE_ADDR(pDis->Param2.fUse)
     1294            &&  !DISUSE_IS_EFFECTIVE_ADDR(pDis->Param3.fUse))
    12951295            return true;
    12961296    }
     
    12991299    if (fPrefixes & DISPREFIX_ADDRSIZE)
    13001300    {
    1301         Assert(pCpu->fPrefix & DISPREFIX_ADDRSIZE);
    1302         if (    pCpu->pCurInstr->fParam3 == OP_PARM_NONE
    1303             &&  pCpu->pCurInstr->fParam2 == OP_PARM_NONE
    1304             &&  (   pCpu->pCurInstr->fParam1 >= OP_PARM_REG_GEN32_START
    1305                  && pCpu->pCurInstr->fParam1 <= OP_PARM_REG_GEN32_END))
     1301        Assert(pDis->fPrefix & DISPREFIX_ADDRSIZE);
     1302        if (    pDis->pCurInstr->fParam3 == OP_PARM_NONE
     1303            &&  pDis->pCurInstr->fParam2 == OP_PARM_NONE
     1304            &&  (   pDis->pCurInstr->fParam1 >= OP_PARM_REG_GEN32_START
     1305                 && pDis->pCurInstr->fParam1 <= OP_PARM_REG_GEN32_END))
    13061306            return true;
    13071307    }
     
    13101310    if (fPrefixes)
    13111311    {
    1312         switch (pCpu->pCurInstr->uOpcode)
     1312        switch (pDis->pCurInstr->uOpcode)
    13131313        {
    13141314            /* nop w/ prefix(es). */
     
    13171317
    13181318            case OP_JMP:
    1319                 if (    pCpu->pCurInstr->fParam1 != OP_PARM_Jb
    1320                     &&  pCpu->pCurInstr->fParam1 != OP_PARM_Jv)
     1319                if (    pDis->pCurInstr->fParam1 != OP_PARM_Jb
     1320                    &&  pDis->pCurInstr->fParam1 != OP_PARM_Jv)
    13211321                    break;
    13221322                /* fall thru */
     
    13461346    if (fPrefixes & ~DISPREFIX_SEG)
    13471347    {
    1348         switch (pCpu->pCurInstr->uOpcode)
     1348        switch (pDis->pCurInstr->uOpcode)
    13491349        {
    13501350            case OP_POP:
    13511351            case OP_PUSH:
    1352                 if (    pCpu->pCurInstr->fParam1 >= OP_PARM_REG_SEG_START
    1353                     &&  pCpu->pCurInstr->fParam1 <= OP_PARM_REG_SEG_END)
     1352                if (    pDis->pCurInstr->fParam1 >= OP_PARM_REG_SEG_START
     1353                    &&  pDis->pCurInstr->fParam1 <= OP_PARM_REG_SEG_END)
    13541354                    return true;
    13551355                if (    (fPrefixes & ~DISPREFIX_OPSIZE)
    1356                     &&  pCpu->pCurInstr->fParam1 >= OP_PARM_REG_GEN32_START
    1357                     &&  pCpu->pCurInstr->fParam1 <= OP_PARM_REG_GEN32_END)
     1356                    &&  pDis->pCurInstr->fParam1 >= OP_PARM_REG_GEN32_START
     1357                    &&  pDis->pCurInstr->fParam1 <= OP_PARM_REG_GEN32_END)
    13581358                    return true;
    13591359                break;
     
    13711371    /* Implicit 8-bit register instructions doesn't mix with operand size. */
    13721372    if (    (fPrefixes & DISPREFIX_OPSIZE)
    1373         &&  (   (   pCpu->pCurInstr->fParam1 == OP_PARM_Gb /* r8 */
    1374                  && pCpu->pCurInstr->fParam2 == OP_PARM_Eb /* r8/mem8 */)
    1375              || (   pCpu->pCurInstr->fParam2 == OP_PARM_Gb /* r8 */
    1376                  && pCpu->pCurInstr->fParam1 == OP_PARM_Eb /* r8/mem8 */))
     1373        &&  (   (   pDis->pCurInstr->fParam1 == OP_PARM_Gb /* r8 */
     1374                 && pDis->pCurInstr->fParam2 == OP_PARM_Eb /* r8/mem8 */)
     1375             || (   pDis->pCurInstr->fParam2 == OP_PARM_Gb /* r8 */
     1376                 && pDis->pCurInstr->fParam1 == OP_PARM_Eb /* r8/mem8 */))
    13771377       )
    13781378    {
    1379         switch (pCpu->pCurInstr->uOpcode)
     1379        switch (pDis->pCurInstr->uOpcode)
    13801380        {
    13811381            case OP_ADD:
     
    14011401     *        yasm: 18F5   sbb ch, dh     ; SBB r/m8, r8
    14021402     */
    1403     if (pCpu->ModRM.Bits.Mod == 3 /* reg,reg */)
    1404     {
    1405         switch (pCpu->pCurInstr->uOpcode)
     1403    if (pDis->ModRM.Bits.Mod == 3 /* reg,reg */)
     1404    {
     1405        switch (pDis->pCurInstr->uOpcode)
    14061406        {
    14071407            case OP_ADD:
     
    14131413            case OP_XOR:
    14141414            case OP_CMP:
    1415                 if (    (    pCpu->pCurInstr->fParam1 == OP_PARM_Gb /* r8 */
    1416                          && pCpu->pCurInstr->fParam2 == OP_PARM_Eb /* r8/mem8 */)
    1417                     ||  (    pCpu->pCurInstr->fParam1 == OP_PARM_Gv /* rX */
    1418                          && pCpu->pCurInstr->fParam2 == OP_PARM_Ev /* rX/memX */))
     1415                if (    (    pDis->pCurInstr->fParam1 == OP_PARM_Gb /* r8 */
     1416                         && pDis->pCurInstr->fParam2 == OP_PARM_Eb /* r8/mem8 */)
     1417                    ||  (    pDis->pCurInstr->fParam1 == OP_PARM_Gv /* rX */
     1418                         && pDis->pCurInstr->fParam2 == OP_PARM_Ev /* rX/memX */))
    14191419                    return true;
    14201420
    14211421                /* 82 (see table A-6). */
    1422                 if (pCpu->bOpCode == 0x82)
     1422                if (pDis->bOpCode == 0x82)
    14231423                    return true;
    14241424                break;
     
    14311431            case OP_POP:
    14321432            case OP_PUSH:
    1433                 Assert(pCpu->bOpCode == 0x8f);
     1433                Assert(pDis->bOpCode == 0x8f);
    14341434                return true;
    14351435
    14361436            case OP_MOV:
    1437                 if (   pCpu->bOpCode == 0x8a
    1438                     || pCpu->bOpCode == 0x8b)
     1437                if (   pDis->bOpCode == 0x8a
     1438                    || pDis->bOpCode == 0x8b)
    14391439                    return true;
    14401440                break;
     
    14461446
    14471447    /* shl eax,1 will be assembled to the form without the immediate byte. */
    1448     if (    pCpu->pCurInstr->fParam2 == OP_PARM_Ib
    1449         &&  (uint8_t)pCpu->Param2.uValue == 1)
    1450     {
    1451         switch (pCpu->pCurInstr->uOpcode)
     1448    if (    pDis->pCurInstr->fParam2 == OP_PARM_Ib
     1449        &&  (uint8_t)pDis->Param2.uValue == 1)
     1450    {
     1451        switch (pDis->pCurInstr->uOpcode)
    14521452        {
    14531453            case OP_SHL:
     
    14631463
    14641464    /* And some more - see table A-6. */
    1465     if (pCpu->bOpCode == 0x82)
    1466     {
    1467         switch (pCpu->pCurInstr->uOpcode)
     1465    if (pDis->bOpCode == 0x82)
     1466    {
     1467        switch (pDis->pCurInstr->uOpcode)
    14681468        {
    14691469            case OP_ADD:
     
    14851485    /* Yasm encodes setnbe al with /2 instead of /0 like the AMD manual
    14861486       says (intel doesn't appear to care). */
    1487     switch (pCpu->pCurInstr->uOpcode)
     1487    switch (pDis->pCurInstr->uOpcode)
    14881488    {
    14891489        case OP_SETO:
     
    15031503        case OP_SETLE:
    15041504        case OP_SETNLE:
    1505             AssertMsg(pCpu->bOpCode >= 0x90 && pCpu->bOpCode <= 0x9f, ("%#x\n", pCpu->bOpCode));
    1506             if (pCpu->ModRM.Bits.Reg != 2)
     1505            AssertMsg(pDis->bOpCode >= 0x90 && pDis->bOpCode <= 0x9f, ("%#x\n", pDis->bOpCode));
     1506            if (pDis->ModRM.Bits.Reg != 2)
    15071507                return true;
    15081508            break;
     
    15131513     * doesn't quite make sense...
    15141514     */
    1515     if (    pCpu->pCurInstr->uOpcode == OP_MOVZX
    1516         &&  pCpu->bOpCode == 0xB7
    1517         &&  (pCpu->uCpuMode == DISCPUMODE_16BIT) != !!(fPrefixes & DISPREFIX_OPSIZE))
     1515    if (    pDis->pCurInstr->uOpcode == OP_MOVZX
     1516        &&  pDis->bOpCode == 0xB7
     1517        &&  (pDis->uCpuMode == DISCPUMODE_16BIT) != !!(fPrefixes & DISPREFIX_OPSIZE))
    15181518        return true;
    15191519
  • trunk/src/VBox/Disassembler/DisasmInternal.h

    r41707 r41789  
    171171
    172172
    173 size_t disFormatBytes(PCDISCPUSTATE pCpu, char *pszDst, size_t cchDst, uint32_t fFlags);
     173size_t disFormatBytes(PCDISCPUSTATE pDis, char *pszDst, size_t cchDst, uint32_t fFlags);
    174174
    175175/** @} */
  • trunk/src/VBox/Disassembler/DisasmReg.cpp

    r41744 r41789  
    201201//*****************************************************************************
    202202//*****************************************************************************
    203 DISDECL(int) DISGetParamSize(PDISCPUSTATE pCpu, PDISOPPARAM pParam)
     203DISDECL(int) DISGetParamSize(PCDISCPUSTATE pDis, PCDISOPPARAM pParam)
    204204{
    205205    unsigned subtype = OP_PARM_VSUBTYPE(pParam->fParam);
     
    207207    if (subtype == OP_PARM_v)
    208208    {
    209         switch (pCpu->uOpMode)
     209        switch (pDis->uOpMode)
    210210        {
    211211        case DISCPUMODE_32BIT:
     
    240240
    241241    case OP_PARM_p: /* far pointer */
    242         if (pCpu->uAddrMode == DISCPUMODE_32BIT)
     242        if (pDis->uAddrMode == DISCPUMODE_32BIT)
    243243            return 6;   /* 16:32 */
    244244        else
    245         if (pCpu->uAddrMode == DISCPUMODE_64BIT)
     245        if (pDis->uAddrMode == DISCPUMODE_64BIT)
    246246            return 12;  /* 16:64 */
    247247        else
     
    257257//*****************************************************************************
    258258//*****************************************************************************
    259 DISDECL(DISSELREG) DISDetectSegReg(PDISCPUSTATE pCpu, PDISOPPARAM pParam)
    260 {
    261     if (pCpu->fPrefix & DISPREFIX_SEG)
     259DISDECL(DISSELREG) DISDetectSegReg(PCDISCPUSTATE pDis, PCDISOPPARAM pParam)
     260{
     261    if (pDis->fPrefix & DISPREFIX_SEG)
    262262        /* Use specified SEG: prefix. */
    263         return (DISSELREG)pCpu->idxSegPrefix;
     263        return (DISSELREG)pDis->idxSegPrefix;
    264264
    265265    /* Guess segment register by parameter type. */
     
    278278//*****************************************************************************
    279279//*****************************************************************************
    280 DISDECL(uint8_t) DISQuerySegPrefixByte(PDISCPUSTATE pCpu)
    281 {
    282     Assert(pCpu->fPrefix & DISPREFIX_SEG);
    283     switch (pCpu->idxSegPrefix)
     280DISDECL(uint8_t) DISQuerySegPrefixByte(PCDISCPUSTATE pDis)
     281{
     282    Assert(pDis->fPrefix & DISPREFIX_SEG);
     283    switch (pDis->idxSegPrefix)
    284284    {
    285285    case DISSELREG_ES:
     
    491491 * @returns VBox error code
    492492 * @param   pCtx            CPU context structure pointer
    493  * @param   pCpu            Pointer to cpu structure which have DISCPUSTATE::mode
    494  *                          set correctly.
     493 * @param   pDis            Pointer to the disassembler state.
    495494 * @param   pParam          Pointer to the parameter to parse
    496495 * @param   pParamVal       Pointer to parameter value (OUT)
     
    500499 *
    501500 */
    502 DISDECL(int) DISQueryParamVal(PCPUMCTXCORE pCtx, PDISCPUSTATE pCpu, PDISOPPARAM pParam, PDISQPVPARAMVAL pParamVal, DISQPVWHICH parmtype)
     501DISDECL(int) DISQueryParamVal(PCPUMCTXCORE pCtx, PCDISCPUSTATE pDis, PCDISOPPARAM pParam, PDISQPVPARAMVAL pParamVal, DISQPVWHICH parmtype)
    503502{
    504503    memset(pParamVal, 0, sizeof(*pParamVal));
     
    587586        if (pParam->fUse & DISUSE_DISPLACEMENT8)
    588587        {
    589             if (pCpu->uCpuMode == DISCPUMODE_32BIT)
     588            if (pDis->uCpuMode == DISCPUMODE_32BIT)
    590589                pParamVal->val.val32 += (int32_t)pParam->uDisp.i8;
    591590            else
    592             if (pCpu->uCpuMode == DISCPUMODE_64BIT)
     591            if (pDis->uCpuMode == DISCPUMODE_64BIT)
    593592                pParamVal->val.val64 += (int64_t)pParam->uDisp.i8;
    594593            else
     
    598597        if (pParam->fUse & DISUSE_DISPLACEMENT16)
    599598        {
    600             if (pCpu->uCpuMode == DISCPUMODE_32BIT)
     599            if (pDis->uCpuMode == DISCPUMODE_32BIT)
    601600                pParamVal->val.val32 += (int32_t)pParam->uDisp.i16;
    602601            else
    603             if (pCpu->uCpuMode == DISCPUMODE_64BIT)
     602            if (pDis->uCpuMode == DISCPUMODE_64BIT)
    604603                pParamVal->val.val64 += (int64_t)pParam->uDisp.i16;
    605604            else
     
    609608        if (pParam->fUse & DISUSE_DISPLACEMENT32)
    610609        {
    611             if (pCpu->uCpuMode == DISCPUMODE_32BIT)
     610            if (pDis->uCpuMode == DISCPUMODE_32BIT)
    612611                pParamVal->val.val32 += pParam->uDisp.i32;
    613612            else
     
    617616        if (pParam->fUse & DISUSE_DISPLACEMENT64)
    618617        {
    619             Assert(pCpu->uCpuMode == DISCPUMODE_64BIT);
     618            Assert(pDis->uCpuMode == DISCPUMODE_64BIT);
    620619            pParamVal->val.val64 += pParam->uDisp.i64;
    621620        }
     
    623622        if (pParam->fUse & DISUSE_RIPDISPLACEMENT32)
    624623        {
    625             Assert(pCpu->uCpuMode == DISCPUMODE_64BIT);
     624            Assert(pDis->uCpuMode == DISCPUMODE_64BIT);
    626625            /* Relative to the RIP of the next instruction. */
    627             pParamVal->val.val64 += pParam->uDisp.i32 + pCtx->rip + pCpu->cbInstr;
     626            pParamVal->val.val64 += pParam->uDisp.i32 + pCtx->rip + pDis->cbInstr;
    628627        }
    629628        return VINF_SUCCESS;
     
    750749 * @returns VBox error code
    751750 * @param   pCtx            CPU context structure pointer
    752  * @param   pCpu            Pointer to cpu structure which have DISCPUSTATE::mode
    753  *                          set correctly.
     751 * @param   pDis            Pointer to the disassembler state.
    754752 * @param   pParam          Pointer to the parameter to parse
    755753 * @param   pReg            Pointer to parameter value (OUT)
     
    759757 *
    760758 */
    761 DISDECL(int) DISQueryParamRegPtr(PCPUMCTXCORE pCtx, PDISCPUSTATE pCpu, PDISOPPARAM pParam, void **ppReg, size_t *pcbSize)
    762 {
    763     NOREF(pCpu);
     759DISDECL(int) DISQueryParamRegPtr(PCPUMCTXCORE pCtx, PCDISCPUSTATE pDis, PCDISOPPARAM pParam, void **ppReg, size_t *pcbSize)
     760{
     761    NOREF(pDis);
    764762    if (pParam->fUse & (DISUSE_REG_GEN8|DISUSE_REG_GEN16|DISUSE_REG_GEN32|DISUSE_REG_FP|DISUSE_REG_MMX|DISUSE_REG_XMM|DISUSE_REG_CR|DISUSE_REG_DBG|DISUSE_REG_SEG|DISUSE_REG_TEST))
    765763    {
  • trunk/src/VBox/Disassembler/testcase/tstDisasm-2.cpp

    r41781 r41789  
    128128 * @returns true if it's valid. false if it isn't.
    129129 *
    130  * @param   pCpu        The disassembler output.
    131  */
    132 static bool MyDisasIsValidInstruction(DISCPUSTATE const *pCpu)
    133 {
    134     switch (pCpu->pCurInstr->uOpcode)
     130 * @param   pDis        The disassembler output.
     131 */
     132static bool MyDisasIsValidInstruction(DISCPUSTATE const *pDis)
     133{
     134    switch (pDis->pCurInstr->uOpcode)
    135135    {
    136136        /* These doesn't take memory operands. */
     
    138138        case OP_MOV_DR:
    139139        case OP_MOV_TR:
    140             if (pCpu->ModRM.Bits.Mod != 3)
     140            if (pDis->ModRM.Bits.Mod != 3)
    141141                return false;
    142142            break;
     
    144144         /* The 0x8f /0 variant of this instruction doesn't get its /r value verified. */
    145145        case OP_POP:
    146             if (    pCpu->bOpCode == 0x8f
    147                 &&  pCpu->ModRM.Bits.Reg != 0)
     146            if (    pDis->bOpCode == 0x8f
     147                &&  pDis->ModRM.Bits.Reg != 0)
    148148                return false;
    149149            break;
     
    151151        /* The 0xc6 /0 and 0xc7 /0 variants of this instruction don't get their /r values verified. */
    152152        case OP_MOV:
    153             if (    (   pCpu->bOpCode == 0xc6
    154                      || pCpu->bOpCode == 0xc7)
    155                 &&  pCpu->ModRM.Bits.Reg != 0)
     153            if (    (   pDis->bOpCode == 0xc6
     154                     || pDis->bOpCode == 0xc7)
     155                &&  pDis->ModRM.Bits.Reg != 0)
    156156                return false;
    157157            break;
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