Changeset 14301 in vbox for trunk/src/VBox/VMM/PGM.cpp
- Timestamp:
- Nov 18, 2008 1:31:42 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 39488
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/PGM.cpp
r14260 r14301 1413 1413 * As with the intermediate context, AMD64 uses the PAE PDPT and PDs. 1414 1414 */ 1415 #ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY 1415 1416 pVM->pgm.s.pShw32BitPdR3 = (PX86PD)MMR3PageAllocLow(pVM); 1416 # ifndef VBOX_WITH_2X_4GB_ADDR_SPACE1417 # ifndef VBOX_WITH_2X_4GB_ADDR_SPACE 1417 1418 pVM->pgm.s.pShw32BitPdR0 = (uintptr_t)pVM->pgm.s.pShw32BitPdR3; 1418 # endif1419 # endif 1419 1420 pVM->pgm.s.apShwPaePDsR3[0] = (PX86PDPAE)MMR3PageAlloc(pVM); 1420 1421 pVM->pgm.s.apShwPaePDsR3[1] = (PX86PDPAE)MMR3PageAlloc(pVM); … … 1424 1425 pVM->pgm.s.apShwPaePDsR3[3] = (PX86PDPAE)MMR3PageAlloc(pVM); 1425 1426 AssertRelease((uintptr_t)pVM->pgm.s.apShwPaePDsR3[2] + PAGE_SIZE == (uintptr_t)pVM->pgm.s.apShwPaePDsR3[3]); 1426 # ifndef VBOX_WITH_2X_4GB_ADDR_SPACE1427 # ifndef VBOX_WITH_2X_4GB_ADDR_SPACE 1427 1428 pVM->pgm.s.apShwPaePDsR0[0] = (uintptr_t)pVM->pgm.s.apShwPaePDsR3[0]; 1428 1429 pVM->pgm.s.apShwPaePDsR0[1] = (uintptr_t)pVM->pgm.s.apShwPaePDsR3[1]; 1429 1430 pVM->pgm.s.apShwPaePDsR0[2] = (uintptr_t)pVM->pgm.s.apShwPaePDsR3[2]; 1430 1431 pVM->pgm.s.apShwPaePDsR0[3] = (uintptr_t)pVM->pgm.s.apShwPaePDsR3[3]; 1431 # endif1432 # endif 1432 1433 pVM->pgm.s.pShwPaePdptR3 = (PX86PDPT)MMR3PageAllocLow(pVM); 1433 # ifndef VBOX_WITH_2X_4GB_ADDR_SPACE1434 # ifndef VBOX_WITH_2X_4GB_ADDR_SPACE 1434 1435 pVM->pgm.s.pShwPaePdptR0 = (uintptr_t)pVM->pgm.s.pShwPaePdptR3; 1435 #endif 1436 # endif 1437 #endif /* VBOX_WITH_PGMPOOL_PAGING_ONLY */ 1436 1438 pVM->pgm.s.pShwNestedRootR3 = MMR3PageAllocLow(pVM); 1437 1439 #ifndef VBOX_WITH_2X_4GB_ADDR_SPACE … … 1439 1441 #endif 1440 1442 1443 #ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY 1444 if (!pVM->pgm.s.pShwNestedRootR3) 1445 #else 1441 1446 if ( !pVM->pgm.s.pShw32BitPdR3 1442 1447 || !pVM->pgm.s.apShwPaePDsR3[0] … … 1446 1451 || !pVM->pgm.s.pShwPaePdptR3 1447 1452 || !pVM->pgm.s.pShwNestedRootR3) 1453 #endif 1448 1454 { 1449 1455 AssertMsgFailed(("Failed to allocate pages for the intermediate context!\n")); … … 1452 1458 1453 1459 /* get physical addresses. */ 1460 #ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY 1454 1461 pVM->pgm.s.HCPhysShw32BitPD = MMPage2Phys(pVM, pVM->pgm.s.pShw32BitPdR3); 1455 1462 Assert(MMPagePhys2Page(pVM, pVM->pgm.s.HCPhysShw32BitPD) == pVM->pgm.s.pShw32BitPdR3); … … 1459 1466 pVM->pgm.s.aHCPhysPaePDs[3] = MMPage2Phys(pVM, pVM->pgm.s.apShwPaePDsR3[3]); 1460 1467 pVM->pgm.s.HCPhysShwPaePdpt = MMPage2Phys(pVM, pVM->pgm.s.pShwPaePdptR3); 1468 #endif 1461 1469 pVM->pgm.s.HCPhysShwNestedRoot = MMPage2Phys(pVM, pVM->pgm.s.pShwNestedRootR3); 1462 1470 … … 1464 1472 * Initialize the pages, setting up the PML4 and PDPT for action below 4GB. 1465 1473 */ 1474 #ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY 1466 1475 ASMMemZero32(pVM->pgm.s.pShw32BitPdR3, PAGE_SIZE); 1467 1476 ASMMemZero32(pVM->pgm.s.pShwPaePdptR3, PAGE_SIZE); 1477 #endif 1468 1478 ASMMemZero32(pVM->pgm.s.pShwNestedRootR3, PAGE_SIZE); 1479 #ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY 1469 1480 for (unsigned i = 0; i < RT_ELEMENTS(pVM->pgm.s.apShwPaePDsR3); i++) 1470 1481 { … … 1475 1486 1476 1487 CPUMSetHyperCR3(pVM, (uint32_t)pVM->pgm.s.HCPhysShw32BitPD); 1488 #endif 1477 1489 1478 1490 /* … … 1515 1527 LogFlow(("pgmR3InitPaging: returns successfully\n")); 1516 1528 #if HC_ARCH_BITS == 64 1529 # ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY 1517 1530 LogRel(("Debug: HCPhysShw32BitPD=%RHp aHCPhysPaePDs={%RHp,%RHp,%RHp,%RHp} HCPhysShwPaePdpt=%RHp HCPhysShwPaePml4=%RHp\n", 1518 1531 pVM->pgm.s.HCPhysShw32BitPD, … … 1520 1533 pVM->pgm.s.HCPhysShwPaePdpt, 1521 1534 pVM->pgm.s.HCPhysShwPaePml4)); 1535 # endif 1522 1536 LogRel(("Debug: HCPhysInterPD=%RHp HCPhysInterPaePDPT=%RHp HCPhysInterPaePML4=%RHp\n", 1523 1537 pVM->pgm.s.HCPhysInterPD, pVM->pgm.s.HCPhysInterPaePDPT, pVM->pgm.s.HCPhysInterPaePML4)); … … 1772 1786 { 1773 1787 RTGCPTR GCPtr; 1788 int rc; 1789 1790 #ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY 1774 1791 /* 1775 1792 * Reserve space for mapping the paging pages into guest context. 1776 1793 */ 1777 intrc = MMR3HyperReserve(pVM, PAGE_SIZE * (2 + RT_ELEMENTS(pVM->pgm.s.apShwPaePDsR3) + 1 + 2 + 2), "Paging", &GCPtr);1794 rc = MMR3HyperReserve(pVM, PAGE_SIZE * (2 + RT_ELEMENTS(pVM->pgm.s.apShwPaePDsR3) + 1 + 2 + 2), "Paging", &GCPtr); 1778 1795 AssertRCReturn(rc, rc); 1779 1796 pVM->pgm.s.pShw32BitPdRC = GCPtr; 1780 1797 MMR3HyperReserve(pVM, PAGE_SIZE, "fence", NULL); 1798 #endif 1781 1799 1782 1800 /* … … 1811 1829 VMMR3DECL(int) PGMR3InitFinalize(PVM pVM) 1812 1830 { 1831 int rc; 1832 1833 #ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY 1813 1834 /* 1814 1835 * Map the paging pages into the guest context. … … 1817 1838 AssertReleaseReturn(GCPtr, VERR_INTERNAL_ERROR); 1818 1839 1819 intrc = PGMMap(pVM, GCPtr, pVM->pgm.s.HCPhysShw32BitPD, PAGE_SIZE, 0);1840 rc = PGMMap(pVM, GCPtr, pVM->pgm.s.HCPhysShw32BitPD, PAGE_SIZE, 0); 1820 1841 AssertRCReturn(rc, rc); 1821 1842 pVM->pgm.s.pShw32BitPdRC = GCPtr; … … 1841 1862 GCPtr += PAGE_SIZE; 1842 1863 GCPtr += PAGE_SIZE; /* reserved page */ 1843 1864 #endif 1844 1865 1845 1866 /* … … 1905 1926 /** @todo move this into shadow and guest specific relocation functions. */ 1906 1927 AssertMsg(pVM->pgm.s.pShw32BitPdR3, ("Init order, no relocation before paging is initialized!\n")); 1928 #ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY 1907 1929 pVM->pgm.s.pShw32BitPdRC += offDelta; 1930 #endif 1908 1931 pVM->pgm.s.pGst32BitPdRC += offDelta; 1909 1932 AssertCompile(RT_ELEMENTS(pVM->pgm.s.apShwPaePDsRC) == RT_ELEMENTS(pVM->pgm.s.apGstPaePDsRC)); 1910 1933 for (unsigned i = 0; i < RT_ELEMENTS(pVM->pgm.s.apShwPaePDsRC); i++) 1911 1934 { 1935 #ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY 1912 1936 pVM->pgm.s.apShwPaePDsRC[i] += offDelta; 1937 #endif 1913 1938 pVM->pgm.s.apGstPaePDsRC[i] += offDelta; 1914 1939 } 1915 1940 pVM->pgm.s.pGstPaePdptRC += offDelta; 1941 #ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY 1916 1942 pVM->pgm.s.pShwPaePdptRC += offDelta; 1943 #endif 1917 1944 1918 1945 pgmR3ModeDataInit(pVM, true /* resolve GC/R0 symbols */); … … 2965 2992 pVM->pgm.s.pfnR3GstModifyPage = pModeData->pfnR3GstModifyPage; 2966 2993 pVM->pgm.s.pfnR3GstGetPDE = pModeData->pfnR3GstGetPDE; 2994 #ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY 2967 2995 pVM->pgm.s.pfnR3GstMonitorCR3 = pModeData->pfnR3GstMonitorCR3; 2968 2996 pVM->pgm.s.pfnR3GstUnmonitorCR3 = pModeData->pfnR3GstUnmonitorCR3; 2997 #endif 2969 2998 pVM->pgm.s.pfnR3GstMapCR3 = pModeData->pfnR3GstMapCR3; 2970 2999 pVM->pgm.s.pfnR3GstUnmapCR3 = pModeData->pfnR3GstUnmapCR3; 3000 #ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY 2971 3001 pVM->pgm.s.pfnR3GstWriteHandlerCR3 = pModeData->pfnR3GstWriteHandlerCR3; 2972 3002 pVM->pgm.s.pszR3GstWriteHandlerCR3 = pModeData->pszR3GstWriteHandlerCR3; 2973 3003 pVM->pgm.s.pfnR3GstPAEWriteHandlerCR3 = pModeData->pfnR3GstPAEWriteHandlerCR3; 2974 3004 pVM->pgm.s.pszR3GstPAEWriteHandlerCR3 = pModeData->pszR3GstPAEWriteHandlerCR3; 2975 3005 #endif 2976 3006 pVM->pgm.s.pfnRCGstGetPage = pModeData->pfnRCGstGetPage; 2977 3007 pVM->pgm.s.pfnRCGstModifyPage = pModeData->pfnRCGstModifyPage; 2978 3008 pVM->pgm.s.pfnRCGstGetPDE = pModeData->pfnRCGstGetPDE; 3009 #ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY 2979 3010 pVM->pgm.s.pfnRCGstMonitorCR3 = pModeData->pfnRCGstMonitorCR3; 2980 3011 pVM->pgm.s.pfnRCGstUnmonitorCR3 = pModeData->pfnRCGstUnmonitorCR3; 3012 #endif 2981 3013 pVM->pgm.s.pfnRCGstMapCR3 = pModeData->pfnRCGstMapCR3; 2982 3014 pVM->pgm.s.pfnRCGstUnmapCR3 = pModeData->pfnRCGstUnmapCR3; 3015 #ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY 2983 3016 pVM->pgm.s.pfnRCGstWriteHandlerCR3 = pModeData->pfnRCGstWriteHandlerCR3; 2984 3017 pVM->pgm.s.pfnRCGstPAEWriteHandlerCR3 = pModeData->pfnRCGstPAEWriteHandlerCR3; 2985 3018 #endif 2986 3019 pVM->pgm.s.pfnR0GstGetPage = pModeData->pfnR0GstGetPage; 2987 3020 pVM->pgm.s.pfnR0GstModifyPage = pModeData->pfnR0GstModifyPage; 2988 3021 pVM->pgm.s.pfnR0GstGetPDE = pModeData->pfnR0GstGetPDE; 3022 #ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY 2989 3023 pVM->pgm.s.pfnR0GstMonitorCR3 = pModeData->pfnR0GstMonitorCR3; 2990 3024 pVM->pgm.s.pfnR0GstUnmonitorCR3 = pModeData->pfnR0GstUnmonitorCR3; 3025 #endif 2991 3026 pVM->pgm.s.pfnR0GstMapCR3 = pModeData->pfnR0GstMapCR3; 2992 3027 pVM->pgm.s.pfnR0GstUnmapCR3 = pModeData->pfnR0GstUnmapCR3; 3028 #ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY 2993 3029 pVM->pgm.s.pfnR0GstWriteHandlerCR3 = pModeData->pfnR0GstWriteHandlerCR3; 2994 3030 pVM->pgm.s.pfnR0GstPAEWriteHandlerCR3 = pModeData->pfnR0GstPAEWriteHandlerCR3; 2995 3031 #endif 2996 3032 2997 3033 /* both */
Note:
See TracChangeset
for help on using the changeset viewer.