Changeset 6913 in vbox
- Timestamp:
- Feb 11, 2008 11:02:51 PM (17 years ago)
- svn:sync-xref-src-repo-rev:
- 28064
- Location:
- trunk
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/pgm.h
r6912 r6913 186 186 * system structure which the brain dead intel guys let unprivilegde code find. */ 187 187 PGMVIRTHANDLERTYPE_HYPERVISOR 188 189 188 } PGMVIRTHANDLERTYPE; 190 189 -
trunk/src/VBox/VMM/PGM.cpp
r6902 r6913 521 521 static DECLCALLBACK(int) pgmR3RelocatePhysHandler(PAVLROGCPHYSNODECORE pNode, void *pvUser); 522 522 static DECLCALLBACK(int) pgmR3RelocateVirtHandler(PAVLROGCPTRNODECORE pNode, void *pvUser); 523 static DECLCALLBACK(int) pgmR3RelocateHyperVirtHandler(PAVLROGCPTRNODECORE pNode, void *pvUser); 523 524 #ifdef VBOX_STRICT 524 525 static DECLCALLBACK(void) pgmR3ResetNoMorePhysWritesFlag(PVM pVM, VMSTATE enmState, VMSTATE enmOldState, void *pvUser); … … 939 940 pgmR3PhysInfo); 940 941 DBGFR3InfoRegisterInternal(pVM, "handlers", 941 "Dumps physical and virtual handlers. " 942 "Pass 'phys' or 'virt' as argument if only one kind is wanted.", 942 "Dumps physical, virtual and hyper virtual handlers. " 943 "Pass 'phys', 'virt', 'hyper' as argument if only one kind is wanted. " 944 "Add 'nost' if the statistics are unwanted.", 943 945 pgmR3InfoHandlers); 944 946 … … 1599 1601 RTAvlroGCPhysDoWithAll(&pVM->pgm.s.pTreesHC->PhysHandlers, true, pgmR3RelocatePhysHandler, &offDelta); 1600 1602 RTAvlroGCPtrDoWithAll(&pVM->pgm.s.pTreesHC->VirtHandlers, true, pgmR3RelocateVirtHandler, &offDelta); 1603 RTAvlroGCPtrDoWithAll(&pVM->pgm.s.pTreesHC->HyperVirtHandlers, true, pgmR3RelocateHyperVirtHandler, &offDelta); 1601 1604 1602 1605 /* … … 1639 1642 PPGMVIRTHANDLER pHandler = (PPGMVIRTHANDLER)pNode; 1640 1643 RTGCINTPTR offDelta = *(PRTGCINTPTR)pvUser; 1644 Assert( pHandler->enmType == PGMVIRTHANDLERTYPE_ALL 1645 || pHandler->enmType == PGMVIRTHANDLERTYPE_WRITE); 1646 Assert(pHandler->pfnHandlerGC); 1647 pHandler->pfnHandlerGC += offDelta; 1648 return 0; 1649 } 1650 1651 1652 /** 1653 * Callback function for relocating a virtual access handler for the hypervisor mapping. 1654 * 1655 * @returns 0 (continue enum) 1656 * @param pNode Pointer to a PGMVIRTHANDLER node. 1657 * @param pvUser Pointer to the offDelta. This is a pointer to the delta since we're 1658 * not certain the delta will fit in a void pointer for all possible configs. 1659 */ 1660 static DECLCALLBACK(int) pgmR3RelocateHyperVirtHandler(PAVLROGCPTRNODECORE pNode, void *pvUser) 1661 { 1662 PPGMVIRTHANDLER pHandler = (PPGMVIRTHANDLER)pNode; 1663 RTGCINTPTR offDelta = *(PRTGCINTPTR)pvUser; 1664 Assert(pHandler->enmType == PGMVIRTHANDLERTYPE_HYPERVISOR); 1641 1665 Assert(pHandler->pfnHandlerGC); 1642 1666 pHandler->pfnHandlerGC += offDelta; … … 3834 3858 cErrors += RTAvlroGCPtrDoWithAll( &pVM->pgm.s.pTreesHC->VirtHandlers, false, pgmR3CheckIntegrityVirtHandlerNode, &Args); 3835 3859 Args.fLeftToRight = true; 3860 cErrors += RTAvlroGCPtrDoWithAll( &pVM->pgm.s.pTreesHC->HyperVirtHandlers, true, pgmR3CheckIntegrityVirtHandlerNode, &Args); 3861 Args.fLeftToRight = false; 3862 cErrors += RTAvlroGCPtrDoWithAll( &pVM->pgm.s.pTreesHC->HyperVirtHandlers, false, pgmR3CheckIntegrityVirtHandlerNode, &Args); 3863 Args.fLeftToRight = true; 3836 3864 cErrors += RTAvlroGCPhysDoWithAll(&pVM->pgm.s.pTreesHC->PhysToVirtHandlers, true, pgmR3CheckIntegrityPhysToVirtHandlerNode, &Args); 3837 3865 Args.fLeftToRight = false; -
trunk/src/VBox/VMM/PGMHandler.cpp
r6912 r6913 268 268 * @param pfnHandlerGC The GC handler. 269 269 * @param pszDesc Pointer to description string. This must not be freed. 270 * @thread EMT 270 271 */ 271 272 /** @todo rename this to PGMR3HandlerVirtualRegisterEx. */ 273 /** @todo create a template for virtual handlers (see async i/o), we're wasting space 274 * duplicating the function pointers now. (Or we will once we add the missing callbacks.) */ 272 275 PGMDECL(int) PGMHandlerVirtualRegisterEx(PVM pVM, PGMVIRTHANDLERTYPE enmType, RTGCPTR GCPtr, RTGCPTR GCPtrLast, 273 276 PFNPGMHCVIRTINVALIDATE pfnInvalidateHC, … … 349 352 * the same range this makes everything much simpler and faster. 350 353 */ 354 AVLROGCPTRTREE *pRoot = enmType != PGMVIRTHANDLERTYPE_HYPERVISOR 355 ? &pVM->pgm.s.CTXSUFF(pTrees)->VirtHandlers 356 : &pVM->pgm.s.CTXSUFF(pTrees)->HyperVirtHandlers; 351 357 pgmLock(pVM); 352 if (pVM->pgm.s.pTreesHC->VirtHandlers != 0) 353 { 354 PPGMVIRTHANDLER pCur = (PPGMVIRTHANDLER)RTAvlroGCPtrGetBestFit(&pVM->pgm.s.CTXSUFF(pTrees)->VirtHandlers, pNew->Core.Key, true); 355 if (!pCur || GCPtr > pCur->GCPtrLast || GCPtrLast < pCur->GCPtr) 356 pCur = (PPGMVIRTHANDLER)RTAvlroGCPtrGetBestFit(&pVM->pgm.s.CTXSUFF(pTrees)->VirtHandlers, pNew->Core.Key, false); 357 if (pCur && GCPtr <= pCur->GCPtrLast && GCPtrLast >= pCur->GCPtr) 358 if (*pRoot != 0) 359 { 360 PPGMVIRTHANDLER pCur = (PPGMVIRTHANDLER)RTAvlroGCPtrGetBestFit(pRoot, pNew->Core.Key, true); 361 if ( !pCur 362 || GCPtr > pCur->GCPtrLast 363 || GCPtrLast < pCur->GCPtr) 364 pCur = (PPGMVIRTHANDLER)RTAvlroGCPtrGetBestFit(pRoot, pNew->Core.Key, false); 365 if ( pCur 366 && GCPtr <= pCur->GCPtrLast 367 && GCPtrLast >= pCur->GCPtr) 358 368 { 359 369 /* … … 368 378 } 369 379 } 370 if (RTAvlroGCPtrInsert( &pVM->pgm.s.CTXSUFF(pTrees)->VirtHandlers, &pNew->Core))380 if (RTAvlroGCPtrInsert(pRoot, &pNew->Core)) 371 381 { 372 382 if (enmType != PGMVIRTHANDLERTYPE_HYPERVISOR) … … 386 396 return VINF_SUCCESS; 387 397 } 398 388 399 pgmUnlock(pVM); 389 400 AssertFailed(); … … 394 405 395 406 /** 396 * Modify the page invalidation callback handler for a registered virtual range 407 * Modify the page invalidation callback handler for a registered virtual range. 397 408 * (add more when needed) 398 409 * … … 401 412 * @param GCPtr Start address. 402 413 * @param pfnInvalidateHC The HC invalidate callback (can be 0) 414 * @remarks Doesn't work with the hypervisor access handler type. 403 415 */ 404 416 PGMDECL(int) PGMHandlerVirtualChangeInvalidateCallback(PVM pVM, RTGCPTR GCPtr, PFNPGMHCVIRTINVALIDATE pfnInvalidateHC) … … 424 436 * @param pVM VM handle. 425 437 * @param GCPtr Start address. 438 * @thread EMT 426 439 */ 427 440 PGMDECL(int) PGMHandlerVirtualDeregister(PVM pVM, RTGCPTR GCPtr) 428 441 { 442 pgmLock(pVM); 443 429 444 /* 430 445 * Find the handler. 431 446 * We naturally assume GCPtr is a unique specification. 432 447 */ 433 pgmLock(pVM);434 448 PPGMVIRTHANDLER pCur = (PPGMVIRTHANDLER)RTAvlroGCPtrRemove(&pVM->pgm.s.CTXSUFF(pTrees)->VirtHandlers, GCPtr); 435 if ( pCur)436 { 437 Log(("PGM R3HandlerVirtualDeregister: Removing Virtual (%d) Range %#x-%#x %s\n", pCur->enmType,449 if (RT_LIKELY(pCur)) 450 { 451 Log(("PGMHandlerVirtualDeregister: Removing Virtual (%d) Range %#x-%#x %s\n", pCur->enmType, 438 452 pCur->GCPtr, pCur->GCPtrLast, pCur->pszDesc)); 453 Assert(pCur->enmType != PGMVIRTHANDLERTYPE_HYPERVISOR); 439 454 440 455 /* … … 447 462 448 463 /* 449 * Schedule CR3 sync (if required) and the memory.464 * Schedule CR3 sync. 450 465 */ 451 STAM_DEREG(pVM, &pCur->Stat); 452 if (pCur->enmType != PGMVIRTHANDLERTYPE_HYPERVISOR) 466 pVM->pgm.s.fSyncFlags |= PGM_SYNC_UPDATE_PAGE_BIT_VIRTUAL | PGM_SYNC_CLEAR_PGM_POOL; 467 VM_FF_SET(pVM, VM_FF_PGM_SYNC_CR3); 468 } 469 else 470 { 471 /* must be a hypervisor one then. */ 472 pCur = (PPGMVIRTHANDLER)RTAvlroGCPtrRemove(&pVM->pgm.s.CTXSUFF(pTrees)->HyperVirtHandlers, GCPtr); 473 if (RT_UNLIKELY(!pCur)) 453 474 { 454 pVM->pgm.s.fSyncFlags |= PGM_SYNC_UPDATE_PAGE_BIT_VIRTUAL | PGM_SYNC_CLEAR_PGM_POOL; 455 VM_FF_SET(pVM, VM_FF_PGM_SYNC_CR3); 475 pgmUnlock(pVM); 476 AssertMsgFailed(("Range %#x not found!\n", GCPtr)); 477 return VERR_INVALID_PARAMETER; 456 478 } 457 MMHyperFree(pVM, pCur); 458 pgmUnlock(pVM); 459 return VINF_SUCCESS; 460 } 479 480 Log(("PGMHandlerVirtualDeregister: Removing Hyper Virtual (%d) Range %#x-%#x %s\n", pCur->enmType, 481 pCur->GCPtr, pCur->GCPtrLast, pCur->pszDesc)); 482 Assert(pCur->enmType == PGMVIRTHANDLERTYPE_HYPERVISOR); 483 } 484 461 485 pgmUnlock(pVM); 462 AssertMsgFailed(("Range %#x not found!\n", GCPtr)); 463 return VERR_INVALID_PARAMETER; 486 487 STAM_DEREG(pVM, &pCur->Stat); 488 MMHyperFree(pVM, pCur); 489 490 return VINF_SUCCESS; 464 491 } 465 492 … … 491 518 bool fPhysical = !pszArgs || !*pszArgs; 492 519 bool fVirtual = fPhysical; 520 bool fHyper = fPhysical; 493 521 if (!fPhysical) 494 522 { 495 523 fPhysical = strstr(pszArgs, "phys") != NULL; 496 524 fVirtual = strstr(pszArgs, "virt") != NULL; 525 fHyper = strstr(pszArgs, "hyper") != NULL; 497 526 Args.fStats = strstr(pszArgs, "nost") == NULL; 498 527 } … … 516 545 "From - To (excl) HandlerHC HandlerGC Type Description\n"); 517 546 RTAvlroGCPtrDoWithAll(&pVM->pgm.s.pTreesHC->VirtHandlers, true, pgmR3InfoHandlersVirtualOne, &Args); 547 } 548 549 if (fHyper) 550 { 551 pHlp->pfnPrintf(pHlp, 552 "Hypervisor Virtual handlers:\n" 553 "From - To (excl) HandlerHC HandlerGC Type Description\n"); 554 RTAvlroGCPtrDoWithAll(&pVM->pgm.s.pTreesHC->HyperVirtHandlers, true, pgmR3InfoHandlersVirtualOne, &Args); 518 555 } 519 556 } … … 568 605 switch (pCur->enmType) 569 606 { 570 case PGMVIRTHANDLERTYPE_WRITE: pszType = "Write "; break;571 case PGMVIRTHANDLERTYPE_ALL: pszType = "All "; break;607 case PGMVIRTHANDLERTYPE_WRITE: pszType = "Write "; break; 608 case PGMVIRTHANDLERTYPE_ALL: pszType = "All "; break; 572 609 case PGMVIRTHANDLERTYPE_HYPERVISOR: pszType = "WriteHyp "; break; 573 default: pszType = "????"; break;610 default: pszType = "????"; break; 574 611 } 575 612 pHlp->pfnPrintf(pHlp, "%08x - %08x %08x %08x %s %s\n", -
trunk/src/VBox/VMM/PGMInternal.h
r6906 r6913 1562 1562 /** Virtual access handlers (Phys range AVL range + offsetptr tree). */ 1563 1563 AVLROGCPHYSTREE PhysToVirtHandlers; 1564 uint32_t auPadding[1]; 1564 /** Virtual access handlers for the hypervisor (AVL range + GC ptr tree). */ 1565 AVLROGCPTRTREE HyperVirtHandlers; 1565 1566 } PGMTREES; 1566 1567 /** Pointer to PGM trees. */ -
trunk/src/VBox/VMM/PGMMap.cpp
r6912 r6913 1093 1093 RTLogPrintf("WRITE %RGv-%RGv size %RGv %s\n", pCur->GCPtr, pCur->GCPtrLast, pCur->cb, pCur->pszDesc); 1094 1094 break; 1095 case PGMVIRTHANDLERTYPE_ALL: 1096 RTLogPrintf("ALL %RGv-%RGv size %RGv %s\n", pCur->GCPtr, pCur->GCPtrLast, pCur->cb, pCur->pszDesc); 1097 break; 1095 1098 case PGMVIRTHANDLERTYPE_HYPERVISOR: 1096 1099 RTLogPrintf("WRITEHYP %RGv-%RGv size %RGv %s\n", pCur->GCPtr, pCur->GCPtrLast, pCur->cb, pCur->pszDesc); 1097 break;1098 case PGMVIRTHANDLERTYPE_ALL:1099 RTLogPrintf("ALL %RGv-%RGv size %RGv %s\n", pCur->GCPtr, pCur->GCPtrLast, pCur->cb, pCur->pszDesc);1100 1100 break; 1101 1101 } … … 1124 1124 RTLogPrintf("%VGv - %VGv %s\n", pCur->GCPtr, pCur->GCPtrLast, pCur->pszDesc); 1125 1125 1126 /** @todo The handler stuff is totally alien here. This should be converted into a 'info' function. */ 1126 /** @todo The handler stuff is totally alien here. This should be converted into a 'info' function. 1127 * There are now, just kill this. */ 1127 1128 RTLogPrintf("\nVirtual handlers:\n"); 1128 1129 RTAvlroGCPtrDoWithAll(&pVM->pgm.s.pTreesHC->VirtHandlers, true, pgmVirtHandlerDump, pVM); -
trunk/src/VBox/VMM/VMMAll/PGMAllBth.h
r6911 r6913 197 197 * Check if the fault address is in a virtual page access handler range. 198 198 */ 199 PPGMVIRTHANDLER pCur = (PPGMVIRTHANDLER)RTAvlroGCPtrRangeGet(&CTXSUFF(pVM->pgm.s.pTrees)-> VirtHandlers, pvFault);199 PPGMVIRTHANDLER pCur = (PPGMVIRTHANDLER)RTAvlroGCPtrRangeGet(&CTXSUFF(pVM->pgm.s.pTrees)->HyperVirtHandlers, pvFault); 200 200 if ( pCur 201 201 && (RTGCUINTPTR)pvFault - (RTGCUINTPTR)pCur->GCPtr < pCur->cb 202 && ( uErr & X86_TRAP_PF_RW 203 || ( pCur->enmType != PGMVIRTHANDLERTYPE_WRITE 204 && pCur->enmType != PGMVIRTHANDLERTYPE_HYPERVISOR) ) ) /** r=bird: <- this is probably wrong. */ 202 && uErr & X86_TRAP_PF_RW) 205 203 { 206 204 # ifdef IN_GC … … 384 382 if ( (RTGCUINTPTR)pvFault - (RTGCUINTPTR)pCur->GCPtr < pCur->cb 385 383 && ( uErr & X86_TRAP_PF_RW 386 || ( pCur->enmType != PGMVIRTHANDLERTYPE_WRITE 387 && pCur->enmType != PGMVIRTHANDLERTYPE_HYPERVISOR) ) ) /** @todo r=bird: _HYPERVISOR is impossible here because of mapping check. */ 384 || pCur->enmType != PGMVIRTHANDLERTYPE_WRITE ) ) 388 385 { 389 386 # ifdef IN_GC … … 411 408 if ( pCur 412 409 && ( uErr & X86_TRAP_PF_RW 413 || ( pCur->enmType != PGMVIRTHANDLERTYPE_WRITE 414 && pCur->enmType != PGMVIRTHANDLERTYPE_HYPERVISOR) ) ) 410 || pCur->enmType != PGMVIRTHANDLERTYPE_WRITE ) ) 415 411 { 416 412 Assert((pCur->aPhysToVirt[iPage].Core.Key & X86_PTE_PAE_PG_MASK) == GCPhys); … … 494 490 if ( (RTGCUINTPTR)pvFault - (RTGCUINTPTR)pCur->GCPtr < pCur->cb 495 491 && ( uErr & X86_TRAP_PF_RW 496 || ( pCur->enmType != PGMVIRTHANDLERTYPE_WRITE 497 && pCur->enmType != PGMVIRTHANDLERTYPE_HYPERVISOR) ) ) /** @todo r=bird: _HYPERVISOR is impossible here because of mapping check. */ 492 || pCur->enmType != PGMVIRTHANDLERTYPE_WRITE ) ) 498 493 { 499 494 # ifdef IN_GC -
trunk/src/VBox/VMM/VMMAll/PGMAllGst.h
r6912 r6913 644 644 PPGMVIRTHANDLER pCur = (PPGMVIRTHANDLER)pNode; 645 645 PPGMHVUSTATE pState = (PPGMHVUSTATE)pvUser; 646 Assert(pCur->enmType != PGMVIRTHANDLERTYPE_HYPERVISOR); 646 647 647 648 #if PGM_GST_TYPE == PGM_TYPE_32BIT -
trunk/src/VBox/VMM/VMMAll/PGMAllHandler.cpp
r6912 r6913 1100 1100 * Calc flags. 1101 1101 */ 1102 Assert(pCur->enmType != PGMVIRTHANDLERTYPE_HYPERVISOR); 1102 1103 unsigned fFlags; 1103 1104 switch (pCur->enmType) -
trunk/src/VBox/VMM/testcase/tstVMStructGC.cpp
r6854 r6913 566 566 GEN_CHECK_OFF(PGMTREES, VirtHandlers); 567 567 GEN_CHECK_OFF(PGMTREES, PhysToVirtHandlers); 568 GEN_CHECK_OFF(PGMTREES, auPadding);568 GEN_CHECK_OFF(PGMTREES, HyperVirtHandlers); 569 569 GEN_CHECK_SIZE(PGMPOOLPAGE); 570 570 GEN_CHECK_OFF(PGMPOOLPAGE, Core);
Note:
See TracChangeset
for help on using the changeset viewer.