Changeset 21649 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Jul 16, 2009 1:44:57 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 50182
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/HWACCM.cpp
r21645 r21649 1387 1387 * @returns VBox status code. 1388 1388 * @param pVM The VM to operate on. 1389 */ 1390 VMMR3DECL(int) HWACMMR3EnablePatching(PVM pVM) 1391 { 1389 * @param pPatchMem Patch memory range 1390 * @param cbPatchMem Size of the memory range 1391 */ 1392 VMMR3DECL(int) HWACMMR3EnablePatching(PVM pVM, RTGCPTR pPatchMem, unsigned cbPatchMem) 1393 { 1394 /* Current TPR patching only applies to AMD cpus. 1395 * May need to be extended to Intel CPUs without the APIC TPR hardware optimization. 1396 */ 1397 if (CPUMGetCPUVendor(pVM) != CPUMCPUVENDOR_AMD) 1398 return VERR_NOT_SUPPORTED; 1399 1400 pVM->hwaccm.s.pGuestPatchMem = pPatchMem; 1401 pVM->hwaccm.s.cbGuestPatchMem = cbPatchMem; 1392 1402 return VINF_SUCCESS; 1393 1403 } … … 1398 1408 * @returns VBox status code. 1399 1409 * @param pVM The VM to operate on. 1400 */ 1401 VMMR3DECL(int) HWACMMR3DisablePatching(PVM pVM) 1402 { 1410 * @param pPatchMem Patch memory range 1411 * @param cbPatchMem Size of the memory range 1412 */ 1413 VMMR3DECL(int) HWACMMR3DisablePatching(PVM pVM, RTGCPTR pPatchMem, unsigned cbPatchMem) 1414 { 1415 pVM->hwaccm.s.pGuestPatchMem = 0; 1416 pVM->hwaccm.s.cbGuestPatchMem = 0; 1403 1417 return VINF_SUCCESS; 1404 1418 } … … 1800 1814 AssertRCReturn(rc, rc); 1801 1815 } 1802 1816 #ifdef VBOX_HWACCM_WITH_GUEST_PATCHING 1817 rc = SSMR3PutGCPtr(pSSM, pVM->hwaccm.s.pGuestPatchMem); 1818 AssertRCReturn(rc, rc); 1819 rc = SSMR3PutGCPtr(pSSM, pVM->hwaccm.s.pFreeGuestPatchMem); 1820 AssertRCReturn(rc, rc); 1821 rc = SSMR3PutU32(pSSM, pVM->hwaccm.s.cbGuestPatchMem); 1822 AssertRCReturn(rc, rc); 1823 1824 /* Store all the guest patch records too. */ 1825 rc = SSMR3GetU32(pSSM, &pVM->hwaccm.s.svm.cPatches); 1826 AssertRCReturn(rc, rc); 1827 1828 for (unsigned i = 0; i < pVM->hwaccm.s.svm.cPatches; i++) 1829 { 1830 PHWACCMTPRPATCH pPatch = &pVM->hwaccm.s.svm.aPatches[i]; 1831 1832 rc = SSMR3PutU32(pSSM, pPatch->Core.Key); 1833 AssertRCReturn(rc, rc); 1834 1835 rc = SSMR3PutU32(pSSM, pPatch->cbOp); 1836 AssertRCReturn(rc, rc); 1837 1838 AssertCompile(sizeof(HWACCMTPRINSTR) == sizeof(uint32_t)); 1839 rc = SSMR3PutU32(pSSM, (uint32_t)&pPatch->enmType); 1840 AssertRCReturn(rc, rc); 1841 1842 rc = SSMR3PutU32(pSSM, pPatch->uSrcOperand); 1843 AssertRCReturn(rc, rc); 1844 1845 rc = SSMR3PutU32(pSSM, pPatch->uDstOperand); 1846 AssertRCReturn(rc, rc); 1847 1848 rc = SSMR3PutU32(pSSM, pPatch->pJumpTarget); 1849 AssertRCReturn(rc, rc); 1850 1851 rc = SSMR3PutU32(pSSM, pPatch->cFaults); 1852 AssertRCReturn(rc, rc); 1853 } 1854 #endif 1803 1855 return VINF_SUCCESS; 1804 1856 } … … 1822 1874 */ 1823 1875 if ( u32Version != HWACCM_SSM_VERSION 1876 && u32Version != HWACCM_SSM_VERSION_NO_PATCHING 1824 1877 && u32Version != HWACCM_SSM_VERSION_2_0_X) 1825 1878 { … … 1836 1889 AssertRCReturn(rc, rc); 1837 1890 1838 if (u32Version >= HWACCM_SSM_VERSION )1891 if (u32Version >= HWACCM_SSM_VERSION_NO_PATCHING) 1839 1892 { 1840 1893 uint32_t val; … … 1853 1906 } 1854 1907 } 1908 #ifdef VBOX_HWACCM_WITH_GUEST_PATCHING 1909 if (u32Version > HWACCM_SSM_VERSION_NO_PATCHING) 1910 { 1911 rc = SSMR3GetGCPtr(pSSM, &pVM->hwaccm.s.pGuestPatchMem); 1912 AssertRCReturn(rc, rc); 1913 rc = SSMR3GetGCPtr(pSSM, &pVM->hwaccm.s.pFreeGuestPatchMem); 1914 AssertRCReturn(rc, rc); 1915 rc = SSMR3GetU32(pSSM, &pVM->hwaccm.s.cbGuestPatchMem); 1916 AssertRCReturn(rc, rc); 1917 1918 /* Fetch all TPR patch records. */ 1919 rc = SSMR3GetU32(pSSM, &pVM->hwaccm.s.svm.cPatches); 1920 AssertRCReturn(rc, rc); 1921 1922 for (unsigned i = 0; i < pVM->hwaccm.s.svm.cPatches; i++) 1923 { 1924 PHWACCMTPRPATCH pPatch = &pVM->hwaccm.s.svm.aPatches[i]; 1925 1926 rc = SSMR3GetU32(pSSM, &pPatch->Core.Key); 1927 AssertRCReturn(rc, rc); 1928 1929 rc = SSMR3GetU32(pSSM, &pPatch->cbOp); 1930 AssertRCReturn(rc, rc); 1931 1932 AssertCompile(sizeof(HWACCMTPRINSTR) == sizeof(uint32_t)); 1933 rc = SSMR3GetU32(pSSM, (uint32_t *)&pPatch->enmType); 1934 AssertRCReturn(rc, rc); 1935 1936 rc = SSMR3GetU32(pSSM, &pPatch->uSrcOperand); 1937 AssertRCReturn(rc, rc); 1938 1939 rc = SSMR3GetU32(pSSM, &pPatch->uDstOperand); 1940 AssertRCReturn(rc, rc); 1941 1942 rc = SSMR3GetU32(pSSM, &pPatch->cFaults); 1943 AssertRCReturn(rc, rc); 1944 1945 rc = SSMR3GetU32(pSSM, &pPatch->pJumpTarget); 1946 AssertRCReturn(rc, rc); 1947 1948 rc = RTAvloU32Insert(&pVM->hwaccm.s.svm.PatchTree, &pPatch->Core); 1949 AssertRC(rc); 1950 } 1951 } 1952 #endif 1855 1953 return VINF_SUCCESS; 1856 1954 } -
trunk/src/VBox/VMM/HWACCMInternal.h
r21620 r21649 132 132 #define HWACCM_VTX_TOTAL_DEVHEAP_MEM (HWACCM_EPT_IDENTITY_PG_TABLE_SIZE + HWACCM_VTX_TSS_SIZE) 133 133 134 /* Enable for TPR guest patching. */ 135 //#define VBOX_HWACCM_WITH_GUEST_PATCHING 136 134 137 /** HWACCM SSM version 135 138 */ 139 #ifdef VBOX_HWACCM_WITH_GUEST_PATCHING 140 #define HWACCM_SSM_VERSION 5 141 #define HWACCM_SSM_VERSION_NO_PATCHING 4 142 #else 136 143 #define HWACCM_SSM_VERSION 4 144 #define HWACCM_SSM_VERSION_NO_PATCHING 4 145 #endif 137 146 #define HWACCM_SSM_VERSION_2_0_X 3 138 147 … … 188 197 HWACCMTPRINSTR_WRITE_REG, 189 198 HWACCMTPRINSTR_WRITE_IMM, 190 HWACCMTPRINSTR_ MOV,199 HWACCMTPRINSTR_JUMP_REPLACEMENT, 191 200 /** The usual 32-bit paranoia. */ 192 201 HWACCMTPRINSTR_32BIT_HACK = 0x7fffffff … … 209 218 /** Number of times the instruction caused a fault. */ 210 219 uint32_t cFaults; 220 /** Patch address of the jump replacement. */ 221 RTGCPTR32 pJumpTarget; 211 222 } HWACCMTPRPATCH; 212 223 /** Pointer to HWACCMTPRPATCH. */ … … 260 271 * This number is set much higher when RTThreadPreemptIsPending is reliable. */ 261 272 uint32_t cMaxResumeLoops; 273 274 /** Guest allocated memory for patching purposes. */ 275 RTGCPTR pGuestPatchMem; 276 /** Current free pointer inside the patch block. */ 277 RTGCPTR pFreeGuestPatchMem; 278 /** Size of the guest patch memory block. */ 279 uint32_t cbGuestPatchMem; 280 uint32_t uPadding1; 262 281 263 282 #if HC_ARCH_BITS == 32 && defined(VBOX_ENABLE_64_BITS_GUESTS) && !defined(VBOX_WITH_HYBRID_32BIT_KERNEL) … … 411 430 */ 412 431 AVLOU32TREE PatchTree; 413 414 432 uint32_t cPatches; 415 433 HWACCMTPRPATCH aPatches[64]; -
trunk/src/VBox/VMM/VMM.cpp
r21645 r21649 1315 1315 { 1316 1316 if (HWACCMIsEnabled(pVM)) 1317 HWACMMR3EnablePatching(pVM);1318 1319 return VERR_ ACCESS_DENIED;1317 return HWACMMR3EnablePatching(pVM, pPatchMem, cbPatchMem); 1318 1319 return VERR_NOT_SUPPORTED; 1320 1320 } 1321 1321 … … 1331 1331 { 1332 1332 if (HWACCMIsEnabled(pVM)) 1333 { 1334 int rc = HWACMMR3DisablePatching(pVM); 1335 if (VBOX_FAILURE(rc)) 1336 return rc; 1337 } 1333 return HWACMMR3DisablePatching(pVM, pPatchMem, cbPatchMem); 1338 1334 1339 1335 return VINF_SUCCESS; -
trunk/src/VBox/VMM/VMMAll/VMMAll.cpp
r19476 r21649 153 153 return pVM->vmm.s.enmSwitcher; 154 154 } 155 -
trunk/src/VBox/VMM/VMMR0/HWSVMR0.cpp
r21620 r21649 1737 1737 && pVM->hwaccm.s.fHasIoApic 1738 1738 && !(errCode & X86_TRAP_PF_P) /* not present */ 1739 && CPUMGetGuestCPL(pVCpu, CPUMCTX2CORE(pCtx)) == 01740 1739 && !CPUMIsGuestInLongModeEx(pCtx)) 1741 1740 { … … 1743 1742 PDMApicGetBase(pVM, &GCPhysApicBase); /* @todo cache this */ 1744 1743 GCPhysApicBase &= PAGE_BASE_GC_MASK; 1744 1745 Assert(CPUMGetGuestCPL(pVCpu, CPUMCTX2CORE(pCtx)) == 0); 1745 1746 1746 1747 if (uFaultAddress == GCPhysApicBase + 0x80)
Note:
See TracChangeset
for help on using the changeset viewer.