Changeset 45620 in vbox for trunk/src/VBox/VMM/VMMR3
- Timestamp:
- Apr 18, 2013 8:07:14 PM (12 years ago)
- Location:
- trunk/src/VBox/VMM/VMMR3
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/CSAM.cpp
r45485 r45620 27 27 #include <VBox/vmm/pgm.h> 28 28 #include <VBox/vmm/iom.h> 29 #include <VBox/sup.h>30 29 #include <VBox/vmm/mm.h> 31 30 #include <VBox/vmm/em.h> 31 #include <VBox/vmm/hm.h> 32 32 #ifdef VBOX_WITH_REM 33 33 # include <VBox/vmm/rem.h> … … 44 44 #include <VBox/vmm/vm.h> 45 45 #include <VBox/vmm/uvm.h> 46 46 47 #include <VBox/dbg.h> 48 #include <VBox/sup.h> 47 49 #include <VBox/err.h> 48 50 #include <VBox/log.h> 51 52 #include <VBox/dis.h> 53 #include <VBox/disopcode.h> 49 54 #include <iprt/assert.h> 50 55 #include <iprt/string.h> 51 #include <VBox/dis.h>52 #include <VBox/disopcode.h>53 56 #include "internal/pgm.h" 54 57 … … 69 72 static DECLCALLBACK(int) csamr3Save(PVM pVM, PSSMHANDLE pSSM); 70 73 static DECLCALLBACK(int) csamr3Load(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass); 74 static DECLCALLBACK(int) csamR3LoadDummy(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass); 71 75 static DECLCALLBACK(int) CSAMCodePageWriteHandler(PVM pVM, RTGCPTR GCPtr, void *pvPtr, void *pvBuf, size_t cbBuf, PGMACCESSTYPE enmAccessType, void *pvUser); 72 76 static DECLCALLBACK(int) CSAMCodePageInvalidate(PVM pVM, RTGCPTR GCPtr); … … 222 226 int rc; 223 227 228 /* 229 * We only need a saved state dummy loader if HM is enabled. 230 */ 231 if (HMIsEnabled(pVM)) 232 { 233 pVM->fCSAMEnabled = false; 234 return SSMR3RegisterInternal(pVM, "CSAM", 0, CSAM_SSM_VERSION, 0, 235 NULL, NULL, NULL, 236 NULL, NULL, NULL, 237 NULL, csamR3LoadDummy, NULL); 238 } 239 240 /* 241 * Raw-mode. 242 */ 224 243 LogFlow(("CSAMR3Init\n")); 225 244 … … 329 348 AssertRelease(!(RT_OFFSETOF(VM, csam.s) & 31)); 330 349 AssertRelease(sizeof(pVM->csam.s) <= sizeof(pVM->csam.padding)); 350 AssertRelease(!HMIsEnabled(pVM)); 331 351 332 352 /* … … 368 388 VMMR3_INT_DECL(void) CSAMR3Relocate(PVM pVM, RTGCINTPTR offDelta) 369 389 { 370 if (offDelta )390 if (offDelta && !HMIsEnabled(pVM)) 371 391 { 372 392 /* Adjust pgdir and page bitmap pointers. */ … … 396 416 VMMR3_INT_DECL(int) CSAMR3Term(PVM pVM) 397 417 { 418 if (HMIsEnabled(pVM)) 419 return VINF_SUCCESS; 420 398 421 int rc; 399 422 … … 421 444 VMMR3_INT_DECL(int) CSAMR3Reset(PVM pVM) 422 445 { 446 if (HMIsEnabled(pVM)) 447 return VINF_SUCCESS; 448 423 449 /* Clear page bitmaps. */ 424 for (int i=0;i<CSAM_PGDIRBMP_CHUNKS;i++)450 for (int i = 0; i < CSAM_PGDIRBMP_CHUNKS; i++) 425 451 { 426 452 if (pVM->csam.s.pPDBitmapHC[i]) … … 432 458 433 459 /* Remove all CSAM page records. */ 434 while(true)460 for (;;) 435 461 { 436 462 PCSAMPAGEREC pPageRec = (PCSAMPAGEREC)RTAvlPVGetBestFit(&pVM->csam.s.pPageTree, 0, true); 437 if (pPageRec) 438 { 439 csamRemovePageRecord(pVM, pPageRec->page.pPageGC); 440 } 441 else 463 if (!pPageRec) 442 464 break; 465 csamRemovePageRecord(pVM, pPageRec->page.pPageGC); 443 466 } 444 467 Assert(!pVM->csam.s.pPageTree); … … 544 567 return VINF_SUCCESS; 545 568 } 569 570 571 /** 572 * @callback_method_impl{FNSSMINTLOADEXEC, Dummy load function for HM mode.} 573 */ 574 DECLCALLBACK(int) csamR3LoadDummy(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass) 575 { 576 return SSMR3SkipToEndOfUnit(pSSM); 577 } 578 546 579 547 580 /** … … 1621 1654 if (!CSAMIsEnabled(pVM)) 1622 1655 return VINF_SUCCESS; 1656 Assert(!HMIsEnabled(pVM)); 1623 1657 1624 1658 PVMCPU pVCpu = VMMGetCpu0(pVM); … … 1737 1771 PCSAMPAGEREC pPageRec; 1738 1772 int rc; 1773 1774 AssertReturn(!HMIsEnabled(pVM), VERR_CSAM_HM_IPE); 1739 1775 1740 1776 addr = addr & PAGE_BASE_GC_MASK; … … 1914 1950 bool fMonitorInvalidation; 1915 1951 Assert(pVM->cCpus == 1); 1916 PVMCPU pVCpu = VMMGetCpu0(pVM); 1952 PVMCPU pVCpu = VMMGetCpu0(pVM); 1953 Assert(!HMIsEnabled(pVM)); 1917 1954 1918 1955 /* Dirty pages must be handled before calling this function!. */ … … 2034 2071 VMMR3DECL(int) CSAMR3UnmonitorPage(PVM pVM, RTRCPTR pPageAddrGC, CSAMTAG enmTag) 2035 2072 { 2073 Assert(!HMIsEnabled(pVM)); 2074 2036 2075 pPageAddrGC &= PAGE_BASE_GC_MASK; 2037 2076 … … 2295 2334 Assert(!fScanned); /* other case not implemented. */ 2296 2335 Assert(!PATMIsPatchGCAddr(pVM, pInstr)); 2336 Assert(!HMIsEnabled(pVM)); 2297 2337 2298 2338 if (csamIsCodeScanned(pVM, pInstr, &pPage) == false) … … 2318 2358 VMMR3_INT_DECL(int) CSAMR3CheckCodeEx(PVM pVM, PCPUMCTXCORE pCtxCore, RTRCPTR pInstrGC) 2319 2359 { 2360 Assert(!HMIsEnabled(pVM)); 2320 2361 if (EMIsRawRing0Enabled(pVM) == false || PATMIsPatchGCAddr(pVM, pInstrGC) == true) 2321 2362 { … … 2346 2387 int rc; 2347 2388 PCSAMPAGE pPage = NULL; 2389 Assert(!HMIsEnabled(pVM)); 2348 2390 2349 2391 if ( EMIsRawRing0Enabled(pVM) == false … … 2463 2505 VMMR3_INT_DECL(int) CSAMR3DoPendingAction(PVM pVM, PVMCPU pVCpu) 2464 2506 { 2507 AssertReturn(!HMIsEnabled(pVM), VERR_CSAM_HM_IPE); 2508 2465 2509 csamR3FlushDirtyPages(pVM); 2466 2510 csamR3FlushCodePages(pVM); … … 2491 2535 int rc; 2492 2536 2537 AssertReturn(!HMIsEnabled(pVM), VERR_CSAM_HM_IPE); 2493 2538 if (EMIsRawRing0Enabled(pVM) == false) 2494 2539 { … … 2698 2743 VMMR3DECL(int) CSAMR3RecordCallAddress(PVM pVM, RTRCPTR GCPtrCall) 2699 2744 { 2745 Assert(!HMIsEnabled(pVM)); 2700 2746 for (unsigned i=0;i<RT_ELEMENTS(pVM->csam.s.pvCallInstruction);i++) 2701 2747 { … … 2741 2787 PVM pVM = pUVM->pVM; 2742 2788 VM_ASSERT_VALID_EXT_RETURN(pVM, VERR_INVALID_VM_HANDLE); 2789 2790 if (HMIsEnabled(pVM)) 2791 { 2792 Assert(!pVM->fCSAMEnabled); 2793 return VINF_SUCCESS; 2794 } 2743 2795 2744 2796 int rc; … … 2761 2813 NOREF(cArgs); NOREF(paArgs); 2762 2814 2815 if (HMR3IsEnabled(pUVM)) 2816 return DBGCCmdHlpPrintf(pCmdHlp, "CSAM is permanently disabled by HM.\n"); 2817 2763 2818 int rc = CSAMR3SetScanningEnabled(pUVM, false); 2764 2819 if (RT_FAILURE(rc)) … … 2775 2830 NOREF(cArgs); NOREF(paArgs); 2776 2831 2832 if (HMR3IsEnabled(pUVM)) 2833 return DBGCCmdHlpPrintf(pCmdHlp, "CSAM is permanently disabled by HM.\n"); 2834 2777 2835 int rc = CSAMR3SetScanningEnabled(pUVM, true); 2778 2836 if (RT_FAILURE(rc)) -
trunk/src/VBox/VMM/VMMR3/EM.cpp
r45533 r45620 164 164 pVCpu->em.s.pCtx = CPUMQueryGuestCtxPtr(pVCpu); 165 165 #ifdef VBOX_WITH_RAW_MODE 166 pVCpu->em.s.pPatmGCState = PATMR3QueryGCStateHC(pVM); 167 AssertMsg(pVCpu->em.s.pPatmGCState, ("PATMR3QueryGCStateHC failed!\n")); 166 if (!HMIsEnabled(pVM)) 167 { 168 pVCpu->em.s.pPatmGCState = PATMR3QueryGCStateHC(pVM); 169 AssertMsg(pVCpu->em.s.pPatmGCState, ("PATMR3QueryGCStateHC failed!\n")); 170 } 168 171 #endif 169 172 -
trunk/src/VBox/VMM/VMMR3/PATM.cpp
r45485 r45620 30 30 #include <VBox/vmm/mm.h> 31 31 #include <VBox/vmm/em.h> 32 #include <VBox/vmm/hm.h> 32 33 #include <VBox/vmm/ssm.h> 33 34 #include <VBox/vmm/trpm.h> … … 139 140 int rc; 140 141 142 /* 143 * We only need a saved state dummy loader if HM is enabled. 144 */ 145 if (HMIsEnabled(pVM)) 146 { 147 pVM->fPATMEnabled = false; 148 return SSMR3RegisterInternal(pVM, "PATM", 0, PATM_SSM_VERSION, 0, 149 NULL, NULL, NULL, 150 NULL, NULL, NULL, 151 NULL, patmR3LoadDummy, NULL); 152 } 153 154 /* 155 * Raw-mode. 156 */ 141 157 Log(("PATMR3Init: Patch record size %d\n", sizeof(PATCHINFO))); 142 158 … … 313 329 VMMR3_INT_DECL(int) PATMR3InitFinalize(PVM pVM) 314 330 { 331 if (HMIsEnabled(pVM)) 332 return VINF_SUCCESS; 333 315 334 /* The GC state, stack and statistics must be read/write for the guest (supervisor only of course). */ 316 335 int rc = PGMMapSetPage(pVM, pVM->patm.s.pGCStateGC, PAGE_SIZE, X86_PTE_P | X86_PTE_A | X86_PTE_D | X86_PTE_RW); … … 443 462 VMMR3_INT_DECL(void) PATMR3Relocate(PVM pVM) 444 463 { 464 if (HMIsEnabled(pVM)) 465 return; 466 445 467 RTRCPTR GCPtrNew = MMHyperR3ToRC(pVM, pVM->patm.s.pGCStateHC); 446 468 RTRCINTPTR delta = GCPtrNew - pVM->patm.s.pGCStateGC; … … 498 520 VMMR3_INT_DECL(int) PATMR3Term(PVM pVM) 499 521 { 522 if (HMIsEnabled(pVM)) 523 return VINF_SUCCESS; 524 500 525 /* Memory was all allocated from the two MM heaps and requires no freeing. */ 501 NOREF(pVM);502 526 return VINF_SUCCESS; 503 527 } … … 513 537 { 514 538 Log(("PATMR3Reset\n")); 539 if (HMIsEnabled(pVM)) 540 return VINF_SUCCESS; 515 541 516 542 /* Free all patches. */ 517 while (true)543 for (;;) 518 544 { 519 545 PPATMPATCHREC pPatchRec = (PPATMPATCHREC)RTAvloU32RemoveBestFit(&pVM->patm.s.PatchLookupTreeHC->PatchTree, 0, true); … … 972 998 VMMR3_INT_DECL(void *) PATMR3QueryPatchMemHC(PVM pVM, uint32_t *pcb) 973 999 { 1000 AssertReturn(!HMIsEnabled(pVM), NULL); 974 1001 if (pcb) 975 1002 *pcb = pVM->patm.s.cbPatchMem; 976 977 1003 return pVM->patm.s.pPatchMemHC; 978 1004 } … … 988 1014 VMMR3_INT_DECL(RTRCPTR) PATMR3QueryPatchMemGC(PVM pVM, uint32_t *pcb) 989 1015 { 1016 AssertReturn(!HMIsEnabled(pVM), NIL_RTRCPTR); 990 1017 if (pcb) 991 1018 *pcb = pVM->patm.s.cbPatchMem; 992 993 1019 return pVM->patm.s.pPatchMemGC; 994 1020 } … … 1004 1030 VMMR3_INT_DECL(PPATMGCSTATE) PATMR3QueryGCStateHC(PVM pVM) 1005 1031 { 1032 AssertReturn(!HMIsEnabled(pVM), NULL); 1006 1033 return pVM->patm.s.pGCStateHC; 1007 1034 } … … 1037 1064 VM_ASSERT_VALID_EXT_RETURN(pVM, VERR_INVALID_VM_HANDLE); 1038 1065 1039 pVM->fPATMEnabled = fAllowPatching; 1066 if (!HMIsEnabled(pVM)) 1067 pVM->fPATMEnabled = fAllowPatching; 1068 else 1069 Assert(!pVM->fPATMEnabled); 1040 1070 return VINF_SUCCESS; 1041 1071 } … … 1066 1096 VMMR3_INT_DECL(void *) PATMR3GCPtrToHCPtr(PVM pVM, RTRCPTR pAddrGC) 1067 1097 { 1098 AssertReturn(!HMIsEnabled(pVM), NULL); 1068 1099 if (pVM->patm.s.pPatchMemGC <= pAddrGC && pVM->patm.s.pPatchMemGC + pVM->patm.s.cbPatchMem > pAddrGC) 1069 1100 return pVM->patm.s.pPatchMemHC + (pAddrGC - pVM->patm.s.pPatchMemGC); … … 1119 1150 1120 1151 1121 /* Calculates and fills in all branch targets 1152 /** 1153 * Calculates and fills in all branch targets 1122 1154 * 1123 1155 * @returns VBox status code. … … 1215 1247 } 1216 1248 1217 /* Add an illegal instruction record 1249 /** 1250 * Add an illegal instruction record 1218 1251 * 1219 1252 * @param pVM Pointer to the VM. … … 1256 1289 * @param fDirty Dirty flag 1257 1290 * 1258 */ 1259 /** @note Be extremely careful with this function. Make absolutely sure the guest address is correct! (to avoid executing instructions twice!) */ 1291 * @note Be extremely careful with this function. Make absolutely sure the guest 1292 * address is correct! (to avoid executing instructions twice!) 1293 */ 1260 1294 void patmR3AddP2GLookupRecord(PVM pVM, PPATCHINFO pPatch, uint8_t *pPatchInstrHC, RTRCPTR pInstrGC, PATM_LOOKUP_TYPE enmType, bool fDirty) 1261 1295 { … … 2118 2152 #ifdef LOG_ENABLED 2119 2153 2120 /* Add a disasm jump record (temporary for prevent duplicate analysis) 2154 /** 2155 * Add a disasm jump record (temporary for prevent duplicate analysis) 2121 2156 * 2122 2157 * @param pVM Pointer to the VM. … … 2375 2410 VMMR3_INT_DECL(int) PATMR3DetectConflict(PVM pVM, RTRCPTR pInstrGC, RTRCPTR pConflictGC) 2376 2411 { 2412 AssertReturn(!HMIsEnabled(pVM), VERR_PATCH_NO_CONFLICT); 2377 2413 PPATCHINFO pTargetPatch = patmFindActivePatchByEntrypoint(pVM, pConflictGC, true /* include patch hints */); 2378 2414 if (pTargetPatch) 2379 {2380 2415 return patmDisableUnusablePatch(pVM, pInstrGC, pConflictGC, pTargetPatch); 2381 }2382 2416 return VERR_PATCH_NO_CONFLICT; 2383 2417 } … … 3531 3565 int rc; 3532 3566 RTRCPTR pPatchTargetGC = 0; 3567 AssertReturn(!HMIsEnabled(pVM), VERR_PATM_HM_IPE); 3533 3568 3534 3569 pBranchTarget = pCtx->edx; … … 4079 4114 PVMCPU pVCpu = VMMGetCpu0(pVM); 4080 4115 LogFlow(("PATMR3InstallPatch: %08x (%#llx)\n", pInstrGC, flags)); 4116 4117 AssertReturn(!HMIsEnabled(pVM), VERR_PATM_HM_IPE); 4081 4118 4082 4119 if ( !pVM … … 4849 4886 4850 4887 Assert(VM_IS_EMT(pVM)); 4888 AssertReturn(!HMIsEnabled(pVM), VERR_PATM_HM_IPE); 4851 4889 4852 4890 /* Quick boundary check */ … … 5013 5051 * @param pVM Pointer to the VM. 5014 5052 * @param addr GC address of the page to flush 5015 * /5016 /** @note Currently only called by CSAMR3FlushPage; optimization to avoidhaving to double check if the physical address has changed5053 * @note Currently only called by CSAMR3FlushPage; optimization to avoid 5054 * having to double check if the physical address has changed 5017 5055 */ 5018 5056 VMMR3_INT_DECL(int) PATMR3FlushPage(PVM pVM, RTRCPTR addr) 5019 5057 { 5058 AssertReturn(!HMIsEnabled(pVM), VERR_PATM_HM_IPE); 5059 5020 5060 addr &= PAGE_BASE_GC_MASK; 5021 5061 … … 5050 5090 VMMR3_INT_DECL(bool) PATMR3HasBeenPatched(PVM pVM, RTRCPTR pInstrGC) 5051 5091 { 5092 Assert(!HMIsEnabled(pVM)); 5052 5093 PPATMPATCHREC pPatchRec; 5053 5094 pPatchRec = (PPATMPATCHREC)RTAvloU32Get(&pVM->patm.s.PatchLookupTreeHC->PatchTree, pInstrGC); … … 5073 5114 5074 5115 /* Shortcut. */ 5075 if ( !PATMIsEnabled(pVM) 5076 || pInstrGC < pVM->patm.s.pPatchedInstrGCLowest 5077 || pInstrGC > pVM->patm.s.pPatchedInstrGCHighest) 5078 { 5116 if (!PATMIsEnabled(pVM)) 5079 5117 return VERR_PATCH_NOT_FOUND; 5080 } 5118 Assert(!HMIsEnabled(pVM)); 5119 if ( pInstrGC < pVM->patm.s.pPatchedInstrGCLowest 5120 || pInstrGC > pVM->patm.s.pPatchedInstrGCHighest) 5121 return VERR_PATCH_NOT_FOUND; 5081 5122 5082 5123 pPatchRec = (PPATMPATCHREC)RTAvloU32GetBestFit(&pVM->patm.s.PatchLookupTreeHC->PatchTree, pInstrGC, false); … … 5114 5155 { 5115 5156 /* Shortcut. */ 5116 if ( !PATMIsEnabled(pVM) 5117 || GCPtrInstr < pVM->patm.s.pPatchedInstrGCLowest 5157 if (!PATMIsEnabled(pVM)) 5158 return VERR_PATCH_NOT_FOUND; 5159 Assert(!HMIsEnabled(pVM)); 5160 if ( GCPtrInstr < pVM->patm.s.pPatchedInstrGCLowest 5118 5161 || GCPtrInstr > pVM->patm.s.pPatchedInstrGCHighest) 5119 5162 return VERR_PATCH_NOT_FOUND; … … 5174 5217 5175 5218 Log(("PATMR3DisablePatch: %RRv\n", pInstrGC)); 5219 AssertReturn(!HMIsEnabled(pVM), VERR_PATM_HM_IPE); 5176 5220 pPatchRec = (PPATMPATCHREC)RTAvloU32Get(&pVM->patm.s.PatchLookupTreeHC->PatchTree, pInstrGC); 5177 5221 if (pPatchRec) … … 5420 5464 5421 5465 Log(("PATMR3EnablePatch %RRv\n", pInstrGC)); 5466 AssertReturn(!HMIsEnabled(pVM), VERR_PATM_HM_IPE); 5422 5467 pPatchRec = (PPATMPATCHREC)RTAvloU32Get(&pVM->patm.s.PatchLookupTreeHC->PatchTree, pInstrGC); 5423 5468 if (pPatchRec) … … 5863 5908 PPATCHINFO pPatch; 5864 5909 5910 Assert(!HMIsEnabled(pVM)); 5865 5911 if (PATMIsEnabled(pVM) == false) 5866 5912 return false; … … 5892 5938 PPATMPATCHREC pPatchRec; 5893 5939 5940 AssertReturn(!HMIsEnabled(pVM), VERR_PATM_HM_IPE); 5894 5941 pPatchRec = (PPATMPATCHREC)RTAvloU32Get(&pVM->patm.s.PatchLookupTreeHC->PatchTree, pInstrGC); 5895 5942 if (pPatchRec) … … 5966 6013 } 5967 6014 5968 /* Converts Guest code GC ptr to Patch code GC ptr (if found) 6015 /** 6016 * Converts Guest code GC ptr to Patch code GC ptr (if found) 5969 6017 * 5970 6018 * @returns corresponding GC pointer in patch block … … 6035 6083 6036 6084 Assert(PATMIsPatchGCAddr(pVM, pPatchGC)); 6085 Assert(!HMIsEnabled(pVM)); 6037 6086 pvPatchCoreOffset = RTAvloU32GetBestFit(&pVM->patm.s.PatchLookupTreeHC->PatchTreeByPatchAddr, pPatchGC - pVM->patm.s.pPatchMemGC, false); 6038 6087 if (pvPatchCoreOffset == 0) … … 6097 6146 { 6098 6147 PPATMPATCHREC pPatchRec; 6148 6149 Assert(!HMIsEnabled(pVM)); 6099 6150 6100 6151 /* Find the patch record. */ … … 6352 6403 PVMCPU pVCpu = VMMGetCpu0(pVM); 6353 6404 6405 AssertReturn(!HMIsEnabled(pVM), VERR_PATM_HM_IPE); 6354 6406 Assert(pVM->cCpus == 1); 6355 6407 … … 6636 6688 VMMR3_INT_DECL(int) PATMR3HandleMonitoredPage(PVM pVM) 6637 6689 { 6690 AssertReturn(!HMIsEnabled(pVM), VERR_PATM_HM_IPE); 6691 6638 6692 RTRCPTR addr = pVM->patm.s.pvFaultMonitor; 6639 6640 6693 addr &= PAGE_BASE_GC_MASK; 6641 6694 … … 6808 6861 VM_ASSERT_VALID_EXT_RETURN(pVM, VERR_INVALID_VM_HANDLE); 6809 6862 6863 if (HMIsEnabled(pVM)) 6864 return DBGCCmdHlpPrintf(pCmdHlp, "PATM is permanently disabled by HM.\n"); 6865 6810 6866 RTAvloU32DoWithAll(&pVM->patm.s.PatchLookupTreeHC->PatchTree, true, DisableAllPatches, pVM); 6811 6867 PATMR3AllowPatching(pVM->pUVM, false); … … 6833 6889 VM_ASSERT_VALID_EXT_RETURN(pVM, VERR_INVALID_VM_HANDLE); 6834 6890 6891 if (HMIsEnabled(pVM)) 6892 return DBGCCmdHlpPrintf(pCmdHlp, "PATM is permanently disabled by HM.\n"); 6893 6835 6894 PATMR3AllowPatching(pVM->pUVM, true); 6836 6895 RTAvloU32DoWithAll(&pVM->patm.s.PatchLookupTreeHC->PatchTree, true, EnableAllPatches, pVM); -
trunk/src/VBox/VMM/VMMR3/PATMSSM.cpp
r45276 r45620 693 693 } 694 694 695 696 /** 697 * @callback_method_impl{FNSSMINTLOADEXEC, Dummy load function for HM mode.} 698 */ 699 DECLCALLBACK(int) patmR3LoadDummy(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass) 700 { 701 return SSMR3SkipToEndOfUnit(pSSM); 702 } 703 704 695 705 /** 696 706 * Execute state load operation.
Note:
See TracChangeset
for help on using the changeset viewer.