Changeset 17517 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Mar 7, 2009 6:16:56 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp
r17512 r17517 1409 1409 /* 1410 1410 * The most frequent access here is MMIO and shadowed ROM. 1411 * 1412 * The current code ASSUMES all these access handlers are page sized 1413 * and that we do NOT use any virtual ones. 1414 */ 1415 if ( PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) == PGM_PAGE_HNDL_PHYS_STATE_ALL 1416 && PGM_PAGE_GET_HNDL_VIRT_STATE(pPage) != PGM_PAGE_HNDL_VIRT_STATE_ALL) 1411 * The current code ASSUMES all these access handlers covers full pages! 1412 */ 1413 1414 /* 1415 * Whatever we do we need the source page, map it first. 1416 */ 1417 const void *pvSrc = NULL; 1418 int rc = pgmPhysGCPhys2CCPtrInternalReadOnly(pVM, pPage, GCPhys, &pvSrc); 1419 if (RT_FAILURE(rc)) 1420 { 1421 AssertLogRelMsgFailed(("pgmPhysGCPhys2CCPtrInternalReadOnly failed on %RGp / %R[pgmpage] -> %Rrc\n", 1422 GCPhys, pPage, rc)); 1423 memset(pvBuf, 0xff, cb); 1424 return; 1425 } 1426 rc = VINF_PGM_HANDLER_DO_DEFAULT; 1427 1428 /* 1429 * Deal with any physical handlers. 1430 */ 1431 PPGMPHYSHANDLER pPhys = NULL; 1432 if (PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) == PGM_PAGE_HNDL_PHYS_STATE_ALL) 1417 1433 { 1418 1434 #ifdef IN_RING3 1419 PPGMPHYSHANDLER pCur = (PPGMPHYSHANDLER)RTAvlroGCPhysRangeGet(&pVM->pgm.s.CTX_SUFF(pTrees)->PhysHandlers, GCPhys); 1420 AssertReleaseMsg(pCur, ("GCPhys=%RGp cb=%#x\n", GCPhys, cb)); 1421 Assert(GCPhys >= pCur->Core.Key && GCPhys <= pCur->Core.KeyLast); 1422 Assert(pCur->CTX_SUFF(pfnHandler)); 1423 1424 const void *pvSrc; 1425 int rc = pgmPhysGCPhys2CCPtrInternalReadOnly(pVM, pPage, GCPhys, &pvSrc); 1426 if (RT_SUCCESS(rc)) 1427 { 1428 STAM_PROFILE_START(&pCur->Stat, h); 1429 int rc = pCur->CTX_SUFF(pfnHandler)(pVM, GCPhys, (void *)pvSrc, pvBuf, cb, PGMACCESSTYPE_READ, pCur->CTX_SUFF(pvUser)); 1430 STAM_PROFILE_STOP(&pCur->Stat, h); 1431 if (rc == VINF_PGM_HANDLER_DO_DEFAULT) 1432 memcpy(pvBuf, pvSrc, cb); 1433 else 1434 AssertLogRelMsg(rc == VINF_SUCCESS, ("rc=%Rrc GCPhys=%RGp\n", rc, GCPhys)); 1435 } 1436 else 1437 { 1438 AssertLogRelMsgFailed(("pgmPhysGCPhys2CCPtrInternalReadOnly failed on %RGp / %R[pgmpage] -> %Rrc\n", 1439 GCPhys, pPage, rc)); 1440 memset(pvBuf, 0xff, cb); 1441 } 1435 PPGMPHYSHANDLER pPhys = (PPGMPHYSHANDLER)RTAvlroGCPhysRangeGet(&pVM->pgm.s.CTX_SUFF(pTrees)->PhysHandlers, GCPhys); 1436 AssertReleaseMsg(pPhys, ("GCPhys=%RGp cb=%#x\n", GCPhys, cb)); 1437 Assert(GCPhys >= pPhys->Core.Key && GCPhys <= pPhys->Core.KeyLast); 1438 Assert((pPhys->Core.Key & PAGE_OFFSET_MASK) == 0); 1439 Assert((pPhys->Core.KeyLast & PAGE_OFFSET_MASK) == PAGE_OFFSET_MASK); 1440 Assert(pPhys->CTX_SUFF(pfnHandler)); 1441 1442 Log5(("pgmPhysReadHandler: GCPhys=%RGp cb=%#x pPage=%R[pgmpage] phys %s\n", GCPhys, cb, pPage, R3STRING(pPhys->pszDesc) )); 1443 STAM_PROFILE_START(&pPhys->Stat, h); 1444 rc = pPhys->CTX_SUFF(pfnHandler)(pVM, GCPhys, (void *)pvSrc, pvBuf, cb, PGMACCESSTYPE_READ, pPhys->CTX_SUFF(pvUser)); 1445 STAM_PROFILE_STOP(&pPhys->Stat, h); 1446 AssertLogRelMsg(rc == VINF_SUCCESS || rc == VINF_PGM_HANDLER_DO_DEFAULT, ("rc=%Rrc GCPhys=%RGp\n", rc, GCPhys)); 1442 1447 #else 1443 1448 AssertReleaseMsgFailed(("Wrong API! GCPhys=%RGp cb=%#x\n", GCPhys, cb)); 1444 1449 #endif 1445 1450 } 1446 else 1447 AssertReleaseMsgFailed(("ALL access virtual handlers are not implemented here\n")); 1451 1452 /* 1453 * Deal with any virtual handlers. 1454 */ 1455 if (PGM_PAGE_GET_HNDL_VIRT_STATE(pPage) == PGM_PAGE_HNDL_VIRT_STATE_ALL) 1456 { 1457 unsigned iPage; 1458 PPGMVIRTHANDLER pVirt; 1459 1460 int rc2 = pgmHandlerVirtualFindByPhysAddr(pVM, GCPhys, &pVirt, &iPage); 1461 AssertReleaseMsg(RT_SUCCESS(rc2), ("GCPhys=%RGp cb=%#x rc2=%Rrc\n", GCPhys, cb, rc2)); 1462 Assert((pVirt->Core.Key & PAGE_OFFSET_MASK) == 0); 1463 Assert((pVirt->Core.KeyLast & PAGE_OFFSET_MASK) == PAGE_OFFSET_MASK); 1464 Assert(GCPhys >= pVirt->aPhysToVirt[iPage].Core.Key && GCPhys <= pVirt->aPhysToVirt[iPage].Core.KeyLast); 1465 1466 #ifdef IN_RING3 1467 rc = VINF_PGM_HANDLER_DO_DEFAULT; 1468 if (pVirt->pfnHandlerR3) 1469 { 1470 if (PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) != PGM_PAGE_HNDL_PHYS_STATE_ALL) 1471 Log5(("pgmPhysWriteHandler: GCPhys=%RGp cb=%#x pPage=%R[pgmpage] virt %s\n", GCPhys, cb, pPage, R3STRING(pVirt->pszDesc) )); 1472 else 1473 Log(("pgmPhysWriteHandler: GCPhys=%RGp cb=%#x pPage=%R[pgmpage] phys/virt %s/%s\n", GCPhys, cb, pPage, R3STRING(pVirt->pszDesc), R3STRING(pPhys->pszDesc) )); 1474 RTGCUINTPTR GCPtr = ((RTGCUINTPTR)pVirt->Core.Key & PAGE_BASE_GC_MASK) 1475 + (iPage << PAGE_SHIFT) 1476 + (GCPhys & PAGE_OFFSET_MASK); 1477 1478 STAM_PROFILE_START(&pVirt->Stat, h); 1479 rc2 = pVirt->CTX_SUFF(pfnHandler)(pVM, GCPtr, (void *)pvSrc, pvBuf, cb, PGMACCESSTYPE_READ, /*pVirt->CTX_SUFF(pvUser)*/ NULL); 1480 STAM_PROFILE_STOP(&pVirt->Stat, h); 1481 if (rc2 == VINF_SUCCESS) 1482 rc = VINF_SUCCESS; 1483 AssertLogRelMsg(rc == VINF_SUCCESS || rc == VINF_PGM_HANDLER_DO_DEFAULT, ("rc=%Rrc GCPhys=%RGp pPage=%R[pgmpage] %s\n", rc, GCPhys, pPage, pVirt->pszDesc)); 1484 } 1485 else 1486 Log5(("pgmPhysWriteHandler: GCPhys=%RGp cb=%#x pPage=%R[pgmpage] virt %s [no handler]\n", GCPhys, cb, pPage, R3STRING(pVirt->pszDesc) )); 1487 #else 1488 AssertReleaseMsgFailed(("Wrong API! GCPhys=%RGp cb=%#x\n", GCPhys, cb)); 1489 #endif 1490 } 1491 1492 /* 1493 * Take the default action. 1494 */ 1495 if (rc == VINF_PGM_HANDLER_DO_DEFAULT) 1496 memcpy(pvBuf, pvSrc, cb); 1448 1497 } 1449 1498
Note:
See TracChangeset
for help on using the changeset viewer.