Changeset 30500 in vbox
- Timestamp:
- Jun 29, 2010 1:20:37 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 63192
- Location:
- trunk/src/VBox/VMM/PATM
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/PATM/CSAM.cpp
r30499 r30500 673 673 * @param pCacheRec Address conversion cache record 674 674 * @param pGCPtr Guest context pointer 675 * @param pLock Where to store the lock information that PGMPhysReleasePageMappingLock needs.676 675 * @returns Host context pointer or NULL in case of an error 677 676 * 678 677 */ 679 static R3PTRTYPE(void *) CSAMGCVirtToHCVirt(PVM pVM, PCSAMP2GLOOKUPREC pCacheRec, RCPTRTYPE(uint8_t *) pGCPtr , PPGMPAGEMAPLOCK pLock)678 static R3PTRTYPE(void *) CSAMGCVirtToHCVirt(PVM pVM, PCSAMP2GLOOKUPREC pCacheRec, RCPTRTYPE(uint8_t *) pGCPtr) 680 679 { 681 680 int rc; … … 684 683 PVMCPU pVCpu = VMMGetCpu0(pVM); 685 684 686 pLock->pvMap = NULL; /* invalidate it in case we don't call PGMPhysGCPtr2CCPtrReadOnly */687 685 STAM_PROFILE_START(&pVM->csam.s.StatTimeAddrConv, a); 688 686 689 687 pHCPtr = PATMR3GCPtrToHCPtr(pVM, pGCPtr); 690 if (pHCPtr) return pHCPtr; 688 if (pHCPtr) 689 return pHCPtr; 691 690 692 691 if (pCacheRec->pPageLocStartHC) … … 700 699 } 701 700 702 rc = PGMPhysGCPtr2CCPtrReadOnly(pVCpu, pGCPtr, (const void **)&pHCPtr, pLock); 701 /* Release previous lock if any. */ 702 if (pCacheRec->Lock.pvMap) 703 { 704 PGMPhysReleasePageMappingLock(pVM, &pCacheRec->Lock); 705 pCacheRec->Lock.pvMap = NULL; 706 } 707 708 rc = PGMPhysGCPtr2CCPtrReadOnly(pVCpu, pGCPtr, (const void **)&pHCPtr, &pCacheRec->Lock); 703 709 if (rc != VINF_SUCCESS) 704 710 { … … 863 869 cbInstr += opsize; 864 870 865 { 866 PGMPAGEMAPLOCK PageLock; 871 { /* Force pCurInstrHC out of scope after we stop using it (page lock!) */ 867 872 uint8_t *pCurInstrHC = 0; 868 pCurInstrHC = (uint8_t *)CSAMGCVirtToHCVirt(pVM, pCacheRec, pCurInstrGC , &PageLock);873 pCurInstrHC = (uint8_t *)CSAMGCVirtToHCVirt(pVM, pCacheRec, pCurInstrGC); 869 874 if (pCurInstrHC == NULL) 870 875 { … … 876 881 cpu.mode = (fCode32) ? CPUMODE_32BIT : CPUMODE_16BIT; 877 882 rc = CSAMR3DISInstr(pVM, &cpu, pCurInstrGC, pCurInstrHC, &opsize, NULL); 878 if (PageLock.pvMap)879 PGMPhysReleasePageMappingLock(pVM, &PageLock);880 883 } 881 884 AssertRC(rc); … … 1259 1262 } 1260 1263 1261 { 1262 PGMPAGEMAPLOCK PageLock; 1263 uint8_t *pCurInstrHC = (uint8_t *)CSAMGCVirtToHCVirt(pVM, pCacheRec, pCurInstrGC, &PageLock); 1264 { /* Force pCurInstrHC out of scope after we stop using it (page lock!) */ 1265 uint8_t *pCurInstrHC = (uint8_t *)CSAMGCVirtToHCVirt(pVM, pCacheRec, pCurInstrGC); 1264 1266 if (pCurInstrHC == NULL) 1265 1267 { … … 1279 1281 #endif 1280 1282 STAM_PROFILE_STOP(&pVM->csam.s.StatTimeDisasm, a); 1281 if (PageLock.pvMap)1282 PGMPhysReleasePageMappingLock(pVM, &PageLock);1283 1283 } 1284 1284 if (RT_FAILURE(rc2)) … … 2297 2297 if (CSAMIsEnabled(pVM)) 2298 2298 { 2299 / / Cache record for PATMGCVirtToHCVirt2299 /* Cache record for CSAMGCVirtToHCVirt */ 2300 2300 CSAMP2GLOOKUPREC cacheRec; 2301 2301 RT_ZERO(cacheRec); … … 2304 2304 rc = csamAnalyseCallCodeStream(pVM, pInstrGC, pInstrGC, true /* 32 bits code */, CSAMR3AnalyseCallback, pPage, &cacheRec); 2305 2305 STAM_PROFILE_STOP(&pVM->csam.s.StatTime, a); 2306 if (cacheRec.Lock.pvMap) 2307 PGMPhysReleasePageMappingLock(pVM, &cacheRec.Lock); 2308 2306 2309 if (rc != VINF_SUCCESS) 2307 2310 { … … 2457 2460 { 2458 2461 PCSAMPAGE pPage = NULL; 2459 CSAMP2GLOOKUPREC cacheRec; /* Cache record for PATMGCVirtToHCVirt. */2462 CSAMP2GLOOKUPREC cacheRec; /* Cache record for CSAMGCVirtToHCVirt. */ 2460 2463 RT_ZERO(cacheRec); 2461 2464 … … 2464 2467 rc = csamAnalyseCodeStream(pVM, pHandler, pHandler, true, CSAMR3AnalyseCallback, pPage, &cacheRec); 2465 2468 STAM_PROFILE_STOP(&pVM->csam.s.StatTime, a); 2469 if (cacheRec.Lock.pvMap) 2470 PGMPhysReleasePageMappingLock(pVM, &cacheRec.Lock); 2471 2466 2472 if (rc != VINF_SUCCESS) 2467 2473 { … … 2511 2517 PCSAMPAGE pPage = NULL; 2512 2518 DBGFSELINFO selInfo; 2513 CSAMP2GLOOKUPREC cacheRec; /* Cache record for PATMGCVirtToHCVirt. */2519 CSAMP2GLOOKUPREC cacheRec; /* Cache record for CSAMGCVirtToHCVirt. */ 2514 2520 RT_ZERO(cacheRec); 2515 2521 … … 2542 2548 rc = csamAnalyseCodeStream(pVM, pHandler, pHandler, true, CSAMR3AnalyseCallback, pPage, &cacheRec); 2543 2549 STAM_PROFILE_STOP(&pVM->csam.s.StatTime, b); 2550 if (cacheRec.Lock.pvMap) 2551 PGMPhysReleasePageMappingLock(pVM, &cacheRec.Lock); 2552 2544 2553 if (rc != VINF_SUCCESS) 2545 2554 { -
trunk/src/VBox/VMM/PATM/CSAMInternal.h
r28800 r30500 74 74 75 75 PCSAMCALLEXITREC pCallExitRec; 76 77 PGMPAGEMAPLOCK Lock; 76 78 } CSAMP2GLOOKUPREC, *PCSAMP2GLOOKUPREC; 77 79
Note:
See TracChangeset
for help on using the changeset viewer.