VirtualBox

Changeset 11492 in vbox for trunk


Ignore:
Timestamp:
Aug 19, 2008 3:44:24 PM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
34992
Message:

Fixed the non-rep stoswd case (rdi must be updated).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/EMAll.cpp

    r11488 r11492  
    13131313    uint32_t cbSize;
    13141314    uint64_t cTransfers;
     1315    int      offIncrement;
    13151316
    13161317    /* Don't support any but these three prefix bytes. */
     
    13541355    }
    13551356
    1356     LogFlow(("emInterpretStosWD dest=%VGv cbSize=%d\n", GCDest, cbSize));
     1357    offIncrement = pRegFrame->eflags.Bits.u1DF ? -(signed)cbSize : (signed)cbSize;
    13571358
    13581359    if (!(pCpu->prefix & PREFIX_REP))
    13591360    {
     1361        LogFlow(("emInterpretStosWD dest=%04X:%VGv (%VGv) cbSize=%d\n", pRegFrame->es, GCOffset, GCDest, cbSize));
     1362
    13601363        rc = PGMPhysWriteGCPtrSafe(pVM, GCDest, &pRegFrame->rax, cbSize);
    13611364        if (VBOX_FAILURE(rc))
    13621365            return VERR_EM_INTERPRETER;
    13631366        Assert(rc == VINF_SUCCESS);
     1367
     1368        /* Update (e/r)di. */
     1369        switch (pCpu->addrmode)
     1370        {
     1371        case CPUMODE_16BIT:
     1372            pRegFrame->di  += offIncrement;
     1373            break;
     1374        case CPUMODE_32BIT:
     1375            pRegFrame->edi += offIncrement;
     1376            break;
     1377        case CPUMODE_64BIT:
     1378            pRegFrame->rdi += offIncrement;
     1379            break;
     1380        }
     1381
    13641382    }
    13651383    else
    13661384    {   
    1367         int offIncrement = pRegFrame->eflags.Bits.u1DF ? -(signed)cbSize : (signed)cbSize;
    1368 
    13691385        if (!cTransfers)
    13701386            return VINF_SUCCESS;
     1387
     1388        LogFlow(("emInterpretStosWD dest=%04X:%VGv (%VGv) cbSize=%d cTransfers=%x DF=%d\n", pRegFrame->es, GCOffset, GCDest, cbSize, cTransfers, pRegFrame->eflags.Bits.u1DF));
    13711389
    13721390        /* Access verification first; we currently can't recover properly from traps inside this instruction */
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