VirtualBox

Changeset 80549 in vbox


Ignore:
Timestamp:
Sep 2, 2019 12:05:44 PM (5 years ago)
Author:
vboxsync
Message:

VMM/TMAll: Deal with the serial device timer critsects. bugref:9218

File:
1 edited

Legend:

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

    r80531 r80549  
    6262#  define TMTIMER_GET_CRITSECT(pTimer) ((pTimer)->pCritSect)
    6363# else
    64 #  define TMTIMER_GET_CRITSECT(pTimer) \
    65     (     (pTimer)->enmType == TMTIMERTYPE_DEV \
    66        && (pTimer)->pCritSect == ((struct PDMDEVINSR3 *)(pTimer)->u.Dev.pDevIns)->pCritSectRoR3 \
    67      ? ((struct PDMDEVINSR3 *)(pTimer)->u.Dev.pDevIns)->pDevInsR0RemoveMe->pCritSectRoR0 \
    68      : (PPDMCRITSECT)MMHyperR3ToCC((pTimer)->CTX_SUFF(pVM), (pTimer)->pCritSect) )
     64#  define TMTIMER_GET_CRITSECT(pTimer) tmRZTimerGetCritSect(pTimer)
    6965# endif
    7066#endif
     
    127123#endif
    128124
     125#if defined(VBOX_STRICT) && defined(IN_RING0)
     126/**
     127 * Helper for  TMTIMER_GET_CRITSECT
     128 * @todo This needs a redo!
     129 */
     130DECLINLINE(PPDMCRITSECT) tmRZTimerGetCritSect(PTMTIMER pTimer)
     131{
     132    if (pTimer->enmType == TMTIMERTYPE_DEV)
     133    {
     134        PPDMDEVINSR0        pDevInsR0 = ((struct PDMDEVINSR3 *)pTimer->u.Dev.pDevIns)->pDevInsR0RemoveMe; /* !ring-3 read! */
     135        struct PDMDEVINSR3 *pDevInsR3 = pDevInsR0->pDevInsForR3R0;
     136        if (pTimer->pCritSect == pDevInsR3->pCritSectRoR3)
     137            return pDevInsR0->pCritSectRoR0;
     138        uintptr_t offCritSect = (uintptr_t)pTimer->pCritSect - (uintptr_t)pDevInsR3->pvInstanceDataR3;
     139        if (offCritSect < pDevInsR0->pReg->cbInstanceShared)
     140            return (PPDMCRITSECT)((uintptr_t)pDevInsR0->pvInstanceDataR0 + offCritSect);
     141    }
     142    return (PPDMCRITSECT)MMHyperR3ToCC((pTimer)->CTX_SUFF(pVM), pTimer->pCritSect);
     143}
     144
     145#endif /* VBOX_STRICT*/
    129146
    130147/**
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