Changeset 20092 in vbox
- Timestamp:
- May 27, 2009 3:19:32 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 47839
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/pdmdev.h
r20087 r20092 1272 1272 1273 1273 /** 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 /**1291 1274 * Get the virtual CPU id corresponding to the current EMT. 1292 1275 * … … 1334 1317 */ 1335 1318 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)); 1336 1343 1337 1344 /** Just a safety precaution. */ … … 1344 1351 1345 1352 /** Current PDMAPICHLP version number. */ 1346 #define PDM_APICHLPR3_VERSION 0xfd0 100001353 #define PDM_APICHLPR3_VERSION 0xfd020000 1347 1354 1348 1355 -
trunk/src/VBox/Devices/PC/DevAPIC.cpp
r20087 r20092 59 59 /** @def APIC_LOCK 60 60 * Acquires the PDM lock. */ 61 #define APIC_LOCK(pThis, rc ) \61 #define APIC_LOCK(pThis, rcBusy) \ 62 62 do { \ 63 int rc2 = (pThis)->CTX_SUFF(pApicHlp)->pfnLock((pThis)->CTX_SUFF(pDevIns), rc); \63 int rc2 = PDMCritSectEnter((pThis)->CTX_SUFF(pCritSect), (rcBusy)); \ 64 64 if (rc2 != VINF_SUCCESS) \ 65 65 return rc2; \ … … 68 68 /** @def APIC_LOCK_VOID 69 69 * 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) \ 71 71 do { \ 72 int rc2 = (pThis)->CTX_SUFF(pApicHlp)->pfnLock((pThis)->CTX_SUFF(pDevIns), rc); \72 int rc2 = PDMCritSectEnter((pThis)->CTX_SUFF(pCritSect), (rcBusy)); \ 73 73 AssertLogRelRCReturnVoid(rc2); \ 74 74 } while (0) … … 77 77 * Releases the PDM lock. */ 78 78 #define APIC_UNLOCK(pThis) \ 79 (pThis)->CTX_SUFF(pApicHlp)->pfnUnlock((pThis)->CTX_SUFF(pDevIns))79 PDMCritSectLeave((pThis)->CTX_SUFF(pCritSect)) 80 80 81 81 /** @def IOAPIC_LOCK … … 281 281 { 282 282 /** The device instance - R3 Ptr. */ 283 PPDMDEVINSR3 pDevInsR3;283 PPDMDEVINSR3 pDevInsR3; 284 284 /** The APIC helpers - R3 Ptr. */ 285 PCPDMAPICHLPR3 pApicHlpR3;285 PCPDMAPICHLPR3 pApicHlpR3; 286 286 /** LAPICs states - R3 Ptr */ 287 RTR3PTR pLapicsR3; 287 RTR3PTR pLapicsR3; 288 /** The critical section - R3 Ptr. */ 289 R3PTRTYPE(PPDMCRITSECT) pCritSectR3; 288 290 289 291 /** The device instance - R0 Ptr. */ 290 PPDMDEVINSR0 pDevInsR0;292 PPDMDEVINSR0 pDevInsR0; 291 293 /** The APIC helpers - R0 Ptr. */ 292 PCPDMAPICHLPR0 pApicHlpR0;294 PCPDMAPICHLPR0 pApicHlpR0; 293 295 /** LAPICs states - R0 Ptr */ 294 RTR0PTR pLapicsR0; 296 RTR0PTR pLapicsR0; 297 /** The critical section - R3 Ptr. */ 298 R0PTRTYPE(PPDMCRITSECT) pCritSectR0; 295 299 296 300 /** The device instance - RC Ptr. */ 297 PPDMDEVINSRC pDevInsRC;301 PPDMDEVINSRC pDevInsRC; 298 302 /** The APIC helpers - RC Ptr. */ 299 PCPDMAPICHLPRC pApicHlpRC;303 PCPDMAPICHLPRC pApicHlpRC; 300 304 /** LAPICs states - RC Ptr */ 301 RTRCPTR pLapicsRC; 305 RTRCPTR pLapicsRC; 306 /** The critical section - R3 Ptr. */ 307 RCPTRTYPE(PPDMCRITSECT) pCritSectRC; 308 RTRCPTR Padding0; 302 309 303 310 /** APIC specification version in this virtual hardware configuration. */ 304 PDMAPICVERSION enmVersion;311 PDMAPICVERSION enmVersion; 305 312 306 313 /** Number of attempts made to optimize TPR accesses. */ 307 uint32_t ulTPRPatchAttempts;314 uint32_t cTPRPatchAttempts; 308 315 309 316 /** Number of CPUs on the system (same as LAPIC count). */ 310 uint32_t cCpus;317 uint32_t cCpus; 311 318 312 319 # ifdef VBOX_WITH_STATISTICS … … 1306 1313 APICState *s = (APICState *)pvUser; 1307 1314 Assert(s->pTimerR3 == pTimer); 1308 1309 APIC_LOCK_VOID(dev, VERR_INTERNAL_ERROR);1310 1315 # endif /* VBOX */ 1311 1316 … … 1315 1320 } 1316 1321 apic_timer_update(dev, s, s->next_time); 1317 1318 # ifdef VBOX1319 APIC_UNLOCK(dev);1320 # endif1321 1322 } 1322 1323 #endif /* IN_RING3 */ … … 2057 2058 2058 2059 if ( index == 0x08 /* TPR */ 2059 && ++s-> ulTPRPatchAttempts < APIC_MAX_PATCH_ATTEMPTS)2060 && ++s->cTPRPatchAttempts < APIC_MAX_PATCH_ATTEMPTS) 2060 2061 { 2061 2062 #ifdef IN_RC … … 2178 2179 static DECLCALLBACK(void) apicRelocate(PPDMDEVINS pDevIns, RTGCINTPTR offDelta) 2179 2180 { 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, 2185 2187 apic->pTimerRC = TMTimerRCPtr(apic->CTX_SUFF(pTimer))); 2186 2188 } … … 2346 2348 return rc; 2347 2349 } 2350 pThis->pCritSectR3 = pThis->pApicHlpR3->pfnGetR3CritSect(pDevIns); 2348 2351 2349 2352 /* … … 2376 2379 2377 2380 if (fGCEnabled) { 2378 pThis->pApicHlpRC = pThis->pApicHlpR3->pfnGetRCHelpers(pDevIns); 2381 pThis->pApicHlpRC = pThis->pApicHlpR3->pfnGetRCHelpers(pDevIns); 2382 pThis->pCritSectRC = pThis->pApicHlpR3->pfnGetRCCritSect(pDevIns); 2379 2383 2380 2384 rc = PDMDevHlpMMIORegisterGC(pDevIns, LAPIC_BASE(pThis)->apicbase & ~0xfff, 0x1000, 0, … … 2385 2389 2386 2390 if (fR0Enabled) { 2387 pThis->pApicHlpR0 = pThis->pApicHlpR3->pfnGetR0Helpers(pDevIns); 2391 pThis->pApicHlpR0 = pThis->pApicHlpR3->pfnGetR0Helpers(pDevIns); 2392 pThis->pCritSectR0 = pThis->pApicHlpR3->pfnGetR0CritSect(pDevIns); 2388 2393 2389 2394 rc = PDMDevHlpMMIORegisterR0(pDevIns, LAPIC_BASE(pThis)->apicbase & ~0xfff, 0x1000, 0, … … 2404 2409 apic->pTimerR0 = TMTimerR0Ptr(apic->pTimerR3); 2405 2410 apic->pTimerRC = TMTimerRCPtr(apic->pTimerR3); 2406 /// @todo TMTimerSetCritSect(apic->pTimerR3, pThis->pApicHlpR3->pfnGetCritSect(..));2411 TMR3TimerSetCritSect(apic->pTimerR3, pThis->pCritSectR3); 2407 2412 apic++; 2408 2413 } -
trunk/src/VBox/Devices/testcase/tstDeviceStructSizeGC.cpp
r18348 r20092 594 594 GEN_CHECK_OFF(APICDeviceInfo, pDevInsR3); 595 595 GEN_CHECK_OFF(APICDeviceInfo, pApicHlpR3); 596 GEN_CHECK_OFF(APICDeviceInfo, pLapicsR3); 597 GEN_CHECK_OFF(APICDeviceInfo, pCritSectR3); 596 598 GEN_CHECK_OFF(APICDeviceInfo, pDevInsR0); 597 599 GEN_CHECK_OFF(APICDeviceInfo, pApicHlpR0); 600 GEN_CHECK_OFF(APICDeviceInfo, pLapicsR0); 601 GEN_CHECK_OFF(APICDeviceInfo, pCritSectR0); 598 602 GEN_CHECK_OFF(APICDeviceInfo, pDevInsRC); 599 603 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); 601 609 #ifdef VBOX_WITH_STATISTICS 602 610 GEN_CHECK_OFF(APICDeviceInfo, StatMMIOReadGC); -
trunk/src/VBox/VMM/PDMDevMiscHlp.cpp
r19475 r20092 204 204 } 205 205 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 223 206 /** @copydoc PDMAPICHLPR3::pfnGetCpuId */ 224 207 static DECLCALLBACK(VMCPUID) pdmR3ApicHlp_GetCpuId(PPDMDEVINS pDevIns) … … 276 259 277 260 261 /** @copydoc PDMAPICHLPR3::pfnGetR3CritSect */ 262 static 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 */ 271 static 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 */ 282 static 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 278 293 /** 279 294 * APIC Device Helpers. … … 285 300 pdmR3ApicHlp_ClearInterruptFF, 286 301 pdmR3ApicHlp_ChangeFeature, 287 pdmR3ApicHlp_Lock,288 pdmR3ApicHlp_Unlock,289 302 pdmR3ApicHlp_GetCpuId, 290 303 pdmR3ApicHlp_SendSipi, … … 292 305 pdmR3ApicHlp_GetRCHelpers, 293 306 pdmR3ApicHlp_GetR0Helpers, 307 pdmR3ApicHlp_GetR3CritSect, 308 pdmR3ApicHlp_GetRCCritSect, 309 pdmR3ApicHlp_GetR0CritSect, 294 310 PDM_APICHLPR3_VERSION /* the end */ 295 311 };
Note:
See TracChangeset
for help on using the changeset viewer.