VirtualBox

Changeset 20092 in vbox


Ignore:
Timestamp:
May 27, 2009 3:19:32 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
47839
Message:

DevAPIC,PDM: timer critsect.

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/pdmdev.h

    r20087 r20092  
    12721272
    12731273    /**
    1274      * Acquires the PDM lock.
    1275      *
    1276      * @returns VINF_SUCCESS on success.
    1277      * @returns Fatal error on failure.
    1278      * @param   pDevIns         The APIC device instance.
    1279      * @param   rc              Dummy for making the interface identical to the GC and R0 versions.
    1280      */
    1281     DECLR3CALLBACKMEMBER(int,   pfnLock,(PPDMDEVINS pDevIns, int rc));
    1282 
    1283     /**
    1284      * Releases the PDM lock.
    1285      *
    1286      * @param   pDevIns         The APIC device instance.
    1287      */
    1288     DECLR3CALLBACKMEMBER(void,  pfnUnlock,(PPDMDEVINS pDevIns));
    1289 
    1290     /**
    12911274     * Get the virtual CPU id corresponding to the current EMT.
    12921275     *
     
    13341317     */
    13351318    DECLR3CALLBACKMEMBER(PCPDMAPICHLPR0, pfnGetR0Helpers,(PPDMDEVINS pDevIns));
     1319
     1320    /**
     1321     * Get the critical section used to synchronize the PICs, PCI and stuff.
     1322     *
     1323     * @returns Ring-3 pointer to the critical section.
     1324     * @param   pDevIns         The APIC device instance.
     1325     */
     1326    DECLR3CALLBACKMEMBER(R3PTRTYPE(PPDMCRITSECT), pfnGetR3CritSect,(PPDMDEVINS pDevIns));
     1327
     1328    /**
     1329     * Get the critical section used to synchronize the PICs, PCI and stuff.
     1330     *
     1331     * @returns Raw-mode context pointer to the critical section.
     1332     * @param   pDevIns         The APIC device instance.
     1333     */
     1334    DECLR3CALLBACKMEMBER(RCPTRTYPE(PPDMCRITSECT), pfnGetRCCritSect,(PPDMDEVINS pDevIns));
     1335
     1336    /**
     1337     * Get the critical section used to synchronize the PICs, PCI and stuff.
     1338     *
     1339     * @returns Ring-0 pointer to the critical section.
     1340     * @param   pDevIns         The APIC device instance.
     1341     */
     1342    DECLR3CALLBACKMEMBER(R0PTRTYPE(PPDMCRITSECT), pfnGetR0CritSect,(PPDMDEVINS pDevIns));
    13361343
    13371344    /** Just a safety precaution. */
     
    13441351
    13451352/** Current PDMAPICHLP version number. */
    1346 #define PDM_APICHLPR3_VERSION  0xfd010000
     1353#define PDM_APICHLPR3_VERSION  0xfd020000
    13471354
    13481355
  • trunk/src/VBox/Devices/PC/DevAPIC.cpp

    r20087 r20092  
    5959/** @def APIC_LOCK
    6060 * Acquires the PDM lock. */
    61 #define APIC_LOCK(pThis, rc) \
     61#define APIC_LOCK(pThis, rcBusy) \
    6262    do { \
    63         int rc2 = (pThis)->CTX_SUFF(pApicHlp)->pfnLock((pThis)->CTX_SUFF(pDevIns), rc); \
     63        int rc2 = PDMCritSectEnter((pThis)->CTX_SUFF(pCritSect), (rcBusy)); \
    6464        if (rc2 != VINF_SUCCESS) \
    6565            return rc2; \
     
    6868/** @def APIC_LOCK_VOID
    6969 * Acquires the PDM lock and does not expect failure (i.e. ring-3 only!). */
    70 #define APIC_LOCK_VOID(pThis, rc) \
     70#define APIC_LOCK_VOID(pThis, rcBusy) \
    7171    do { \
    72         int rc2 = (pThis)->CTX_SUFF(pApicHlp)->pfnLock((pThis)->CTX_SUFF(pDevIns), rc); \
     72        int rc2 = PDMCritSectEnter((pThis)->CTX_SUFF(pCritSect), (rcBusy)); \
    7373        AssertLogRelRCReturnVoid(rc2); \
    7474    } while (0)
     
    7777 * Releases the PDM lock. */
    7878#define APIC_UNLOCK(pThis) \
    79     (pThis)->CTX_SUFF(pApicHlp)->pfnUnlock((pThis)->CTX_SUFF(pDevIns))
     79    PDMCritSectLeave((pThis)->CTX_SUFF(pCritSect))
    8080
    8181/** @def IOAPIC_LOCK
     
    281281{
    282282    /** The device instance - R3 Ptr. */
    283     PPDMDEVINSR3    pDevInsR3;
     283    PPDMDEVINSR3            pDevInsR3;
    284284    /** The APIC helpers - R3 Ptr. */
    285     PCPDMAPICHLPR3  pApicHlpR3;
     285    PCPDMAPICHLPR3          pApicHlpR3;
    286286    /** LAPICs states - R3 Ptr */
    287     RTR3PTR         pLapicsR3;
     287    RTR3PTR                 pLapicsR3;
     288    /** The critical section - R3 Ptr. */
     289    R3PTRTYPE(PPDMCRITSECT) pCritSectR3;
    288290
    289291    /** The device instance - R0 Ptr. */
    290     PPDMDEVINSR0    pDevInsR0;
     292    PPDMDEVINSR0            pDevInsR0;
    291293    /** The APIC helpers - R0 Ptr. */
    292     PCPDMAPICHLPR0  pApicHlpR0;
     294    PCPDMAPICHLPR0          pApicHlpR0;
    293295    /** LAPICs states - R0 Ptr */
    294     RTR0PTR         pLapicsR0;
     296    RTR0PTR                 pLapicsR0;
     297    /** The critical section - R3 Ptr. */
     298    R0PTRTYPE(PPDMCRITSECT) pCritSectR0;
    295299
    296300    /** The device instance - RC Ptr. */
    297     PPDMDEVINSRC    pDevInsRC;
     301    PPDMDEVINSRC            pDevInsRC;
    298302    /** The APIC helpers - RC Ptr. */
    299     PCPDMAPICHLPRC  pApicHlpRC;
     303    PCPDMAPICHLPRC          pApicHlpRC;
    300304    /** LAPICs states - RC Ptr */
    301     RTRCPTR         pLapicsRC;
     305    RTRCPTR                 pLapicsRC;
     306    /** The critical section - R3 Ptr. */
     307    RCPTRTYPE(PPDMCRITSECT) pCritSectRC;
     308    RTRCPTR                 Padding0;
    302309
    303310    /** APIC specification version in this virtual hardware configuration. */
    304     PDMAPICVERSION  enmVersion;
     311    PDMAPICVERSION          enmVersion;
    305312
    306313    /** Number of attempts made to optimize TPR accesses. */
    307     uint32_t        ulTPRPatchAttempts;
     314    uint32_t                cTPRPatchAttempts;
    308315
    309316    /** Number of CPUs on the system (same as LAPIC count). */
    310     uint32_t        cCpus;
     317    uint32_t                cCpus;
    311318
    312319# ifdef VBOX_WITH_STATISTICS
     
    13061313    APICState *s = (APICState *)pvUser;
    13071314    Assert(s->pTimerR3 == pTimer);
    1308 
    1309     APIC_LOCK_VOID(dev, VERR_INTERNAL_ERROR);
    13101315# endif /* VBOX */
    13111316
     
    13151320    }
    13161321    apic_timer_update(dev, s, s->next_time);
    1317 
    1318 # ifdef VBOX
    1319     APIC_UNLOCK(dev);
    1320 # endif
    13211322}
    13221323#endif /* IN_RING3 */
     
    20572058
    20582059            if (    index == 0x08 /* TPR */
    2059                 &&  ++s->ulTPRPatchAttempts < APIC_MAX_PATCH_ATTEMPTS)
     2060                &&  ++s->cTPRPatchAttempts < APIC_MAX_PATCH_ATTEMPTS)
    20602061            {
    20612062#ifdef IN_RC
     
    21782179static DECLCALLBACK(void) apicRelocate(PPDMDEVINS pDevIns, RTGCINTPTR offDelta)
    21792180{
    2180     APICDeviceInfo *dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
    2181     dev->pDevInsRC  = PDMDEVINS_2_RCPTR(pDevIns);
    2182     dev->pApicHlpRC = dev->pApicHlpR3->pfnGetRCHelpers(pDevIns);
    2183     dev->pLapicsRC  = MMHyperR3ToRC(PDMDevHlpGetVM(pDevIns), dev->pLapicsR3);
    2184     foreach_apic(dev, 0xffffffff,
     2181    APICDeviceInfo *pThis = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
     2182    pThis->pDevInsRC   = PDMDEVINS_2_RCPTR(pDevIns);
     2183    pThis->pApicHlpRC  = pThis->pApicHlpR3->pfnGetRCHelpers(pDevIns);
     2184    pThis->pLapicsRC   = MMHyperR3ToRC(PDMDevHlpGetVM(pDevIns), pThis->pLapicsR3);
     2185    pThis->pCritSectRC = pThis->pApicHlpR3->pfnGetRCCritSect(pDevIns);
     2186    foreach_apic(pThis, 0xffffffff,
    21852187                 apic->pTimerRC = TMTimerRCPtr(apic->CTX_SUFF(pTimer)));
    21862188}
     
    23462348        return rc;
    23472349    }
     2350    pThis->pCritSectR3 = pThis->pApicHlpR3->pfnGetR3CritSect(pDevIns);
    23482351
    23492352    /*
     
    23762379
    23772380    if (fGCEnabled) {
    2378         pThis->pApicHlpRC = pThis->pApicHlpR3->pfnGetRCHelpers(pDevIns);
     2381        pThis->pApicHlpRC  = pThis->pApicHlpR3->pfnGetRCHelpers(pDevIns);
     2382        pThis->pCritSectRC = pThis->pApicHlpR3->pfnGetRCCritSect(pDevIns);
    23792383
    23802384        rc = PDMDevHlpMMIORegisterGC(pDevIns, LAPIC_BASE(pThis)->apicbase & ~0xfff, 0x1000, 0,
     
    23852389
    23862390    if (fR0Enabled) {
    2387         pThis->pApicHlpR0 = pThis->pApicHlpR3->pfnGetR0Helpers(pDevIns);
     2391        pThis->pApicHlpR0  = pThis->pApicHlpR3->pfnGetR0Helpers(pDevIns);
     2392        pThis->pCritSectR0 = pThis->pApicHlpR3->pfnGetR0CritSect(pDevIns);
    23882393
    23892394        rc = PDMDevHlpMMIORegisterR0(pDevIns, LAPIC_BASE(pThis)->apicbase & ~0xfff, 0x1000, 0,
     
    24042409        apic->pTimerR0 = TMTimerR0Ptr(apic->pTimerR3);
    24052410        apic->pTimerRC = TMTimerRCPtr(apic->pTimerR3);
    2406         /// @todo TMTimerSetCritSect(apic->pTimerR3, pThis->pApicHlpR3->pfnGetCritSect(..));
     2411        TMR3TimerSetCritSect(apic->pTimerR3, pThis->pCritSectR3);
    24072412        apic++;
    24082413    }
  • trunk/src/VBox/Devices/testcase/tstDeviceStructSizeGC.cpp

    r18348 r20092  
    594594    GEN_CHECK_OFF(APICDeviceInfo, pDevInsR3);
    595595    GEN_CHECK_OFF(APICDeviceInfo, pApicHlpR3);
     596    GEN_CHECK_OFF(APICDeviceInfo, pLapicsR3);
     597    GEN_CHECK_OFF(APICDeviceInfo, pCritSectR3);
    596598    GEN_CHECK_OFF(APICDeviceInfo, pDevInsR0);
    597599    GEN_CHECK_OFF(APICDeviceInfo, pApicHlpR0);
     600    GEN_CHECK_OFF(APICDeviceInfo, pLapicsR0);
     601    GEN_CHECK_OFF(APICDeviceInfo, pCritSectR0);
    598602    GEN_CHECK_OFF(APICDeviceInfo, pDevInsRC);
    599603    GEN_CHECK_OFF(APICDeviceInfo, pApicHlpRC);
    600     GEN_CHECK_OFF(APICDeviceInfo, ulTPRPatchAttempts);
     604    GEN_CHECK_OFF(APICDeviceInfo, pLapicsRC);
     605    GEN_CHECK_OFF(APICDeviceInfo, pCritSectRC);
     606    GEN_CHECK_OFF(APICDeviceInfo, enmVersion);
     607    GEN_CHECK_OFF(APICDeviceInfo, cTPRPatchAttempts);
     608    GEN_CHECK_OFF(APICDeviceInfo, cCpus);
    601609#ifdef VBOX_WITH_STATISTICS
    602610    GEN_CHECK_OFF(APICDeviceInfo, StatMMIOReadGC);
  • trunk/src/VBox/VMM/PDMDevMiscHlp.cpp

    r19475 r20092  
    204204}
    205205
    206 /** @copydoc PDMAPICHLPR3::pfnLock */
    207 static DECLCALLBACK(int) pdmR3ApicHlp_Lock(PPDMDEVINS pDevIns, int rc)
    208 {
    209     PDMDEV_ASSERT_DEVINS(pDevIns);
    210     LogFlow(("pdmR3ApicHlp_Lock: caller='%s'/%d: rc=%Rrc\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, rc));
    211     return pdmLockEx(pDevIns->Internal.s.pVMR3, rc);
    212 }
    213 
    214 
    215 /** @copydoc PDMAPICHLPR3::pfnUnlock */
    216 static DECLCALLBACK(void) pdmR3ApicHlp_Unlock(PPDMDEVINS pDevIns)
    217 {
    218     PDMDEV_ASSERT_DEVINS(pDevIns);
    219     LogFlow(("pdmR3ApicHlp_Unlock: caller='%s'/%d:\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance));
    220     pdmUnlock(pDevIns->Internal.s.pVMR3);
    221 }
    222 
    223206/** @copydoc PDMAPICHLPR3::pfnGetCpuId */
    224207static DECLCALLBACK(VMCPUID) pdmR3ApicHlp_GetCpuId(PPDMDEVINS pDevIns)
     
    276259
    277260
     261/** @copydoc PDMAPICHLPR3::pfnGetR3CritSect */
     262static DECLCALLBACK(R3PTRTYPE(PPDMCRITSECT)) pdmR3ApicHlp_GetR3CritSect(PPDMDEVINS pDevIns)
     263{
     264    PDMDEV_ASSERT_DEVINS(pDevIns);
     265    LogFlow(("pdmR3ApicHlp_Lock: caller='%s'/%d\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance));
     266    return &pDevIns->Internal.s.pVMR3->pdm.s.CritSect;
     267}
     268
     269
     270/** @copydoc PDMAPICHLPR3::pfnGetRCCritSect */
     271static DECLCALLBACK(RCPTRTYPE(PPDMCRITSECT)) pdmR3ApicHlp_GetRCCritSect(PPDMDEVINS pDevIns)
     272{
     273    PDMDEV_ASSERT_DEVINS(pDevIns);
     274    PVM pVM = pDevIns->Internal.s.pVMR3;
     275    RTRCPTR RCPtr = MMHyperCCToRC(pVM, &pVM->pdm.s.CritSect);
     276    LogFlow(("pdmR3ApicHlp_GetR0CritSect: caller='%s'/%d: return %RRv\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, RCPtr));
     277    return RCPtr;
     278}
     279
     280
     281/** @copydoc PDMAPICHLPR3::pfnGetR3CritSect */
     282static DECLCALLBACK(R0PTRTYPE(PPDMCRITSECT)) pdmR3ApicHlp_GetR0CritSect(PPDMDEVINS pDevIns)
     283{
     284    PDMDEV_ASSERT_DEVINS(pDevIns);
     285    PVM pVM = pDevIns->Internal.s.pVMR3;
     286    RTR0PTR R0Ptr = MMHyperCCToR0(pVM, &pVM->pdm.s.CritSect);
     287    LogFlow(("pdmR3ApicHlp_GetR0CritSect: caller='%s'/%d: return %RHv\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, R0Ptr));
     288    return R0Ptr;
     289}
     290
     291
     292
    278293/**
    279294 * APIC Device Helpers.
     
    285300    pdmR3ApicHlp_ClearInterruptFF,
    286301    pdmR3ApicHlp_ChangeFeature,
    287     pdmR3ApicHlp_Lock,
    288     pdmR3ApicHlp_Unlock,
    289302    pdmR3ApicHlp_GetCpuId,
    290303    pdmR3ApicHlp_SendSipi,
     
    292305    pdmR3ApicHlp_GetRCHelpers,
    293306    pdmR3ApicHlp_GetR0Helpers,
     307    pdmR3ApicHlp_GetR3CritSect,
     308    pdmR3ApicHlp_GetRCCritSect,
     309    pdmR3ApicHlp_GetR0CritSect,
    294310    PDM_APICHLPR3_VERSION /* the end */
    295311};
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