VirtualBox

Changeset 72251 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
May 17, 2018 5:39:01 PM (7 years ago)
Author:
vboxsync
Message:

IEMAll: Must roll back memory changes after failed instruction fetch and exception injection too. The latter may fail non-fatally in ring-0 and raw-mode.

File:
1 edited

Legend:

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

    r72209 r72251  
    91329132    while (iMemMap-- > 0)
    91339133    {
    9134         uint32_t fAccess = pVCpu->iem.s.aMemMappings[iMemMap].fAccess;
     9134        uint32_t const fAccess = pVCpu->iem.s.aMemMappings[iMemMap].fAccess;
    91359135        if (fAccess != IEM_ACCESS_INVALID)
    91369136        {
     
    91399139            if (!(fAccess & IEM_ACCESS_BOUNCE_BUFFERED))
    91409140                PGMPhysReleasePageMappingLock(pVCpu->CTX_SUFF(pVM), &pVCpu->iem.s.aMemMappingLocks[iMemMap].Lock);
    9141             Assert(pVCpu->iem.s.cActiveMappings > 0);
     9141            AssertMsg(pVCpu->iem.s.cActiveMappings > 0,
     9142                      ("iMemMap=%u fAccess=%#x pv=%p GCPhysFirst=%RGp GCPhysSecond=%RGp\n",
     9143                       iMemMap, fAccess, pVCpu->iem.s.aMemMappings[iMemMap].pv,
     9144                       pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysFirst, pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysSecond));
    91429145            pVCpu->iem.s.cActiveMappings--;
    91439146        }
     
    1495514958DECLINLINE(VBOXSTRICTRC) iemExecOneInner(PVMCPU pVCpu, bool fExecuteInhibit)
    1495614959{
     14960    AssertMsg(pVCpu->iem.s.aMemMappings[0].fAccess == IEM_ACCESS_INVALID, ("0: %#x %RGp\n", pVCpu->iem.s.aMemMappings[0].fAccess, pVCpu->iem.s.aMemBbMappings[0].GCPhysFirst));
     14961    AssertMsg(pVCpu->iem.s.aMemMappings[1].fAccess == IEM_ACCESS_INVALID, ("1: %#x %RGp\n", pVCpu->iem.s.aMemMappings[1].fAccess, pVCpu->iem.s.aMemBbMappings[1].GCPhysFirst));
     14962    AssertMsg(pVCpu->iem.s.aMemMappings[2].fAccess == IEM_ACCESS_INVALID, ("2: %#x %RGp\n", pVCpu->iem.s.aMemMappings[2].fAccess, pVCpu->iem.s.aMemBbMappings[2].GCPhysFirst));
     14963
    1495714964#ifdef IEM_WITH_SETJMP
    1495814965    VBOXSTRICTRC rcStrict;
     
    1497914986        iemMemRollback(pVCpu);
    1498014987    }
     14988    AssertMsg(pVCpu->iem.s.aMemMappings[0].fAccess == IEM_ACCESS_INVALID, ("0: %#x %RGp\n", pVCpu->iem.s.aMemMappings[0].fAccess, pVCpu->iem.s.aMemBbMappings[0].GCPhysFirst));
     14989    AssertMsg(pVCpu->iem.s.aMemMappings[1].fAccess == IEM_ACCESS_INVALID, ("1: %#x %RGp\n", pVCpu->iem.s.aMemMappings[1].fAccess, pVCpu->iem.s.aMemBbMappings[1].GCPhysFirst));
     14990    AssertMsg(pVCpu->iem.s.aMemMappings[2].fAccess == IEM_ACCESS_INVALID, ("2: %#x %RGp\n", pVCpu->iem.s.aMemMappings[2].fAccess, pVCpu->iem.s.aMemBbMappings[2].GCPhysFirst));
     14991
    1498114992//#ifdef DEBUG
    1498214993//    AssertMsg(IEM_GET_INSTR_LEN(pVCpu) == cbInstr || rcStrict != VINF_SUCCESS, ("%u %u\n", IEM_GET_INSTR_LEN(pVCpu), cbInstr));
     
    1501715028                iemMemRollback(pVCpu);
    1501815029            }
     15030            AssertMsg(pVCpu->iem.s.aMemMappings[0].fAccess == IEM_ACCESS_INVALID, ("0: %#x %RGp\n", pVCpu->iem.s.aMemMappings[0].fAccess, pVCpu->iem.s.aMemBbMappings[0].GCPhysFirst));
     15031            AssertMsg(pVCpu->iem.s.aMemMappings[1].fAccess == IEM_ACCESS_INVALID, ("1: %#x %RGp\n", pVCpu->iem.s.aMemMappings[1].fAccess, pVCpu->iem.s.aMemBbMappings[1].GCPhysFirst));
     15032            AssertMsg(pVCpu->iem.s.aMemMappings[2].fAccess == IEM_ACCESS_INVALID, ("2: %#x %RGp\n", pVCpu->iem.s.aMemMappings[2].fAccess, pVCpu->iem.s.aMemBbMappings[2].GCPhysFirst));
    1501915033        }
     15034        else if (pVCpu->iem.s.cActiveMappings > 0)
     15035            iemMemRollback(pVCpu);
    1502015036        EMSetInhibitInterruptsPC(pVCpu, UINT64_C(0x7777555533331111));
    1502115037    }
     
    1509015106    if (rcStrict == VINF_SUCCESS)
    1509115107        rcStrict = iemExecOneInner(pVCpu, true);
     15108    else if (pVCpu->iem.s.cActiveMappings > 0)
     15109        iemMemRollback(pVCpu);
    1509215110
    1509315111#if defined(IEM_VERIFICATION_MODE_FULL) && defined(IN_RING3)
     
    1512215140            *pcbWritten = pVCpu->iem.s.cbWritten - cbOldWritten;
    1512315141    }
     15142    else if (pVCpu->iem.s.cActiveMappings > 0)
     15143        iemMemRollback(pVCpu);
    1512415144
    1512515145#ifdef IN_RC
     
    1515615176        rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, false);
    1515715177    if (rcStrict == VINF_SUCCESS)
    15158     {
    1515915178        rcStrict = iemExecOneInner(pVCpu, true);
    15160     }
     15179    else if (pVCpu->iem.s.cActiveMappings > 0)
     15180        iemMemRollback(pVCpu);
    1516115181
    1516215182#ifdef IN_RC
     
    1518015200            *pcbWritten = pVCpu->iem.s.cbWritten - cbOldWritten;
    1518115201    }
     15202    else if (pVCpu->iem.s.cActiveMappings > 0)
     15203        iemMemRollback(pVCpu);
    1518215204
    1518315205#ifdef IN_RC
     
    1521515237    if (rcStrict == VINF_SUCCESS)
    1521615238        rcStrict = iemExecOneInner(pVCpu, false);
     15239    else if (pVCpu->iem.s.cActiveMappings > 0)
     15240        iemMemRollback(pVCpu);
    1521715241
    1521815242#ifdef IN_RC
     
    1526915293            *pcbWritten = pVCpu->iem.s.cbWritten - cbOldWritten;
    1527015294    }
     15295    else if (pVCpu->iem.s.cActiveMappings > 0)
     15296        iemMemRollback(pVCpu);
    1527115297
    1527215298#ifdef IN_RC
     
    1533015356    if (rcStrict == VINF_SUCCESS)
    1533115357        rcStrict = iemExecOneInner(pVCpu, true);
     15358    else if (pVCpu->iem.s.cActiveMappings > 0)
     15359        iemMemRollback(pVCpu);
    1533215360
    1533315361    /*
     
    1547915507# endif
    1548015508    }
     15509    else
     15510    {
     15511        if (pVCpu->iem.s.cActiveMappings > 0)
     15512            iemMemRollback(pVCpu);
     15513
    1548115514# ifdef VBOX_WITH_NESTED_HWVIRT_SVM
    15482     else
    15483     {
    1548415515        /*
    1548515516         * When a nested-guest causes an exception intercept (e.g. #PF) when fetching
     
    1548715518         */
    1548815519        rcStrict = iemExecStatusCodeFiddling(pVCpu, rcStrict);
    15489     }
    1549015520# endif
     15521    }
    1549115522
    1549215523    /*
     
    1557115602    }
    1557215603
    15573     return iemRaiseXcptOrInt(pVCpu, cbInstr, u8TrapNo, fFlags, uErrCode, uCr2);
     15604    VBOXSTRICTRC rcStrict = iemRaiseXcptOrInt(pVCpu, cbInstr, u8TrapNo, fFlags, uErrCode, uCr2);
     15605
     15606    if (pVCpu->iem.s.cActiveMappings > 0)
     15607        iemMemRollback(pVCpu);
     15608    return rcStrict;
    1557415609}
    1557515610
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