VirtualBox

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


Ignore:
Timestamp:
Jun 21, 2009 8:23:22 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
48863
Message:

REM: Don't drop handler reply records. More handler replay paranoia and massaging.

Location:
trunk/src/VBox/VMM
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/REMInternal.h

    r20746 r20747  
    110110    uint32_t                    idxSelf;
    111111    uint32_t volatile           idxNext;
    112 } REMHANDLERNOTIFICATION, *PREMHANDLERNOTIFICATION;
     112} REMHANDLERNOTIFICATION;
     113/** Pointer to a handler notification record. */
     114typedef REMHANDLERNOTIFICATION *PREMHANDLERNOTIFICATION;
    113115
    114116/**
  • trunk/src/VBox/VMM/VMMAll/REMAll.cpp

    r20746 r20747  
    9393static void remNotifyHandlerInsert(PVM pVM, PREMHANDLERNOTIFICATION pRec)
    9494{
    95     uint32_t idxFree;
    96     uint32_t idxNext;
     95    /*
     96     * Fetch a free record.
     97     */
     98    uint32_t                cFlushes = 0;
     99    uint32_t                idxFree;
    97100    PREMHANDLERNOTIFICATION pFree;
    98 
    99     /* Fetch a free record. */
    100101    do
    101102    {
     
    103104        if (idxFree == (uint32_t)-1)
    104105        {
    105             pFree = NULL;
    106             break;
     106            do
     107            {
     108                Assert(cFlushes++ != 128);
     109                AssertFatal(cFlushes < _1M);
     110                remFlushHandlerNotifications(pVM);
     111                idxFree = ASMAtomicUoReadU32(&pVM->rem.s.idxFreeList);
     112            } while (idxFree == (uint32_t)-1);
    107113        }
    108114        pFree = &pVM->rem.s.aHandlerNotifications[idxFree];
    109115    } while (!ASMAtomicCmpXchgU32(&pVM->rem.s.idxFreeList, pFree->idxNext, idxFree));
    110116
    111     if (!pFree)
    112     {
    113         remFlushHandlerNotifications(pVM);
    114         /** @todo why are we dropping the pReq here without a fight? If we can drop
    115          *        one, we can drop all... */
    116         return;
    117     }
    118 
    119     /* Copy the record. */
    120     *pFree = *pRec;
    121     pFree->idxSelf = idxFree; /* was trashed */
    122 
    123     /* Insert it into the pending list. */
     117    /*
     118     * Copy the record.
     119     */
     120    pFree->enmKind = pRec->enmKind;
     121    pFree->u = pRec->u;
     122
     123    /*
     124     * Insert it into the pending list.
     125     */
     126    uint32_t idxNext;
    124127    do
    125128    {
  • trunk/src/VBox/VMM/testcase/tstVMStructGC.cpp

    r20689 r20747  
    739739    GEN_CHECK_OFF(REM, Env);
    740740
     741    GEN_CHECK_SIZE(REMHANDLERNOTIFICATION);
     742    GEN_CHECK_OFF(REMHANDLERNOTIFICATION, enmKind);
     743    GEN_CHECK_OFF(REMHANDLERNOTIFICATION, u);
     744    GEN_CHECK_OFF(REMHANDLERNOTIFICATION, u.PhysicalRegister.GCPhys);
     745    GEN_CHECK_OFF(REMHANDLERNOTIFICATION, u.PhysicalRegister.cb);
     746    GEN_CHECK_OFF(REMHANDLERNOTIFICATION, u.PhysicalRegister.enmType);
     747    GEN_CHECK_OFF(REMHANDLERNOTIFICATION, u.PhysicalRegister.fHasHCHandler);
     748    GEN_CHECK_OFF(REMHANDLERNOTIFICATION, u.PhysicalDeregister.GCPhys);
     749    GEN_CHECK_OFF(REMHANDLERNOTIFICATION, u.PhysicalDeregister.cb);
     750    GEN_CHECK_OFF(REMHANDLERNOTIFICATION, u.PhysicalDeregister.enmType);
     751    GEN_CHECK_OFF(REMHANDLERNOTIFICATION, u.PhysicalDeregister.fHasHCHandler);
     752    GEN_CHECK_OFF(REMHANDLERNOTIFICATION, u.PhysicalDeregister.fRestoreAsRAM);
     753    GEN_CHECK_OFF(REMHANDLERNOTIFICATION, u.PhysicalModify.GCPhysOld);
     754    GEN_CHECK_OFF(REMHANDLERNOTIFICATION, u.PhysicalModify.GCPhysNew);
     755    GEN_CHECK_OFF(REMHANDLERNOTIFICATION, u.PhysicalModify.cb);
     756    GEN_CHECK_OFF(REMHANDLERNOTIFICATION, u.PhysicalModify.enmType);
     757    GEN_CHECK_OFF(REMHANDLERNOTIFICATION, u.PhysicalModify.fHasHCHandler);
     758    GEN_CHECK_OFF(REMHANDLERNOTIFICATION, u.PhysicalModify.fRestoreAsRAM);
     759    GEN_CHECK_OFF(REMHANDLERNOTIFICATION, idxSelf);
     760    GEN_CHECK_OFF(REMHANDLERNOTIFICATION, idxNext);
     761
    741762    GEN_CHECK_SIZE(SELM);
    742763    GEN_CHECK_OFF(SELM, offVM);
  • trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp

    r20530 r20747  
    278278    CHECK_MEMBER_ALIGNMENT(PGMMMIO2RANGE, RamRange, 16);
    279279
    280     /* misc */
     280    /* rem */
    281281    CHECK_MEMBER_ALIGNMENT(REM, aGCPtrInvalidatedPages, 8);
    282     CHECK_PADDING3(EMCPU, u.FatalLongJump, u.achPaddingFatalLongJump);
    283282    CHECK_PADDING3(REMHANDLERNOTIFICATION, u.PhysicalRegister, u.padding);
    284283    CHECK_PADDING3(REMHANDLERNOTIFICATION, u.PhysicalDeregister, u.padding);
    285284    CHECK_PADDING3(REMHANDLERNOTIFICATION, u.PhysicalModify, u.padding);
     285    CHECK_SIZE_ALIGNMENT(REMHANDLERNOTIFICATION, 8);
     286    CHECK_MEMBER_ALIGNMENT(REMHANDLERNOTIFICATION, u.PhysicalDeregister.GCPhys, 8);
     287
     288    /* misc */
     289    CHECK_PADDING3(EMCPU, u.FatalLongJump, u.achPaddingFatalLongJump);
    286290    CHECK_SIZE_ALIGNMENT(VMMR0JMPBUF, 8);
    287291    CHECK_SIZE_ALIGNMENT(PATCHINFO, 8);
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette