VirtualBox

Ignore:
Timestamp:
Jun 11, 2012 10:21:44 PM (13 years ago)
Author:
vboxsync
Message:

DIS,VMM,REM,IPRT: Disassembler API adjustments.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Disassembler/testcase/tstDisasm-2.cpp

    r41501 r41658  
    171171 *       however the current doesn't do this and is just complicated...
    172172 */
    173 static DECLCALLBACK(int) MyDisasInstrRead(RTUINTPTR uSrcAddr, uint8_t *pbDst, uint32_t cbRead, void *pvDisCpu)
    174 {
    175     PMYDISSTATE pState = (PMYDISSTATE)pvDisCpu;
     173static DECLCALLBACK(int) MyDisasInstrRead(PDISCPUSTATE pDisState, uint8_t *pbDst, RTUINTPTR uSrcAddr, uint32_t cbToRead)
     174{
     175    PMYDISSTATE pState = (PMYDISSTATE)pDisState;
    176176    if (RT_LIKELY(   pState->uNextAddr == uSrcAddr
    177                   && pState->cbLeft >= cbRead))
     177                  && pState->cbLeft >= cbToRead))
    178178    {
    179179        /*
    180180         * Straight forward reading.
    181181         */
    182         if (cbRead == 1)
     182        if (cbToRead == 1)
    183183        {
    184184            pState->cbLeft--;
     
    188188        else
    189189        {
    190             memcpy(pbDst, pState->pbNext, cbRead);
    191             pState->pbNext += cbRead;
    192             pState->cbLeft -= cbRead;
    193             pState->uNextAddr += cbRead;
     190            memcpy(pbDst, pState->pbNext, cbToRead);
     191            pState->pbNext += cbToRead;
     192            pState->cbLeft -= cbToRead;
     193            pState->uNextAddr += cbToRead;
    194194        }
    195195    }
     
    211211                pState->cbLeft = 0;
    212212
    213                 memset(pbDst, 0xcc, cbRead);
     213                memset(pbDst, 0xcc, cbToRead);
    214214                pState->rc = VERR_EOF;
    215215                return VERR_EOF;
     
    227227
    228228            /* do the reading. */
    229             if (pState->cbLeft >= cbRead)
    230             {
    231                 memcpy(pbDst, pState->pbNext, cbRead);
    232                 pState->cbLeft -= cbRead;
    233                 pState->pbNext += cbRead;
    234                 pState->uNextAddr += cbRead;
     229            if (pState->cbLeft >= cbToRead)
     230            {
     231                memcpy(pbDst, pState->pbNext, cbToRead);
     232                pState->cbLeft -= cbToRead;
     233                pState->pbNext += cbToRead;
     234                pState->uNextAddr += cbToRead;
    235235            }
    236236            else
     
    240240                    memcpy(pbDst, pState->pbNext, pState->cbLeft);
    241241                    pbDst += pState->cbLeft;
    242                     cbRead -= (uint32_t)pState->cbLeft;
     242                    cbToRead -= (uint32_t)pState->cbLeft;
    243243                    pState->pbNext += pState->cbLeft;
    244244                    pState->uNextAddr += pState->cbLeft;
    245245                    pState->cbLeft = 0;
    246246                }
    247                 memset(pbDst, 0xcc, cbRead);
     247                memset(pbDst, 0xcc, cbToRead);
    248248                pState->rc = VERR_EOF;
    249249                return VERR_EOF;
     
    253253        {
    254254            RTStrmPrintf(g_pStdErr, "Reading before current instruction!\n");
    255             memset(pbDst, 0x90, cbRead);
     255            memset(pbDst, 0x90, cbToRead);
    256256            pState->rc = VERR_INTERNAL_ERROR;
    257257            return VERR_INTERNAL_ERROR;
     
    286286     */
    287287    MYDISSTATE State;
    288     State.Cpu.mode = enmCpuMode;
    289     State.Cpu.pfnReadBytes = MyDisasInstrRead;
    290288    State.uAddress = uAddress;
    291289    State.pbInstr = pbFile;
     
    331329        State.pbNext = State.pbInstr;
    332330
    333         int rc = DISInstr(&State.Cpu, State.uAddress, 0, &State.cbInstr, State.szLine);
     331
     332        int rc = DISInstrWithReader(State.uAddress, enmCpuMode, MyDisasInstrRead, &State,
     333                                    &State.Cpu, &State.cbInstr, State.szLine);
    334334        if (    RT_SUCCESS(rc)
    335335            ||  (   (   rc == VERR_DIS_INVALID_OPCODE
     
    345345            if (State.fUndefOp && State.enmUndefOp == kUndefOp_DefineByte)
    346346            {
     347                if (!State.cbInstr)
     348                {
     349                    State.Cpu.abInstr[0] = 0;
     350                    State.Cpu.pfnReadBytes(&State.Cpu, &State.Cpu.abInstr[0], State.uAddress, 1);
     351                    State.cbInstr = 1;
     352                }
    347353                RTPrintf("    db");
    348                 if (!State.cbInstr)
    349                     State.cbInstr = 1;
    350354                for (unsigned off = 0; off < State.cbInstr; off++)
    351                 {
    352                     uint8_t b;
    353                     State.Cpu.pfnReadBytes(State.uAddress + off, &b, 1, &State.Cpu);
    354                     RTPrintf(off ? ", %03xh" : " %03xh", b);
    355                 }
     355                    RTPrintf(off ? ", %03xh" : " %03xh", State.Cpu.abInstr[off]);
    356356                RTPrintf("    ; %s\n", State.szLine);
    357357            }
     
    376376                    RTPrintf("    db");
    377377                    for (unsigned off = 0; off < State.cbInstr; off++)
    378                     {
    379                         uint8_t b;
    380                         State.Cpu.pfnReadBytes(State.uAddress + off, &b, 1, &State.Cpu);
    381                         RTPrintf(off ? ", %03xh" : " %03xh", b);
    382                     }
     378                        RTPrintf(off ? ", %03xh" : " %03xh", State.Cpu.abInstr[off]);
    383379                    RTPrintf(" ; ");
    384380                }
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